首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以多对多关联将第三个表链接到桥接表

以多对多关联将第三个表链接到桥接表
EN

Stack Overflow用户
提问于 2011-11-17 04:25:01
回答 2查看 2.2K关注 0票数 2

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

下面是我如何设置我的表:

我在一个名为teachers的表和一个名为instruments的表之间存在多对多的关系。然后我有一个桥接表连接两者。我想要将另一个表与桥接表相关联。指的是乐器/教师组合。该表将有3行,指定教师可以教授的游戏级别(即。初学者、中级、高级)。似乎我应该设置桥接表来拥有teacher_id、instrument_id和level_id,但我不知道这是不是传统的方法。

我正在使用mysql和cakephp,但我在文档中没有找到任何关于HABTM关联的内容,即在桥接表中有一个额外的字段。只是想确认一下我做得是否正确。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-17 04:30:40

如果这就是你的数据所需要的,而且听起来确实如此,那么就去做吧。

基本上,正如您所提到的,您将拥有一个由三部分组成的密钥:

  • teacher_id
  • instrument_id
  • level_id

这意味着一个老师可以教初学者和高级吉他,钢琴在中级和初学者,另一个老师可以教钢琴在所有三个水平和双簧管在初学者…听起来不错。

顺便说一下,桥接表也称为intersectintersection表。

票数 3
EN

Stack Overflow用户

发布于 2011-11-17 05:35:39

马特·芬威克+1。我要补充的是,您需要对外键约束稍加小心。您实际上有两个选项,根据您对主键的选择,这两个选项最终可能看起来非常相似。

选项之一是:忘记TEACHERINSTRUMENT之间的简单交集,代之以包含teacher_idinstrument_idlevel_id的复杂交集。所有这三列都是这个交叉表的(复合)主键。在这个选项中,您在teacher_idinstrument_id上定义了外键约束(如果这实际上是LEVEL表的外键,而不仅仅是整数或字符串代码,则还要定义level_id )。

选项二是:保持TEACHERINSTRUMENT之间的简单交集(让我们称其为TEACHER_INSTRUMENT,尽管这没有想象力),并添加一个子子表来定义可以教授的级别。这个子子表(让我们称它为SKILL)有一个level_id和一个指向TEACHER_INSTRUMENT的外键。如果TEACHER_INSTRUMENT的主键是teacher_idinstrument_id的组合,那么SKILL表将具有与选项一相同的三列。此选项的不同之处在哪里?来自SKILL的外键约束必须指向交叉表,而不是指向TEACHERINSTRUMENT

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

另一方面,如果您选择第二个选项,那么在谁可以使用什么以及他们可以教得多好之间,您具有分离关注的优势。

您要避免的是有一个只包含教师/乐器关系的表,然后有第二个表(独立地)重复该关系,但添加了技能级别的详细信息。如果你这样做,那么你就会冒着这两件事不同步的风险。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8158175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档