先说明每一列依赖谁
假定表的每行是一名学生选一门模块,键为(student_id,module_id)。并假设每门模块本期只有一位协调导师,module_id决定tutor_id,tutor_id决定tutor_name。必须先声明这些业务假设,不能凭几行样本猜永久依赖。
如果同一导师名字重复存在许多行,修改时可能漏一行;没有学生选课时,也可能无法只存模块导师信息。这些是更新或插入异常的示例。
按依赖拆开而不是按外观拆开
可分别保存StudentModule(student_id,module_id)、Module(module_id,tutor_id)、Tutor(tutor_id,tutor_name),用键表达关系。原学生选课信息可以通过明确的连接恢复。
若实际规则是一门模块有多位导师,就需要额外的ModuleTutor关系,而不是继续假定module_id决定一个tutor_id。模型应跟随真实约束变化。
验证约束与信息恢复
自练给出两条同模块不同导师的记录,判断是数据错误还是“一门一导师”假设不成立。再写出每张表的主键、外键及必要唯一约束。
拆表不自动保证所有规则都被数据库执行,也不一定越多越好。课程作答应说明函数依赖、异常与恢复关系;如果之后考虑性能反规范化,要作为另外的设计选择解释。
参考资料
下一步
如需大学专业课程与 Tutorial 学习支持,请填写模块名称、学习目标和已尝试步骤。具体教学安排须确认,计分作业由学生独立完成。
