2009-09-16 64 views
0

我想在实现一个小型的SQL Server '08数据库时作出判断呼叫。非规范化数据或多列键?

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

我承认在数据库管理方面我非常天真(说实话,直到我现在的位置我还没有真正完成),并且我试图确定哪种方法是我最好的选项用于实现键,这将索引到其它几个表:使用上述值的三列键

1)确定每个贷款,或
2)通过实施“键”列,其是进行非标准化的数据一个包含三个值的24个字符的字符串。

反常规是丑陋的,但我不能预料会发生更新异常,因为贷款不能在银行之间来回传递或更改其贷款后缀。这些值的变化保证是不同的账户。

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

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

回答

3

我会使用一个自动生成的代理键,然后把一个唯一的索引放在自然键上。这样,如果自然关键的变化(如果说一家银行被另一家银行买走了),那么它只需要在一个地方改变。使用代理键最重要的事情是确保自然键的唯一性,如果一个exiusts和独特的索引会做到这一点。

0

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

+0

而不是自动递增密钥,您也可以使该列成为GUID。这应该允许您保持唯一性,而不必担心关键字段包含的内容,因为它会自动为新记录生成。 – 2009-09-16 18:25:51

+0

如果您选择使用GUID,请使用NEWSEQUENTIALID()填充而不使用NEWID()。 – 2009-09-16 20:22:09

1

如果这是不会经常更新的引用数据,那么使用多部分密钥应该没问题。

如果是这种高流量的交易数据,然后添加一个代理键(INT身份,集群主键),使三部分键的替代密钥。

我不会建议实施选项2。