Mysql避免冗余外键

标签 mysql database database-design relational-database database-schema

我有以下数据库架构: Picture of the model

t_class:存储有关类的元数据(主键:class_ID)

t_students:通过外键class_ID链接到类(class)

t_exams:存储有关考试的元数据(到目前为止没有外键)

t_grades:将 t_exams 链接到 t_students,因为两者具有 n 到 m 的关系(没有主键,但有两个外键:exam_IDstudent_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)可以参加考试,而学生参加的考试可以评分。 enter image description here

对我来说,这似乎是一个完全合乎逻辑的设计。我不明白为什么你不能实现这个?我想我们需要查看您的 CREATE TABLE 查询?

我同意:我的图表也远非完美,但就像你的图表一样:我希望你明白。

关于Mysql避免冗余外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42878981/

相关文章:

c# - 将解决方案拆分为不同项目后出现组装错误

c# - 如何为数据集表分配表名

ios - 如何在 Core Data 对象中存储 Twitter ID

mysql - 仅包含唯一字符串的专用 SQL 表

java - JPA:外键注释

mysql - upsert() 如何在多个键上工作? [ Sequelize ]

javascript - PHP 面向对象的类,具有日期时间到月份和日期

php - 使两个表中的同一列始终具有相同的数据?

asp.net - 管理员角色和用户角色的配置

database - 搜索数据库现有记录问题