Skip to content

详细设计毕业生表

1. 需求分析

功能需求

  • 存储毕业生信息:包括基本信息(如姓名、学号)、学历信息、联系方式等。
  • 支持查询:按学号、姓名、毕业年份等快速检索。
  • 数据隔离:适应大数据场景,支持按时间、地域或学校分库分表。
  • 历史追溯:记录创建时间、更新时间,便于审计和分片。
  • 扩展性:支持后续字段增加(如就业状态)。

非功能需求

  • 性能:高并发查询和插入。
  • 可扩展性:字段设计灵活,适应分库分表。
  • 一致性:主键唯一,数据完整。

使用场景

  • 毕业生管理系统:学校查询毕业生信息。
  • 数据分析:统计某年毕业生人数。
  • 分库分表:按毕业年份或学校隔离数据。

2. 字段设计

以下字段设计考虑大数据隔离和通用性:

字段名 类型 长度 允许空 默认值 描述 索引
id BIGINT 20 主键,自增唯一标识 主键
student_id VARCHAR 20 学号,业务唯一标识 唯一索引
name VARCHAR 50 姓名 普通索引
gender TINYINT 1 0 性别(0:未知,1:男,2:女)
birthday DATE - NULL 出生日期
school_id BIGINT 20 学校 ID,外键关联学校表 普通索引
major VARCHAR 100 NULL 专业
degree VARCHAR 50 NULL 学位(如本科、硕士)
graduation_year INT 11 毕业年份(如 2023) 普通索引
phone VARCHAR 20 NULL 手机号
email VARCHAR 100 NULL 邮箱
create_time DATETIME - CURRENT_TIMESTAMP 创建时间,用于分片 普通索引
update_time DATETIME - NULL 更新时间
is_deleted TINYINT 1 0 逻辑删除(0:未删,1:已删)

设计说明

  • 主键 id:自增 BIGINT,适应大数据量。
  • 业务键 student_id:学号作为唯一标识,支持业务查询。
  • 索引
  • student_id:唯一索引,快速定位。
  • namegraduation_yearschool_idcreate_time:普通索引,支持常见查询。
  • 大数据隔离
  • create_time:按时间分库分表(如按年)。
  • school_id:按学校分库。
  • graduation_year:按毕业年份分表。
  • 扩展性
  • 可加字段如 job_status(就业状态)。
  • 逻辑删除
  • is_deleted 避免物理删除,便于恢复。

依赖

  • 学校表(schools)
  • 字段:id (BIGINT, 主键), name (VARCHAR(100)), create_time (DATETIME)。
  • 外键:graduate.school_id -> schools.id

3. 建表 SQL

CREATE TABLE `graduate` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键,自增ID',
    `student_id` VARCHAR(20) NOT NULL COMMENT '学号,业务唯一标识',
    `name` VARCHAR(50) NOT NULL COMMENT '姓名',
    `gender` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '性别(0:未知,1:男,2:女)',
    `birthday` DATE DEFAULT NULL COMMENT '出生日期',
    `school_id` BIGINT(20) NOT NULL COMMENT '学校ID,外键关联schools表',
    `major` VARCHAR(100) DEFAULT NULL COMMENT '专业',
    `degree` VARCHAR(50) DEFAULT NULL COMMENT '学位',
    `graduation_year` INT(11) NOT NULL COMMENT '毕业年份',
    `phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号',
    `email` VARCHAR(100) DEFAULT NULL COMMENT '邮箱',
    `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    `is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除(0:未删,1:已删)',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_student_id` (`student_id`),
    INDEX `idx_name` (`name`),
    INDEX `idx_school_id` (`school_id`),
    INDEX `idx_graduation_year` (`graduation_year`),
    INDEX `idx_create_time` (`create_time`),
    CONSTRAINT `fk_school_id` FOREIGN KEY (`school_id`) REFERENCES `schools` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '毕业生表';

说明

  • ENGINE=InnoDB:支持事务和外键,适合业务表。
  • CHARSET=utf8mb4:支持中文和 emoji。
  • 索引:覆盖常见查询场景。
  • 外键:关联学校表(可根据性能移除)。

4. 大数据隔离设计

分库分表策略

  1. 按时间分库
  2. 规则:create_time 年份分库(如 graduate_2023)。
  3. 实现:中间件(如 MyCat、ShardingSphere)。
  4. 按学校分库
  5. 规则:school_id 取模(如 graduate_db_%(school_id % 4))。
  6. 按年份分表
  7. 规则:graduation_year 分表(如 graduate_2023)。

示例分表 SQL

CREATE TABLE `graduate_2023` (
    -- 同上字段定义
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_student_id` (`student_id`),
    INDEX `idx_name` (`name`),
    INDEX `idx_school_id` (`school_id`),
    INDEX `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '2023年毕业生表';

路由逻辑

String dbName = "graduate_db_" + (schoolId % 4);
String tableName = "graduate_" + graduationYear;

5. 延伸与面试角度

  • 性能优化
  • 索引:覆盖查询,避免全表扫描。
  • 分区:按 create_time 分区(MySQL Partition)。
  • 扩展性
  • 加字段:如 address (VARCHAR(200))。
  • 加表:如 employment 表记录就业信息。
  • 一致性
  • 分布式 ID:用雪花算法替代自增 ID。
  • 面试点
  • 问“设计”时,提字段和索引。
  • 问“大数据”时,提分库分表。

总结

毕业生表通过 id 主键、student_id 业务键、create_time 等字段设计,支持大数据隔离和高效查询。索引优化查询,分库分表适配扩展,SQL 清晰规范。面试时,可画 ER 图或提分片策略,展示设计能力。