数据库设计:使用额外列或两个连接表连接表

时间:2012-02-16 08:41:21

标签: database database-design

我有两个实体课程,学生和委员会。

我无法发布图片,但可以在此处找到当前数据库设计的图像: current db design

或文字:

**Committee**
id
name

**students_committees**
stud_id
com_id

**students**
name
gender
grade
学生可以在许多委员会,一个委员会有很多学生。

现在我想在委员会中增加一名领导人(一个委员会可以有一名以上领导人)。 这样做的最佳方式是什么?

  1. 添加另一个联接表:committee_leaders(stud_id, com_id)
  2. 在现有联接表中添加额外列:students_committees(stud_id, com_id, is_leader)
  3. 别的什么?
  4. 我认为额外的连接表是最佳选择。我们不需要遍历整个当前的连接表来找到委员会的领导者。我的团队不同意。

4 个答案:

答案 0 :(得分:3)

我使用“选项2”:额外的列。

这意味着您不必担心

  • 学生在两个桌子(作为成员和领导者)
  • 离开委员会将需要2个表上的DELETE?
  • ...

答案 1 :(得分:3)

如果您的案例中下面的第2点和第3点很重要,我的选择将是选项1。如果没有,选项2更简单。

优点(vs选项2):

  1. (正如您所指出的)您不需要遍历整个当前的连接表来查找委员会的领导者。您只需与committee加入committee_leaders即可。 (虽然差别不大,但您只是搜索较小的指数,差异可能微不足道。)

  2. 您可以轻松强制执行委员会不超过一名领导者的约束。

  3. 如果您想为领导者添加其他属性,例如选择领导者(当选),他们获得的其他标题等,您将不会在studens_committees表格中填入列<{1}}几乎无处不在。

  4. 缺点:

    1. 离开委托会需要2个表上的DELETE(或者有效的级联删除1)。

    2. 将新学生作为领导者插入将需要2个表中的两个INSERT。

    3. 更改委员会中的领导者将需要一个DELETE和一个INSERT vs 2 UPDATE(可能在一个陈述中)。

答案 2 :(得分:2)

我也赞成将属性添加到现有的连接表中,因为:

  • 联接表已经描述了两个表之间的关系,领导者只是这种关系的另一个方面
  • 您不必处理其他数据一致性问题(更新,删除时会发生什么)
  • 在您需要所有信息的情况下,性能会更好,因为您不必加入三个表(联接很昂贵)

答案 3 :(得分:2)

你应该去下面。

添加另一个联接表:committee_leaders(stud_id, com_id)

否则你将无法添加委员会负责人的详细信息...... +第1点将为其他用户提供更多灵活性


当朝向第2点移动时,这可能违反3范式

第三范式(3NF)

  1. 满足第二范式的所有要求。
  2. 满足第一范式的所有要求。
  3. 删除不依赖主键的列。

  4. <强>参考

    http://databases.about.com/od/specificproducts/a/normalization.htm


    您可以使用级联删除,因此从父表删除记录将自动删除子表中的条目...