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

设计一个存储初中数学学生成绩和作业数据的数据库,包括学生表、课程表、作业表、成绩表等。请说明表结构、主键外键关系,以及如何设计索引(如按学生ID、课程ID、作业ID索引)以优化查询性能,并考虑事务处理(如提交作业和更新成绩的原子性)。

成都市第七中学初中数学难度:中等

答案

1) 【一句话结论】采用关系型数据库设计,通过学生、课程、作业、成绩四表关联数据,结合主键外键约束保证数据一致性,按学生ID、课程ID、作业ID建索引优化查询,并使用事务确保作业提交与成绩更新的原子性。

2) 【原理/概念讲解】老师口吻:设计数据库时,核心是“表结构+关系+索引+事务”。

  • 表结构:每个表用唯一标识(主键)区分记录,比如学生表用“学号”做主键(唯一标识学生),课程表用“课程ID”主键。
  • 主外键关系:表间通过外键关联,比如成绩表关联学生ID(外键)、课程ID(外键)、作业ID(外键),确保“成绩属于某个学生、某门课、某次作业”。
  • 索引作用:索引像图书馆的“索引卡”,加速查询。比如按“学生ID”查询成绩时,索引能快速定位记录,避免全表扫描。
  • 事务原子性:ACID中的“原子性”要求操作要么全部成功,要么全部失败。比如提交作业和更新成绩必须一起完成,若中间出错(如网络中断),数据不会不一致。

3) 【对比与适用场景】
索引类型对比(加速查询的关键):

索引类型定义特性使用场景注意点
B树索引树形结构,支持范围查询查询效率高,维护成本中等常用(如主键、外键查询)避免过度索引,影响写入性能
唯一索引确保列值唯一防止重复数据,加速唯一性检查主键、唯一标识列(如学号)不适合频繁更新的列(如提交时间)
全文索引用于文本搜索支持模糊匹配文本内容搜索(如作业描述)不适合数值列(如分数)

4) 【示例】

  • 表结构:

    • 学生表(student):学号(student_id, 主键, INT, 自增),姓名(name, VARCHAR(20)),班级(class, VARCHAR(20))
    • 课程表(course):课程ID(course_id, 主键, INT, 自增),课程名称(course_name, VARCHAR(50)),教师(teacher, VARCHAR(20))
    • 作业表(homework):作业ID(homework_id, 主键, INT, 自增),课程ID(course_id, 外键, INT),作业描述(description, TEXT),提交截止时间(deadline, DATETIME)
    • 成绩表(grade):成绩ID(grade_id, 主键, INT, 自增),学生ID(student_id, 外键, INT),课程ID(course_id, 外键, INT),作业ID(homework_id, 外键, INT),分数(score, INT),提交时间(submit_time, DATETIME)
  • 索引设计:

    • student表:student_id(主键,自动索引)
    • course表:course_id(主键,自动索引)
    • homework表:homework_id(主键,自动索引),course_id(外键,索引)
    • grade表:grade_id(主键,自动索引),student_id(外键,索引),course_id(外键,索引),homework_id(外键,索引)
  • 事务示例(提交作业+更新成绩):

    BEGIN TRANSACTION;
    -- 提交作业
    INSERT INTO homework (course_id, description, deadline) VALUES (1, '期中练习题', '2024-03-20 23:59:59');
    -- 假设作业ID为1
    -- 更新成绩
    INSERT INTO grade (student_id, course_id, homework_id, score, submit_time) VALUES (101, 1, 1, 85, NOW());
    COMMIT;
    

5) 【面试口播版答案】
“设计这个数据库,核心是用关系型数据库,通过学生、课程、作业、成绩四个表关联数据。学生表用学号主键,课程表用课程ID主键,作业表关联课程ID,成绩表关联学生ID、课程ID、作业ID。索引方面,按学生ID、课程ID、作业ID建索引,加速查询。事务处理上,提交作业和更新成绩用事务,确保原子性,避免数据不一致。”

6) 【追问清单】

  • 问:为什么按学生ID、课程ID建索引?
    回答:因为查询成绩时经常按“学生+课程”组合筛选,索引能加速范围查询,避免全表扫描。
  • 问:事务的隔离级别如何选择?
    回答:教育场景用“读已提交”,避免脏读(未提交数据被读取),同时保证查询一致性。
  • 问:数据量很大时如何优化?
    回答:考虑按“课程”或“时间”分表(如按学期分区),减少单表数据量,提升查询性能。
  • 问:外键约束的作用?
    回答:保证数据完整性,比如成绩表中的学生ID必须存在于学生表,避免插入无效成绩。
  • 问:并发提交作业时如何处理?
    回答:事务的隔离级别(如读已提交)和锁机制(悲观锁),确保并发时数据一致,避免重复提交。

7) 【常见坑/雷区】

  • 外键约束未设置:导致插入无效成绩(如学生ID不存在)。
  • 索引过度:为非查询字段(如提交时间)建索引,影响写入性能。
  • 事务隔离级别错误:用“读未提交”导致脏读,数据错误。
  • 表结构冗余:成绩表中存储学生姓名,而学生表已有,导致数据不一致。
  • 数据类型错误:成绩用字符串存储,无法进行数值计算(如平均分)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1