设计一个好的数据库

时间:2015-08-14 12:53:08

标签: database database-design

我有以下树:

courses,有许多groups,每个都有多个students。 因此,钻出来的树看起来像这样:课程 - >群组 - >生。

我认为有两种表达方式:

1)students表格group_id FK到groups; groups表格course_id FK或:

2)第一个选项加students表同时包含group_idcourse_id个FK,这样我就可以更自由地获取数据而无需JOIN“父”每次都是表。

一个很好的例子就是让所有参加课程的学生(不管是哪个小组)。在这种情况下,仅使用第一个选项会强制我JOIN groups表,这在该范围内是不需要的。所以我倾向于总是选择第二个选项,即使“主”表获得了更多的FK列。

你如何处理这个问题?

如果您在courses表格的顶部添加更多表格,例如teachers(教授courses)和schools(那个有teachers)。如果您需要查看学校的所有学生,您需要加入小组,课程,教师和学校。

谢谢!

LE:我从这个例子中排除了很多很多关系,这些关系被区别对待。

LLE:是的,如果听起来像是方便(又称表演)......可能是真的:)

2 个答案:

答案 0 :(得分:2)

course_id添加到students表中将被视为“非规范化”,并且完全可以接受您正在尝试解决的问题:“性能”。

Denormalization Wiki

  

在计算中,非规范化是尝试通过添加冗余数据或通过分组数据来优化数据库的读取性能的过程

所以是的,你的第二个选择就是这样做...试图通过添加冗余数据来提高性能。

答案 1 :(得分:2)

就个人而言,为了清晰起见,我尝试将数据库尽可能标准化。所以我想说如果每个学生都要通过一个小组(不是一个学生不在一个小组中)与课程相关联,那么学生和课程之间不应该有直接的关系。不要因为必须编写更少的SQL而牺牲数据模型的清晰度。

此外,您可能已经意识到这一点,但您需要链接表以获取任意多对多关系。我不确定你在谈论什么样的团体,但是如果他们可以在多个课程中存在,那么你需要一个课程 - > CourseGroup(FK CourseID,FK GroupID) - >群组结构,如果学生可以属于多个群组,则需要群组 - > GroupMembership(FK GroupID,FK StudentID) - >学生。