3

假设 TABLE-A 在 TABLE-B 中可以有一行或多行,在 TABLE-C 中可以有一行或多行,在 TABLE-D 中可以有一行或多行……等等。

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

有关如何处理此问题的一般建议?

4

2 回答 2

5

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

但是,人们通常会在不了解原因的情况下添加代理键。所以这个你需要加入所有 26 个表来建立 TableA 和 TableZ 之间的链接

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

但是,您通常不会有 26 层的嵌套表。使用 2、3 甚至 6 路主键意味着我可以在没有任何中间表的情况下将 TableA 连接到 TableF。

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

于 2011-12-14T08:26:22.810 回答
0

在某些情况下,当查询的时间/内存使用比保持表的规范化更重要时,对表进行非规范化是可以接受的。假设您要选择数千行,从表 Z 一直到 A 将需要相当长的时间。

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

希望有帮助!

于 2011-12-14T07:39:55.730 回答