
1) 【一句话结论】:采用关系型数据库设计,通过题目表与学习记录表的外键关联,并利用数据库事务(ACID特性)保证学生提交后学习记录及时、一致地更新,确保数据完整性。
2) 【原理/概念讲解】:数据库表设计需遵循关系模型,核心是“实体-关系”映射。
3) 【对比与适用场景】:
| 设计策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 外键约束(级联更新/删除) | 学习记录表题目ID引用题目表主键,设置级联 | 自动同步题目变更(如难度调整) | 需要题目信息实时同步 | 避免级联删除导致记录丢失 |
| 事务(原子操作) | 将提交答案的多个步骤(插入记录、更新统计)封装为事务 | 确保数据一致性,防止并发冲突 | 高并发场景(如多人同时答题) | 选择合适的隔离级别(如读已提交) |
| 时间戳字段 | 学习记录表添加提交时间(TIMESTAMP) | 记录操作时间,便于审计 | 需要追踪答题时间 | 确保时间同步(如NTP) |
4) 【示例】:以MySQL为例,表结构及操作:
-- 题目表
CREATE TABLE题目表 (
题目ID INT PRIMARY KEY AUTO_INCREMENT,
题目内容 VARCHAR(255) NOT NULL,
难度 INT CHECK (难度 BETWEEN 1 AND 5),
知识点 VARCHAR(100)
);
-- 学习记录表
CREATE TABLE学习记录表 (
记录ID INT PRIMARY KEY AUTO_INCREMENT,
学生ID INT NOT NULL,
题目ID INT NOT NULL,
正确率 FLOAT(2,1),
用时 INT, -- 单位:秒
提交时间 TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (题目ID) REFERENCES 题目表(题目ID) ON DELETE RESTRICT
);
-- 提交答案的原子操作(事务)
BEGIN TRANSACTION;
INSERT INTO 学习记录表 (学生ID, 题目ID, 正确率, 用时)
VALUES (1, 1, 1.0, 30); -- 假设正确且用时30秒
COMMIT;
解释:事务确保插入记录后,若后续有更新题目正确率的逻辑(如统计班级平均正确率),也能原子执行,避免中间状态不一致。
5) 【面试口播版答案】:(约90秒)
“面试官您好,针对用户学习记录和题目数据的设计,我建议采用关系型数据库,核心是两表关联并利用事务保证一致性。首先,题目表存储题目信息(主键题目ID,包含内容、难度、知识点),学习记录表存储学生答题记录(主键记录ID,外键题目ID关联题目表,字段有学生ID、正确率、用时、提交时间)。通过外键约束确保每条学习记录对应唯一题目,避免数据冗余或错误。当学生提交答案时,系统执行原子事务:先插入学习记录,再(可选)更新题目表中的正确率统计(如班级平均正确率),事务的提交保证所有步骤要么全部完成,要么全部回滚,比如如果插入记录失败,整个操作不生效,确保数据一致性。这样既保证了学习记录及时更新,又防止题目数据因并发操作出现异常。”
6) 【追问清单】:
7) 【常见坑/雷区】: