有时联结表会增加不必要的复杂性吗?

时间:2019-11-06 02:26:07

标签: mysql sql rdbms junction-table

假设您有一个食谱应用程序。每个配方都可以具有成分,说明和标签。 每一个都有配方的ManyToMany。

同样,方向可以是带步骤的ManyToMany,成分可以是带量的ManyToMany,量可以带量度的ManyToMany。

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

1 个答案:

答案 0 :(得分:1)

是的,约定称为database normalization

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

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

如果您对此表示的复杂程度感到不满意,请不要怪罪表!您要建模的真实世界信息会导致复杂性。

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

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

您可能还会喜欢我的答案:Is storing a delimited list in a database column really that bad?

通常,每种优化都会针对一种类型的查询进行优化,但会以针对相同数据的其他类型的查询为代价。

组织数据以符合规范化规则可使您的数据库更好地服务于各种查询。