Database design 数据库一个或两个唯一的字段?

Database design 数据库一个或两个唯一的字段?,database-design,sql-server-ce,primary-key,unique-key,Database Design,Sql Server Ce,Primary Key,Unique Key,我将使用名为ID的字段;整数主键。是否还需要指定第二个唯一字段,以便在某些ID字段/关系出错时能够重新构建表,或者这不成问题 我使用的是自动递增整数,带有Sql CE数据库。单个用户。我真的不明白您添加第二个唯一ID字段的动机-为什么??你从中看到了什么好处 您需要的是一个唯一、稳定的ID,它能够清楚地标识每一行,并且可以作为您的主键——SQL Server中的INT标识可以很好地做到这一点 我看不出在每行中添加第二个唯一ID有什么意义或好处…每个表都有一个或多个候选键。选择一个作为主键;在其他

我将使用名为ID的字段;整数主键。是否还需要指定第二个唯一字段,以便在某些ID字段/关系出错时能够重新构建表,或者这不成问题


我使用的是自动递增整数,带有Sql CE数据库。单个用户。

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

您需要的是一个唯一、稳定的
ID
,它能够清楚地标识每一行,并且可以作为您的主键——SQL Server中的
INT标识可以很好地做到这一点


我看不出在每行中添加第二个唯一ID有什么意义或好处…

每个表都有一个或多个候选键。选择一个作为主键;在其他约束上添加唯一约束以强制语义正确性。如果有什么东西“乱七八糟”的话,这与重建桌子无关

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


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

如果表的语义需要,请根据需要添加任意多个唯一键。例如,如果在您的问题域中,所有“员工”实体都由名称唯一标识,那么名称上应该有一个唯一的索引或约束。如果可以有两个同名的员工,那么当然,该列上不应有唯一性约束


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

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


选择键的好标准是:熟悉、简单和稳定。考虑到可能的缺点和额外的复杂性,只有在有充分理由的情况下才向模型中添加代理密钥。

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

然而,正如您的问题所示,大多数人并不是通过将冗余列加载到模式表中来实现它的。这样做会有很多开销,而且有很多故障模式,在主ID出错的同时复制ID出错


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

如果由于数据库弄乱了父表的主键而丢失了关系,那么如果没有其他字段具有与父表字段对应的字段,则无法重建关系。因此,这些数据是无用的。这就是我的动机。但我问是因为缺乏经验。如果你告诉我;不,没有人会这样做,那么好吧,我可以忘记这个想法:)例如,如果我每天记录一些数据,并且我有一组当天的事件存储在另一个表中。我会有一个日表和一个事件表。Day将包含以下字段:ID、Date、SomeParameter。事件将包含以下字段:ID、DayID、Note1、Note2。在这种情况下,我不会将日期保存在事件表中。如果我这样做了,我想这将是重复的数据。但这也意味着唯一存在的关系是外键DayID。