详细设计毕业生表
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
:唯一索引,快速定位。name
、graduation_year
、school_id
、create_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. 大数据隔离设计
分库分表策略
- 按时间分库:
- 规则:
create_time
年份分库(如graduate_2023
)。 - 实现:中间件(如 MyCat、ShardingSphere)。
- 按学校分库:
- 规则:
school_id
取模(如graduate_db_%(school_id % 4)
)。 - 按年份分表:
- 规则:
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 图或提分片策略,展示设计能力。