t_class
:存储有关类的元数据(主键:class_ID
)
t_students
:通过外键class_ID
链接到类(class)
t_exams
:存储有关考试的元数据(到目前为止没有外键)
t_grades
:将 t_exams
链接到 t_students
,因为两者具有 n 到 m 的关系(没有主键,但有两个外键:exam_ID
和student_ID
)。它还具有 grade
列,用于存储每个学生的考试成绩。
问题:t_grades
可能没有特定考试的条目。在当前架构中,如果 t_grades
没有条目,则无法获取类(class)的所有考试。
我的解决方案:
a) 将 key class_ID
添加到 t_exams
。缺点:它更像是一个较少的冗余键,我无法将其添加为外键(导致 mysql 错误 1452)
b) 自动将类(class)的所有学生添加到 t_grades
中,并将 t_grades.grade
留空。这也感觉非常多余。
问题:是否有更好的方法来解决这个特定问题,或者我应该坚持使用我的解决方案之一?
创建代码:
最佳答案
我真的不喜欢你用图形表示数据库设计的方式,但我理解你的问题。
我认为您应该将 t_exams
直接连接到 t_classes
,因为类(class)中的所有学生都应该参加考试。所以,这是你的第一个解决方案。
简单来说:一个学生属于一个类(class),一个类(class)可以参加考试,而学生参加的考试可以评分。
对我来说,这似乎是一个完全合乎逻辑的设计。我不明白为什么你不能实现这个?我想我们需要查看您的 CREATE TABLE
查询?
我同意:我的图表也远非完美,但就像你的图表一样:我希望你明白。
关于Mysql避免冗余外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42878981/