连接表是不是会增加不必要的复杂性?

Posted

技术标签:

【中文标题】连接表是不是会增加不必要的复杂性?【英文标题】:Are there times when junction tables add more complexity than necessary?连接表是否会增加不必要的复杂性? 【发布时间】:2019-11-06 02:26:07 【问题描述】:

假设您有一个食谱应用。每个食谱都可以有成分、说明和标签。 每一个都可以是带有配方的多对多。

同样,方向可以是带步骤的多对多,成分可以是带数量的多对多,数量可以是带测量的多对多。

是否有约定何时使用联结表?

【问题讨论】:

【参考方案1】:

是的,约定称为database normalization。

如果您希望数据库处于正常形式,则每个多对多关系都需要自己的联结表。

范式的目的是减少数据异常的机会。即,意外插入与其他数据相矛盾的数据。如果您遵循规范化规则,您的数据库只会代表每个事实一次,因此不会出现数据异常情况。

如果您对它所代表的复杂程度感到不舒服,请不要责怪表格!导致复杂性的是您尝试建模的真实世界信息。

有些人喜欢避免使用该表,例如通过在recipes 表中存储一个带有逗号分隔标签列表的字符串。这是一个反规范化的例子。在此示例中,查询食谱及其标签会变得更简单。但这会使执行一些其他类型的查询变得更加困难:

有多少/哪些食谱共享一个给定标签? 每个配方的平均标签数量是多少? 更新所有食谱以更改给定标签的拼写,或从所有具有给定标签的食谱中删除该标签。

你可能也喜欢我的回答:Is storing a delimited list in a database column really that bad?

一般来说,每种优化都针对一种类型的查询进行优化,代价是针对同一数据的其他类型的查询。

组织您的数据以符合规范化规则使您的数据库能够更好地服务于更广泛的查询。

【讨论】:

“每个多对多关系都需要自己的联结表”是不正确的。例如,5NF 表在复合 CK 上的每个投影都是 M:M:.... 规范化并不是以某种简单的方式基于基数。

以上是关于连接表是不是会增加不必要的复杂性?的主要内容,如果未能解决你的问题,请参考以下文章

软件工艺的话题

mysql中树形结构表的操作

为什么说C++太复杂?复杂的必要性是为什么?

知乎为啥使用Tornado?使用Python中的多线程特性了吗

CheckSynchronize实现的不必要的复杂

Oracle-视图,约束