表链,何时反规范化?

时间:2011-12-14 07:33:00

标签: mysql database-design normalization denormalization denormalized

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:0)

如果查询的时间/内存使用比保持表的规范化更重要,则可以对表进行非规范化。假设您选择了几千行,从表Z到A一直走了很长一段时间。

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

希望有所帮助!