表链,何时反规范化?

问题描述 投票:3回答:2

假设TABLE-A在TABLE-B中可以有一行或多行,它们可以在TABLE-C中有一行或多行,它们可以在TABLE-D中有一行或多行......依此类推。

假设我在TABLE-Z并且需要知道有关TABLE-A的详细信息。 我是否从TABLE-Z一直到TABLE-A进行SQL查询? 在某些时候,如果说TABLE-Z对于TABLE-A有一个FK,那么查询也不会那么痛苦。 但是,如果我把那个FK,我想我会破坏正常化,对吧?

关于如何处理这个问题的一般建议?

mysql database-design normalization denormalization denormalized
2个回答
5
投票

如果使用复合主键(如果在创建任何表之前正确地对设计建模,则实际会发生这种情况),TableA中的键已经包含在TableZ中(作为最左侧的列)。

然而,民间通常添加代理键而不理解为什么 。 因此,您需要连接所有26个表以建立TableA和TableZ之间的链接

TableA和TableZ之间的额外FK可能与某些中间外键冲突;这就是非规范化(或非规范化)数据具有固有风险并应明智使用的原因。

但是,您通常不会有26级嵌套表。 使用2个,3个甚至6个主键意味着我可以将TableA连接到TableF而不使用任何中间表。

就个人而言,我会使用复合键并避免额外的FK,除非我有一个已知的,可重现的和可证明的瓶颈。 大多数数据库都没有注意到任何差异..所以不要优化


0
投票

在某些情况下,当查询的时间/内存使用比保持表的规范化更重要时,可以对表进行非规范化。 假设您选择了几千行,从表Z到A的所有行都需要一段时间。

基本上我会说这取决于你。 如果保持表规范化很重要,请不要对它们进行非规范化。 如果查询的速度和内存使用更重要,则应该对表进行非规范化。

希望有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.