【问题标题】:Linking a third table to a bridge table in a many to many association在多对多关联中将第三个表链接到桥接表
【发布时间】:2016-01-13 06:09:57
【问题描述】:
设计这个数据库的正确方法是什么?
这是我设置表格的方式:
我在一个叫做教师的表和一个叫做仪器的表之间有一个多对多的关系。然后我有一个连接两者的桥接表。我想将另一个表与 BRIDGE 表相关联。意思是乐器/老师的组合。该表将有 3 行指定教师可以教授的演奏水平(即初级、中级、高级)。好像我应该将桥表设置为有teacher_id、instrument_id和level_id,但我不知道这是否是传统的做法。
我正在使用 mysql 和 cakephp,但我在文档中没有找到任何关于 HABTM 关联的关于在桥表中具有额外字段的内容。只是想确保我做得正确。
【问题讨论】:
标签:
mysql
database
cakephp
database-design
【解决方案1】:
+1 马特·芬威克。我要补充一点,您要小心处理外键约束。您基本上有两个选项,这两个选项最终看起来都非常相似,具体取决于您选择的主键。
选项一是:忘记TEACHER和INSTRUMENT之间的简单交集,代之以包含teacher_id、instrument_id和level_id的复杂交集。所有这三个列都将是此交集表的(复合)主键。在此选项中,您在 teacher_id 和 instrument_id 上定义了外键约束(如果这实际上是 LEVEL 表的外键,而不仅仅是整数或字符串代码,则为 level_id)。
选项二 是:保留TEACHER 和INSTRUMENT 之间的简单交集(我们称它为TEACHER_INSTRUMENT,尽管这很缺乏想象力)并添加一个定义级别的子表可以教的。这个子表(我们称之为SKILL)有一个level_id 和一个指向TEACHER_INSTRUMENT 的外键。如果TEACHER_INSTRUMENT 的主键是teacher_id 和instrument_id 的组合,那么SKILL 表将具有与选项一中相同的三列。是什么让这个选项与众不同? 来自SKILL的外键约束必须到交集表,而不是TEACHER和INSTRUMENT。
为什么这很重要?如果您选择选项一,您可能需要一些额外的查询逻辑来获得完全填充的技能网格,因为没有参照完整性约束,您可以定义它将确保为每个教师/仪器组合填充所有技能水平。
另一方面,如果您选择选项 2,您的优势在于可以将关注点分开,即谁可以使用什么,以及他们的教学效果如何。
您要避免的是,一张表只包含教师/仪器关系,然后是第二张表(独立地)重复该关系,但添加了技能级别的详细信息。如果您这样做,那么您将面临这两件事不同步的风险。
【解决方案2】:
如果这就是您的数据所要求的,而且听起来确实如此,那就去做吧。
基本上,正如您所说,您将拥有一个由三部分组成的密钥:
- teacher_id
- instrument_id
- level_id
这意味着一个老师可以教初学者和高级的吉他,中级和初学者的钢琴,另一个老师可以教所有三个级别的钢琴和初学者的双簧管……听起来不错。
顺便说一下,桥接表也称为intersect 或intersection 表。