【问题标题】:Mapping relationship -- foreign key or mapping table映射关系——外键或映射表
【发布时间】:2012-11-23 20:19:08
【问题描述】:

尝试在这里获得一些专业的想法,了解在创建架构关系时哪种选择更好

我大致从这个post 中找到了一个想法,但仍然试图获得更多的想法。

一个简单的场景可能是这样的:

class <--> Student <--> Teacher <--> class

(假设一个老师可以教多门课) 这是一轮many-to-many 关系的正常情况。并且查询可以从任何对等点开始到任何方向。那么还有什么更好的设计呢?

我知道在一对一的关系中,映射表绝对是一种浪费,但是映射表解决方案ONLY 是否适用于many-to-many 关系,就像提到的那个帖子一样?如果我们想用方向扩展多对多关系。如果关系是one-direction 而不是bidirectional,答案会不会不同?

提前致谢。

【问题讨论】:

  • 您能解释一下为什么要考虑映射表吗?另外,你能举例说明你会担心关系的方向吗?

标签: mysql sql-server database oracle


【解决方案1】:

一些简单的规则:

对于一对一关系,外键可以保存在关系中涉及的任何一个表中,引用另一个表。

对于一对多关系,关系多端的表应该包含外键。

对于多对多关系,您可以创建一个关联表(用您的术语来说是映射表),这是第三个表,其中包含多对多关系中涉及的两个表的外键。

例如,假设我们有表 STUDENT、CLASS 和 TEACHER。一般来说STUDENT和CLASS之间是多对多的关系,从TEACHER到CLASS是一对多的关系(假设一个班级只有一个老师)。因此,这些表可能如下所示:

STUDENT: STUDENT_ID, STUDENT_NAME, etc.
CLASS: CLASS_ID, TEACHER_ID (foreign key), CLASS_NAME, etc.
TEACHER: TEACHER_ID, NAME, etc.
STUDENT_CLASS (mapping table): STUDENT_ID (foreign key), CLASS_ID (foreign key), GRADE, etc.

【讨论】:

    【解决方案2】:

    如果你有一个多对多的关系,那么,是的,你需要一个映射表。确实没有其他合理的方法可以在关系数据库中存储有关多对多关系的信息(当然,这样做有很多不合理的方法)。

    如果您希望关系是单向的(这看起来很奇怪——我无法想象实体 A 与实体 B 有关系而 B 与 A 没有关系的情况,所以我倾向于怀疑如果你想实现类似的东西,数据模型不正确),你仍然会使用映射表。您可能会在存储DIRECTION 的映射表中添加另一列(即“A -> B”或“B -> A”)。

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 2020-06-25
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 2011-08-08
      相关资源
      最近更新 更多