将第三个表链接到多对多关联中的桥表

Bri*_*ins 2 mysql database database-design cakephp

设计此数据库的正确方法是什么?

以下是我设置表格的方法:

我在一个名为教师的桌子和一个叫做乐器的桌子之间有很多关系.然后我有一个连接两者的桥牌桌.我想将另一个表与BRIDGE表关联起来.意思是乐器/教师组合.该表将有3行指定教师可以教授的教学级别(即初级,中级,高级).好像我应该将桥接表设置为具有teacher_id,instrument_id和level_id,但我不知道这是否是传统的方法.

我正在使用mysql和cakephp,我没有在关于HABTM关联的文档中找到关于在桥表中有一个额外字段的任何内容.只是想确保我正确地做到了.

Joe*_*own 5

为Matt Fenwick +1.我想补充一点,你想对你的外键约束要小心一点.您基本上有两个选项,根据您选择的主键,这两个选项最终看起来非常相似.

一个选项是:忘记之间的简单交叉点TEACHERINSTRUMENT与具有复杂交叉点,其包括替换它teacher_id,instrument_idlevel_id.这三列中的所有三列都是此交集表的(复合)主键.在此选项中,您具有定义的外键约束teacher_idinstrument_id(level_id如果这实际上是LEVEL表的外键而不仅仅是整数或字符串代码).

选项二是:保持TEACHER和之间的简单交集INSTRUMENT(TEACHER_INSTRUMENT尽管那是缺乏想象力的,让我们称之为)并添加一个子子表来定义可以教授的级别.这个子子表(让我们称之为SKILL)有一个level_id和一个外键TEACHER_INSTRUMENT.如果主键TEACHER_INSTRUMENT是组合teacher_idinstrument_idSKILL表将具有相同的三列中选择一个.是什么让这个选项不同? 外键约束 SKILL 必须是到交集表,而不是 TEACHER INSTRUMENT.

为什么这很重要? 如果选择选项一,您可能需要一些额外的查询逻辑来获得完全填充的技能网格,因为您没有可以定义的参照完整性约束,这将确保为每个教师/工具组合填充所有技能级别.

另一方面,如果你选择第二种选择,那么你就可以分清谁可以使用什么以及如何教会它.

您要避免的是拥有一个仅包含教师/乐器关系的表格,然后是第二个(独立地)重复该关系但增加技能水平细节的表格.如果你这样做,那么你冒着这两件事不同步的风险.