2013-10-06 70 views
0

假设微软有许多CD,它需要跟踪(包括历史)每张CD的位置。sql server中的冗余数据?

因此,有可能会是一个CDs表所示:

CD_ID | title | ... 
_________________________ 
    ... | ... | ... 

并表示其他表中的 “moves”:

CD_ID | dateMoved | DestinationCountryID | 
___________________________________________ 
    ... | ...  | ... 

这里是我的问题:

如果微软想知道cd Y目前位于:

它可以扫描moves表并获得其最后的county

但是(在这里是我的问题):

东西我的头告诉我,我应该一列添加到CDs表是这样的:

CD_ID | title | CurrentCountryID | ... 
________________________________________ 
    ... | ... |   ...  | ... 

因此,这将对每个Cd项目更具描述性。 (并且很容易找到)。

CurrentCountryID将在每次移动后更新。

这将导致redaundant数据!

因为我们有2个地方代表它的当前位置。

我对不对?我应该添加这个列吗?

(NB如果你要问数量:可以说,我们拥有数以百万计的CD中)

+0

@MitchWheat是的。我已经添加了标签。我想它是关于正常化。 (加上最佳实践解决方案) –

+0

如果问题是“我应该正常化吗?”答案是“是”! –

+0

@MitchWheat我的分贝确实是正常化的。我只是要求那个特定的场景!我应该添加列还是不。 (并且每次扫描 - 移动表) –

回答

2

你应该做的真的取决于你的需要。如果你要经常查看当前的国家并且表现需要良好,我会把当前的国家放在CD表格上。否则,您将不得不每次查询移动表并获取最大日期 - 对性能不太好。

另一方面,如果您很少需要这些信息,我会对其进行标准化并将其保留在移动表中。