0

我将使用一个名为 ID 的字段;整数主键。是否还需要指定第二个唯一字段,以便在某些 ID 字段/关系混乱时能够重建表,或者这不是担心?

我正在使用带有 Sql-CE 数据库的自动增量整数。单用户。

4

5 回答 5

3

如果你的表的语义需要它,那么添加你可能需要的许多唯一键。例如,如果在您的问题域中,所有“Employee”实体都由 Name 唯一标识,则 Name 应具有唯一索引或约束。如果可以有两个同名的员工,那么当然,该列不应该有唯一性约束。

我现在有一个客户需要按学校、每个财政年度保存信息。他们需要对学校和年份列进行组合的唯一约束(或索引)。有时这两个也是主键,但即使它们不是主键,它们也是唯一的。

于 2011-01-01T22:10:52.923 回答
1

我真的不明白您添加第二个唯一 ID 字段的动机 - 这是为了什么?你从中看到了什么好处??

你需要的是一个ID唯一的、稳定的、能够清楚地识别每一行并且可以作为你的主键INT IDENTITY——SQL Server 中的一个非常好。

我看不到向每一行添加第二个唯一 ID 有任何意义或收获......

于 2011-01-01T22:03:54.430 回答
1

每个表都有一个或多个候选键。选择一个作为主键;对其他约束添加 UNIQUE 约束以强制语义正确性。如果某些东西“搞砸了”,它与能够重建表格无关。

您还应该对出现在 WHERE 子句中的列进行索引,以尽可能快地进行访问。这些是特定于应用程序/用例的。

我的意思的一个例子是地址表。您可能有一个代理主键。您还拥有关于 zip、城市、省、县等不同组合的索引,以提高 SELECT 的效率。您可能还希望将 street1/stree2/city/province/zip 组合设为唯一。取决于您的业务问题。

于 2011-01-01T22:06:35.807 回答
1

一个表应该有尽可能多的键来保证数据完整性。如果在这种情况下“ID”表示代理键,那么答案是肯定的,您通常应该有一个自然键来确保正确规范化数据库中的唯一性 - 否则您可能会复制有意义的业务数据。如果您在自然键之前识别代理键,那么我认为您采用了一种有缺陷的设计方法。

选择键的良好标准是:熟悉度、简单性和稳定性。考虑到可能的缺点和额外的复杂性,仅在您有充分理由的时候和地点向您的模型添加代理键。

于 2011-01-02T04:07:31.417 回答
1

为备份而进行的冗余可能是一个值得的设计。

但是,正如您的问题所暗示的那样,大多数人不会通过将冗余列加载到模式表中来实现它。这样做有很多开销,并且有很多失败模式,其中重复 ID 被搞砸了,同时主 ID 被搞砸了。

您最好设计历史记录表,在有限的时间跨度内跟踪 ID 的历史记录。许多人将历史记录表设计为离线存储的暂存区,数据库中只保留最近的历史记录。这种历史可以解决你感兴趣的问题之外的其他问题。

于 2011-01-02T14:17:12.793 回答