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