三个表之间的连接表的优缺点,在任何给定时间只有两个表

Posted

技术标签:

【中文标题】三个表之间的连接表的优缺点,在任何给定时间只有两个表【英文标题】:Pros and cons of a junction table between three tables, only two of which at any given time 【发布时间】:2011-11-18 16:25:51 【问题描述】:

我将在三个表之间建立多对多关系,但该关系一次只在一个表(比如 TableA)和另外两个表中的一个(比如 TableB 和 TableC)之间.也就是说,我可以有一个联结表

id | TableA_id | TableB_id | TableC_id

使用约束确保 TableB_id 为 null 或 TableC_id 为 null,或两个联结表

id | TableA_id | TableB_id
id | TableA_id | TableC_id

确定我应该使用这两种可能性中的哪一种的好标准是什么?

【问题讨论】:

想解释一下为什么数据的布局方式是这样的,以及您打算如何与之交互?另外,TableB 和 TableC 在它们的领域是否相似? ...你可能想在Database Administrators上问这个 TableC 实际上与 TableB 是多对一的关系,因为我正在使用它。问题的要点是,是更少的表更好,更多的可能为 NULL,还是更多的表,更少的可能为 NULL。 如果TableBTableC 相关,那么为什么 你会创建一个与TableA 相关的连接表吗?虽然您当然可以拥有“直通”关系(例如,TableA 一对多 TableC 因为TableA 一对一 TableB 一对多 TableC),但您通常只创建直接关系表。 TableA 以不同的方式与 TableB 和 TableC 相关。 除非您要使用第 5 范式(即...棘手/奇怪),否则您通常通过 1(或更多)直接或间接定义两个表之间的关系其他表。例如,如果我的工作场所想知道带去上班的所有自制午餐的数量,他们必须询问所有员工——他们无法知道我们是否自己带了午餐。 【参考方案1】:

良好的数据库设计方法是永远不要存储NULL 数据(在现实世界中,您当然可以过度规范化)。因此选项 2 更好。

【讨论】:

选项 2 太糟糕了。如何判断列出的 id 是来自 tableB 还是 tableC?这是一个多域表,可能/将导致各种问题。 @X-Zero:嗯?您知道,因为该表被称为 TableATableBJunction,并且列被称为 TableA_Id 和 TableB_Id。为表和列赋予有意义的名称是非常基本的数据库设计。 #smacks self# Gaaahhh... 不知何故,我将其读作 same 表中的两个 rows,而不是两个 tables我>。我今天似乎很开心......【参考方案2】:

由于表 B 和表 C 之间没有明确的直接关系,我会将关系保存在单独的表中,这更像是星型模式/雪花模式。从数据建模的角度来看,它比可以连接两个不同方向的表更容易理解。

【讨论】:

以上是关于三个表之间的连接表的优缺点,在任何给定时间只有两个表的主要内容,如果未能解决你的问题,请参考以下文章

如何处理三个连接表的@JsonManagedReference 和@JsonBackReference

NNER JOIN连接两个表三个表五个表的SQL语句

oracle表之间的连接

如何使用 Django 创建三联表

Php Yii 与联结表的关系

获取两个表的差异以及重复记录并存储在 Azure SQL DB 的第三个表中