按「年級-班級-課程」建立大量分表存儲成績,導致:
將「業務維度」映射為「物理表」:
年級、班級、課程是查詢維度/屬性,而非數據分片依據。
-- 核心表
CREATE TABLE student (
id BIGINT PRIMARY KEY,
name VARCHAR(50),
grade_id INT, -- 年級外鍵
class_id INT, -- 班級外鍵
status TINYINT -- 在籍/休學/畢業
);
CREATE TABLE course (
id INT PRIMARY KEY,
name VARCHAR(100),
credit DECIMAL(3,1)
);
CREATE TABLE score (
id BIGINT PRIMARY KEY,
student_id BIGINT,
course_id INT,
term VARCHAR(20), -- 如 '2023-秋季'
score DECIMAL(5,2),
FOREIGN KEY (student_id) REFERENCES student(id),
FOREIGN KEY (course_id) REFERENCES course(id),
UNIQUE KEY uk_stu_course_term (student_id, course_id, term)
);
WHERE grade_id=3 AND term='2023-秋季' GROUP BY course_idterm 數據JSP 頁面通過參數接收 gradeId、classId、term,單一頁面支持所有查詢/編輯場景,消除「頁面爆炸」。
「一張表解決所有同構數據」是關係型數據庫設計鐵律。分表僅用於億級數據分片,而非業務分類。