2

说TABLE-A可以在TABLE-B中有一个或多个行,TABLE-C中可以有一个或多个行,TABLE-D中可以有一行或多行,等等。表链,什么时候反规范化?

说我在TABLE-Z并需要知道TABLE-A的细节。我是否可以创建一个从TABLE-Z一直到TABLE-A的SQL查询?在某些时候,如果TABLE-Z对TABLE-A有一个FK,这样查询不会那么痛苦,那么也许会很好。但是,如果我把这个FK,我想我会打破正常化,对吧?

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

回答

4

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

但是,民间人士通常在不理解的情况下添加代理键为什么。因此,您需要加入所有26个表以建立TableA和TableZ之间的链接。TableA和TableZ之间的额外FK可能与某些中间外键冲突;这就是为什么非规范化(或非标准化)数据存在固有风险并应慎重使用。

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

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

0

在某些情况下,如果查询的时间/内存使用比保持表的规范化更重要,则可以对表进行非规范化。假设你选择了几千行,从表Z到A的整个过程都需要很长时间。

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

希望有帮助!

+0

所以它取决于这个“需要相当长的时间”的价值? – StackOverflowNewbie 2011-12-14 07:44:26