在教育信息化系统中,学生身份数据库(SchoolIDB)是最核心的基础数据存储模块。最近在重构某中学的教务管理系统时,我需要为SchoolIDB设计四个关键表的DDL结构。这些表需要满足以下核心需求:
sql复制CREATE TABLE student_info (
student_id VARCHAR(12) PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender CHAR(1) CHECK (gender IN ('M', 'F')),
birth_date DATE,
id_card VARCHAR(18) UNIQUE,
enrollment_date DATE NOT NULL,
graduation_date DATE,
class_id VARCHAR(10) NOT NULL,
status TINYINT DEFAULT 1 COMMENT '1-在读 2-休学 3-退学 4-毕业',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_class_id (class_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
设计要点:
sql复制CREATE TABLE class_info (
class_id VARCHAR(10) PRIMARY KEY,
class_name VARCHAR(50) NOT NULL,
grade TINYINT NOT NULL COMMENT '年级,如1表示一年级',
head_teacher VARCHAR(50),
department_id VARCHAR(6) NOT NULL,
student_count INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_department (department_id),
INDEX idx_grade (grade)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键设计:
sql复制CREATE TABLE course_score (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
student_id VARCHAR(12) NOT NULL,
course_id VARCHAR(8) NOT NULL,
semester VARCHAR(10) NOT NULL COMMENT '格式:YYYY-S,如2023-1表示2023学年第一学期',
regular_score DECIMAL(5,2) COMMENT '平时成绩',
exam_score DECIMAL(5,2) COMMENT '考试成绩',
final_score DECIMAL(5,2) NOT NULL,
credit TINYINT NOT NULL,
teacher_id VARCHAR(10),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_student_course (student_id, course_id, semester),
INDEX idx_course (course_id),
INDEX idx_semester (semester),
CONSTRAINT fk_student FOREIGN KEY (student_id) REFERENCES student_info (student_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
核心考虑:
sql复制CREATE TABLE attendance_record (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
student_id VARCHAR(12) NOT NULL,
record_date DATE NOT NULL,
period TINYINT NOT NULL COMMENT '1-上午 2-下午 3-晚上',
status TINYINT NOT NULL COMMENT '1-正常 2-迟到 3-早退 4-缺勤 5-请假',
remark VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_student_date (student_id, record_date),
INDEX idx_date_status (record_date, status),
CONSTRAINT fk_attendance_student FOREIGN KEY (student_id) REFERENCES student_info (student_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
设计特点:
当单表数据量超过500万行时,考虑以下分表方案:
对于历史数据可以采用以下策略:
sql复制-- 创建归档表
CREATE TABLE course_score_history LIKE course_score;
-- 迁移历史数据
INSERT INTO course_score_history
SELECT * FROM course_score
WHERE semester < '2020-1';
-- 删除已归档数据
DELETE FROM course_score
WHERE semester < '2020-1';
字符集问题:
时间字段处理:
外键性能优化:
建议添加数据字典表维护系统常量:
sql复制CREATE TABLE system_code (
code_type VARCHAR(30) NOT NULL,
code_value VARCHAR(30) NOT NULL,
code_name VARCHAR(100) NOT NULL,
sort_order INT DEFAULT 0,
PRIMARY KEY (code_type, code_value)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
使用Flyway或Liquibase管理DDL变更:
sql复制-- 版本记录表
CREATE TABLE schema_version (
version_rank INT NOT NULL,
installed_rank INT NOT NULL,
version VARCHAR(50) NOT NULL,
description VARCHAR(200) NOT NULL,
type VARCHAR(20) NOT NULL,
script VARCHAR(200) NOT NULL,
checksum INT,
installed_by VARCHAR(100) NOT NULL,
installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
execution_time INT NOT NULL,
success BOOLEAN NOT NULL,
PRIMARY KEY (version)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
记录关键数据变更:
sql复制CREATE TABLE audit_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
table_name VARCHAR(50) NOT NULL,
record_id VARCHAR(50) NOT NULL,
operation ENUM('INSERT','UPDATE','DELETE') NOT NULL,
old_value JSON,
new_value JSON,
operator VARCHAR(50),
operation_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_table_record (table_name, record_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;