【问题标题】:Database; One or two unique fields?数据库;一两个独特的领域?
【发布时间】:2011-01-01 22:00:18
【问题描述】:

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

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

【问题讨论】:

    标签: database-design sql-server-ce primary-key unique-key


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      您需要一个 ID,它是唯一的、稳定的、能够清楚地识别每一行并可以用作您的主键 - SQL Server 中的 INT IDENTITY 可以完美地做到这一点好吧。

      在每行添加第二个唯一 ID 没有任何意义或收获...

      【讨论】:

      • 好吧,如果由于数据库弄乱了父表的主键导致关系丢失,那么如果没有其他字段与父表对应的字段,则无法重建关系场地。所以数据是没有用的。这就是我的全部动力。但是我因为没有经验而问。如果你告诉我;不,从来没有人这样做过,那好吧,我可以忘记这个想法:)
      • 例如,如果我每天记录一些数据,并且我在另一张表中存储了这一天的一组事件。我将有一个 Day 表和一个 Event 表。 Day 会有字段:ID、Date、SomeParameter。事件将具有以下字段:ID、DayID、Note1、Note2。在这种情况下,我不会将日期保存在事件表中。如果我这样做了,我猜这将是重复的数据。但这也意味着唯一存在的关系是外键 DayID。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-10-18
            • 2014-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多