
1) 【一句话结论】:设计包含学生、课程、教师、成绩四张表的关系型数据库,通过外键建立表间关联,并在学生表(班级ID字段)建立索引,利用成绩表与学生的关联(学号)实现按班级查询成绩,优化查询性能。
2) 【原理/概念讲解】:关系型数据库通过“表”和“外键”组织数据。表是数据的结构化集合,外键用于维护表间数据的一致性(如成绩表中的“学号”必须存在于“学生表”,保证成绩记录对应真实学生;“课程ID”必须存在于“课程表”,保证成绩对应真实课程)。索引是数据库为表字段建立的“目录”,能加速查询(如按班级查询成绩时,需通过学生表的外键(班级ID)建立索引,因为成绩表本身不存储班级ID,而是通过学号关联学生表,再从学生表获取班级信息)。类比:班级表是学生成绩的“索引目录”,成绩表里的“学号”是“目录索引”,查询时先通过学号找到学生记录(班级ID在学生表中),再关联成绩表,比直接在成绩表找班级ID更合理。
3) 【对比与适用场景】:
使用场景:日常成绩查询(按班级)、课程成绩统计、教师课程分配。注意点:学生表班级ID必须关联班级表,成绩表学号和课程ID必须唯一,避免成绩重复。
4) 【示例】(伪代码):
CREATE TABLE 学生表 (
学号 VARCHAR(20) PRIMARY KEY,
姓名 VARCHAR(20),
班级ID INT,
FOREIGN KEY (班级ID) REFERENCES 班级表(班级ID) -- 假设班级表存在
);
CREATE TABLE 课程表 (
课程ID INT PRIMARY KEY,
课程名 VARCHAR(50),
教师ID INT,
FOREIGN KEY (教师ID) REFERENCES 教师表(教师ID)
);
CREATE TABLE 成绩表 (
学号 VARCHAR(20),
课程ID INT,
成绩 INT,
PRIMARY KEY (学号, 课程ID),
FOREIGN KEY (学号) REFERENCES 学生表(学号),
FOREIGN KEY (课程ID) REFERENCES 课程表(课程ID)
);
CREATE TABLE 教师表 (
教师ID INT PRIMARY KEY,
姓名 VARCHAR(20)
);
-- 为按班级查询优化,在学生表班级ID列建立索引
CREATE INDEX idx_student_class ON 学生表(班级ID);
-- 查询按班级成绩的示例
SELECT s.学号, s.姓名, c.课程名, g.成绩
FROM 成绩表 g
JOIN 学生表 s ON g.学号 = s.学号
JOIN 课程表 c ON g.课程ID = c.课程ID
WHERE s.班级ID = ?; -- ?为班级ID
5) 【面试口播版答案】:面试官您好,针对存储学生成绩和课程表的需求,我设计四张表:学生表(学号、姓名、班级ID)、课程表(课程ID、课程名、教师ID)、成绩表(学号、课程ID、成绩)、教师表(教师ID、姓名)。外键关系上,成绩表通过学号和课程ID分别关联学生表和课程表,课程表通过教师ID关联教师表。为优化按班级查询成绩的性能,在学生表(班级ID字段)建立索引,因为成绩表本身不存储班级ID,而是通过学号关联学生表,再从学生表获取班级信息,这样查询时先通过班级ID索引找到该班级的学生记录,再关联成绩表,避免全表扫描。表结构通过外键保证数据一致性,索引提升按班级查询的效率,满足日常成绩统计需求。
6) 【追问清单】:
7) 【常见坑/雷区】: