我有两个实体课程,学生和委员会。
我无法发布图片,但可以在此处找到当前数据库设计的图像: current db design
或文字:
**Committee**
id
name
**students_committees**
stud_id
com_id
**students**
name
gender
grade
学生可以在许多委员会,一个委员会有很多学生。
现在我想在委员会中增加一名领导人(一个委员会可以有一名以上领导人)。 这样做的最佳方式是什么?
committee_leaders(stud_id, com_id)
students_committees(stud_id, com_id, is_leader)
我认为额外的连接表是最佳选择。我们不需要遍历整个当前的连接表来找到委员会的领导者。我的团队不同意。
答案 0 :(得分:3)
我使用“选项2”:额外的列。
这意味着您不必担心
答案 1 :(得分:3)
如果您的案例中下面的第2点和第3点很重要,我的选择将是选项1。如果没有,选项2更简单。
优点(vs选项2):
(正如您所指出的)您不需要遍历整个当前的连接表来查找委员会的领导者。您只需与committee
加入committee_leaders
即可。 (虽然差别不大,但您只是搜索较小的指数,差异可能微不足道。)
您可以轻松强制执行委员会不超过一名领导者的约束。
如果您想为领导者添加其他属性,例如选择领导者(当选),他们获得的其他标题等,您将不会在studens_committees
表格中填入列<{1}}几乎无处不在。
缺点:
离开委托会需要2个表上的DELETE(或者有效的级联删除1)。
将新学生作为领导者插入将需要2个表中的两个INSERT。
更改委员会中的领导者将需要一个DELETE和一个INSERT vs 2 UPDATE(可能在一个陈述中)。
答案 2 :(得分:2)
我也赞成将属性添加到现有的连接表中,因为:
答案 3 :(得分:2)
你应该去下面。
添加另一个联接表:committee_leaders(stud_id, com_id)
否则你将无法添加委员会负责人的详细信息...... +第1点将为其他用户提供更多灵活性
当朝向第2点移动时,这可能违反3范式
<强>参考强>
http://databases.about.com/od/specificproducts/a/normalization.htm
您可以使用级联删除,因此从父表删除记录将自动删除子表中的条目...