【问题标题】:Denormalize data or multiple-column key?非规范化数据或多列键?
【发布时间】:2009-09-17 05:23:31
【问题描述】:

我正在尝试在实现一个小型 SQL Server '08 数据库时做出判断。

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

我承认我在数据库管理方面非常天真(老实说,直到我目前的职位之前我还没有真正做到这一点),我正在尝试确定两种方法中的哪一种是我的最佳选择用于实现将索引到其他几个表的键:

1) 使用上述值的三列键标识每笔贷款,或
2) 通过实现一个“key”列来反规范化数据,该列是一个由三个值组合而成的 24 个字符的字符串。

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

复合键更优雅,但我读过一些论文表明它是一件坏事。

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

【问题讨论】:

    标签: sql-server denormalization compound-key


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      如果这是高流量事务数据,则添加代理键(int identity,集群主键)并将三部分键作为备用键。

      我根本不建议实施选项 2。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 您也可以将列设为 GUID,而不是自动增加密钥。这应该允许您保持唯一性,而不必担心关键字段包含的内容,因为它会为新记录自动生成。
        • 如果您选择使用 GUID,请使用 NEWSEQUENTIALID() 而不是 NEWID() 填充它。
        猜你喜欢
        • 2013-01-18
        • 1970-01-01
        • 2013-08-21
        • 2012-11-18
        • 1970-01-01
        • 2017-01-14
        • 2010-10-06
        • 1970-01-01
        • 2013-12-11
        相关资源
        最近更新 更多