【问题标题】:Do I need to define a new primary key field for each table?我需要为每个表定义一个新的主键字段吗?
【发布时间】:2009-08-25 03:25:04
【问题描述】:

我有一些数据库表实际上只需要一个引用另一个表的唯一 ID,例如

Customer      Holiday
********      *******
ID (PK)  ---> CustomerID (PK)
Forename      From
Surname       To
....

这些表格(例如假日)仅用于保存有关客户的信息。因此,我是否需要指定一个单独的字段来保存假期的 ID?即

Holiday
*******
ID (PK)
CustomerID (FK)
...

或者,在这种情况下,我可以将 CustomerID 设置为表中的主键吗?

问候, 詹姆斯。

【问题讨论】:

    标签: database database-design database-relations


    【解决方案1】:

    这真的取决于你在做什么。

    如果每个客户只能有 1 个假期,那么可以,您可以将 customerid 作为主键。

    如果每个客户可以有多个假期,那么不,您需要添加一个新的 id 列,使其成为主要列。这使您可以按每个客户选择假期并按其唯一 ID 选择单个记录。

    此外,如果每个客户只能有 1 个假期,我只需将假期信息添加到表格中,因为通常不需要一对一的关系。

    【讨论】:

    • 好的,因此在这个特定示例中,客户可以有多个假期。但是,当客户在该表中只能有 1 条记录时,第一个示例最合适?
    • 詹姆斯 - 可能。如果每个客户只有 1 条记录,我几乎建议将其添加到客户表中。除非有令人信服的理由建立一对一关系。
    • +1 好点!我确实有一张表,每个客户只能有 1 条记录,我将它分成一张表的原因是因为有很多与这个特定表相关的信息,我只是觉得不属于客户表.
    【解决方案2】:

    如果我正确理解了您的问题,那么您只能将 Customer 表用作 Holiday 中的主键,前提是该表中永远不会为该客户提供任何其他假期。换句话说,一个客户的两个假期使用客户 ID 作为主键。

    【讨论】:

      【解决方案3】:

      如果有一个面向对象的程序与这个数据库相关联,那么每个实体(每一行)都必须有一个唯一的键。

      您的第二个设计确保每个 Holiday 实例都可以由 OO 应用程序使用简单的对象关系映射来唯一标识和处理。

      通常,最好确保数据库中的每个实体都有一个唯一的、不可变的、系统分配的(“代理”)键。其他“自然”键可以具有唯一索引、约束等,以适应业务逻辑。

      【讨论】:

        【解决方案4】:

        上一个答案正确,但请记住,每个表中可以有 2 个单独的主键,而“假日”表将具有 CustomerId 的外键。

        然后,您可以在代码中管理为客户分配假期,以确保只能为客户分配一个假期,但这会带来并发问题,即 2 个人在同一时间很可能会导致客户有 2 个假期。

        如果客户只能用假期创建,您甚至可以在客户表中放置假期字段,但这种设计很混乱,不建议这样做

        所以再一次,你的问题 2 中的选项仍然是最好的方法,只是给你你的选择。

        【讨论】:

        • 我不太喜欢依靠代码来强制执行隐式数据库约束。编码缺陷、SQL 脚本和其他因素很容易破坏这些假定的约束/关系。
        • 我也不是粉丝,但对于这样一个简单的问题,值得尽可能多地给出变化
        【解决方案5】:

        在实践中,我发现每个表都应该有一个唯一的主键来标识这些表中的记录。应显式声明与其他表的所有关系。

        这有助于其他人更好地理解关系,尤其是当他们使用工具将架构逆向工程为可视化表示时。

        此外,它还为您在未来扩展解决方案提供了更大的灵活性。您现在可能每个客户只有一个假期,但如果您将客户 ID 作为主键,这将更难更改。

        如果您想在假期表中要求客户的唯一性,请在该外键上创建唯一索引。事实上,这可以提高查询客户 ID 时的性能(尽管我猜你不会看到足够多的记录来注意到这种改进)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-30
          • 1970-01-01
          • 2020-10-18
          • 2016-03-25
          相关资源
          最近更新 更多