51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个用于存储学生成绩和课程表的关系型数据库表结构。请说明表结构(包括学生表、课程表、成绩表、教师表),外键关系、索引设计,以及如何优化按班级查询成绩的查询性能。

学而思中学教师难度:中等

答案

1) 【一句话结论】:设计包含学生、课程、教师、成绩四张表的关系型数据库,通过外键建立表间关联,并在学生表(班级ID字段)建立索引,利用成绩表与学生的关联(学号)实现按班级查询成绩,优化查询性能。

2) 【原理/概念讲解】:关系型数据库通过“表”和“外键”组织数据。表是数据的结构化集合,外键用于维护表间数据的一致性(如成绩表中的“学号”必须存在于“学生表”,保证成绩记录对应真实学生;“课程ID”必须存在于“课程表”,保证成绩对应真实课程)。索引是数据库为表字段建立的“目录”,能加速查询(如按班级查询成绩时,需通过学生表的外键(班级ID)建立索引,因为成绩表本身不存储班级ID,而是通过学号关联学生表,再从学生表获取班级信息)。类比:班级表是学生成绩的“索引目录”,成绩表里的“学号”是“目录索引”,查询时先通过学号找到学生记录(班级ID在学生表中),再关联成绩表,比直接在成绩表找班级ID更合理。

3) 【对比与适用场景】:

  • 学生表:存储学生基本信息(学号、姓名、班级ID),主键为学号,外键班级ID关联班级表(假设班级表存在)。索引:班级ID字段建立索引,用于按班级查询成绩的关联。
  • 课程表:存储课程信息(课程ID、课程名、教师ID),主键为课程ID,外键教师ID关联教师表。索引:课程ID(主键)和教师ID(外键)。
  • 成绩表:存储学生成绩(学号、课程ID、成绩),主键为学号+课程ID(复合主键),外键学号关联学生表,外键课程ID关联课程表。索引:学号(与成绩表主键一部分)和课程ID(与成绩表主键一部分)。
  • 教师表:存储教师信息(教师ID、姓名),主键为教师ID。索引:教师ID(主键)。

使用场景:日常成绩查询(按班级)、课程成绩统计、教师课程分配。注意点:学生表班级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) 【追问清单】:

  • 问:外键约束的作用是什么?答:保证数据完整性,避免成绩表中出现不存在的学号或课程ID,确保成绩记录对应真实学生和课程。
  • 问:为什么不在成绩表直接加班级ID字段?答:因为班级信息存储在学生表中,成绩表通过学号关联学生表,这样设计更符合数据规范化,避免数据冗余。
  • 问:如何处理大量学生按班级查询的性能?答:除了在学生表班级ID建索引,还可以考虑在成绩表(学号)和班级ID之间建立物化视图或分区表(如果数据量极大),但通常索引足够。
  • 问:索引类型选择?答:B树索引(默认),对于班级查询,按班级ID建立普通索引即可,因为班级ID是整数类型,查询效率高。
  • 问:多表连接顺序如何优化?答:按外键顺序连接(如先连接学生表和成绩表,再连接课程表),减少连接开销,因为学生表和成绩表通过学号关联,连接基数小。

7) 【常见坑/雷区】:

  • 忽略外键关联:如成绩表只关联学号,未关联课程ID,导致成绩表数据冗余或错误。
  • 索引位置错误:直接在成绩表加班级ID索引,因为成绩表无该字段,导致索引无效。
  • 表结构冗余:如学生表包含课程信息,导致数据重复,影响维护。
  • 未考虑关联路径:按班级查询时,未通过学生表的外键(班级ID)建立索引,导致查询性能下降。
  • 数据类型错误:如班级ID用字符串类型,而索引按整数处理,导致查询效率低。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1