假设TABLE-A在TABLE-B中可以有一行或多行,它们可以在TABLE-C中有一行或多行,它们可以在TABLE-D中有一行或多行......依此类推。
假设我在TABLE-Z并且需要知道有关TABLE-A的详细信息。 我是否从TABLE-Z一直到TABLE-A进行SQL查询? 在某些时候,如果说TABLE-Z对于TABLE-A有一个FK,那么查询也不会那么痛苦。 但是,如果我把那个FK,我想我会破坏正常化,对吧?
关于如何处理这个问题的一般建议?
如果使用复合主键(如果在创建任何表之前正确地对设计建模,则实际会发生这种情况),TableA中的键已经包含在TableZ中(作为最左侧的列)。
然而,民间通常添加代理键而不理解为什么 。 因此,您需要连接所有26个表以建立TableA和TableZ之间的链接
TableA和TableZ之间的额外FK可能与某些中间外键冲突;这就是非规范化(或非规范化)数据具有固有风险并应明智使用的原因。
但是,您通常不会有26级嵌套表。 使用2个,3个甚至6个主键意味着我可以将TableA连接到TableF而不使用任何中间表。
就个人而言,我会使用复合键并避免额外的FK,除非我有一个已知的,可重现的和可证明的瓶颈。 大多数数据库都没有注意到任何差异..所以不要优化
在某些情况下,当查询的时间/内存使用比保持表的规范化更重要时,可以对表进行非规范化。 假设您选择了几千行,从表Z到A的所有行都需要一段时间。
基本上我会说这取决于你。 如果保持表规范化很重要,请不要对它们进行非规范化。 如果查询的速度和内存使用更重要,则应该对表进行非规范化。
希望有所帮助!