【发布时间】:2011-01-01 22:00:18
【问题描述】:
我将使用一个名为 ID 的字段;整数主键。是否还需要指定第二个唯一字段,以便在某些 ID 字段/关系混乱时能够重建表,或者这不是担心?
我正在使用自动增量整数,带有 Sql-CE 数据库。单用户。
【问题讨论】:
标签: database-design sql-server-ce primary-key unique-key
我将使用一个名为 ID 的字段;整数主键。是否还需要指定第二个唯一字段,以便在某些 ID 字段/关系混乱时能够重建表,或者这不是担心?
我正在使用自动增量整数,带有 Sql-CE 数据库。单用户。
【问题讨论】:
标签: database-design sql-server-ce primary-key unique-key
如果您的表的语义需要它,则可以根据需要添加许多唯一键。例如,如果在您的问题域中,所有“Employee”实体都由 Name 唯一标识,那么 Name 应该有一个唯一索引或约束。如果可以有两个员工同名,那么该列当然不应该有唯一性约束。
我现在有一个客户需要按学校、每个财政年度保存信息。他们需要对学校和年份列进行组合的唯一约束(或索引)。有时这两个也是主键,但即使它们不是主键,它们也是唯一的。
【讨论】:
我真的不明白您添加第二个唯一 ID 字段的动机 - 这是为了什么?你从中看到了什么好处??
您需要一个 ID,它是唯一的、稳定的、能够清楚地识别每一行并可以用作您的主键 - SQL Server 中的 INT IDENTITY 可以完美地做到这一点好吧。
在每行添加第二个唯一 ID 没有任何意义或收获...
【讨论】:
每个表都有一个或多个候选键。选择一个作为主键;对其他约束添加 UNIQUE 约束以强制语义正确性。如果某些东西“搞砸了”,它与能够重建表无关。
您还应该对出现在 WHERE 子句中的列建立索引,以便尽可能快地访问。这些是特定于应用程序/用例的。
我的意思的一个例子是地址表。您可能有一个代理主键。您还拥有关于 zip、城市、省、县等不同组合的索引,以提高 SELECT 的效率。您可能还希望将 street1/stree2/city/province/zip 组合设为唯一。取决于您的业务问题。
【讨论】:
一个表应该有尽可能多的键来保证数据完整性。如果在这种情况下“ID”表示代理键,那么答案是肯定的,您通常应该有一个自然键来确保正确规范化数据库中的唯一性 - 否则您可能会复制有意义的业务数据。如果您在自然键之前识别代理键,那么我认为您采用的设计方法存在缺陷。
选择键的良好标准是:熟悉度、简单性和稳定性。考虑到可能的缺点和额外的复杂性,仅在您有充分理由的时候和地点向您的模型添加代理键。
【讨论】:
为了备份而进行冗余可能是一个值得的设计。
但是,正如您的问题所暗示的那样,大多数人不会通过将冗余列加载到架构表中来实现它。这样做有很多开销,并且有很多失败模式,其中重复的 ID 被搞砸了,同时主 ID 被搞砸了。
您最好设计历史记录表,在有限的时间跨度内跟踪 ID 的历史记录。许多人将历史记录表设计为离线存储的暂存区,数据库中只保留最近的历史记录。这种历史可以解决你感兴趣的问题之外的其他问题。
【讨论】: