三个表之间的连接表的优缺点,在任何给定时间只有两个表
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。 如果TableB
与TableC
相关,那么为什么 你会创建一个与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 之间没有明确的直接关系,我会将关系保存在单独的表中,这更像是星型模式/雪花模式。从数据建模的角度来看,它比可以连接两个不同方向的表更容易理解。
【讨论】:
以上是关于三个表之间的连接表的优缺点,在任何给定时间只有两个表的主要内容,如果未能解决你的问题,请参考以下文章