非规范化数据或多列密钥?

时间:2009-09-16 18:08:15

标签: sql-server denormalization compound-key

我正在尝试在实现一个小型的SQL Server '08数据库时进行判断调用。

我正在将平面文件数据库的输出文本文件从旧的COBOL系统转换为上述的SQL Server数据库。它是车辆和房地产贷款的数据库,可以通过贷方ID(七位数字),银行帐号(15位数)和“帐户后缀”(两位数)的组合来唯一识别。

我承认,在数据库管理方面我很天真(说实话,直到我目前的职位,我才真正做到了),而我正试图确定哪两种方法是我最好的选择用于实现将索引到其他几个表的键:

1)使用上述值的三列密钥识别每笔贷款,或者 2)通过实现“键”列来对数据进行非规范化,该列是一个24个字符的字符串,将这三个值组合在一起。

非规范化很难实现,但我无法预见更新异常,因为贷款不能在银行之间来回传递或更改其贷款后缀。这些值的变化保证是一个不同的帐户。

复合键更优雅,但我读过一些论文,暗示这是一件坏事。

那么,哪个选项可能是更好的选择,更重要的是,为什么?

3 个答案:

答案 0 :(得分:3)

我会使用自动生成的代理键,然后在自然键上放置一个唯一索引。这样一来,如果自然密钥发生变化(并且可能会说银行被另一家银行收购),那么它只需要在一个地方进行更改。使用代理键的最重要的事情是确保自然键的唯一性,如果一个exiusts和唯一索引将这样做。

答案 1 :(得分:1)

如果这是不经常更新的参考数据,那么使用多部分键应该没问题。

如果这是高流量的事务数据,则添加代理键(int identity,clustered primary key)并将三部分密钥作为备用密钥。

我不建议实施选项2。

答案 2 :(得分:0)

我建议只使用自动递增的数字代理键。为什么它需要成为其他三个“关键”列的混搭?