【问题标题】:Using two primary keys in a table or similar在一个表或类似的表中使用两个主键
【发布时间】:2012-12-10 15:19:36
【问题描述】:

我有一张桌子Users

我有一个自动增加的长 id 作为主 ID。现在我需要用户名也是唯一的。最佳做法是什么?

我应该只保留用户名并删除数字 id 吗?我应该以某种方式使它们都独一无二吗?你有什么推荐的?

也许还应该提到使用休眠。

【问题讨论】:

  • 把用户名也作为主键怎么样?
  • 您只能有一个主键,它是 1 列或多列的组合。如果用户名/id 是主键,那么您可以使用 (1,Dave) 和 (2,Dave) 之类的键,这将允许非唯一用户名。
  • 我认为您使用 Hibernate 并没有什么不同;应在数据库中强制执行数据完整性。但是,您可能希望在用户名字段的@Column 注释上使用unique 属性;我不相信它会有任何功能效果,但它可以作为文档。

标签: java database hibernate postgresql


【解决方案1】:

通常您会在用户名上添加“唯一约束”。拥有自动增量 id 并不是严格需要的,但不使用“自然键”是一种常见的做法。请参阅此相关问题:Native primary key or auto generated one?

【讨论】:

    【解决方案2】:

    要保持用户名的唯一性,您只需:

    ALTER TABLE Users 
    ADD CONSTRAINT constraint_name UNIQUE (username);
    

    无需更改主键。拥有id 主键很有用。它允许您更改用户名,而无需在链接表上使用UPDATE

    UPD:唯一的情况是,当您不想保持两个 PK(一个是真实的,另一个是“半”PK)时,表格每秒会获得大量 UPDATE/INSERT/DELETE。在这种情况下,2 个索引与 1 个索引的开销可能会很明显。

    【讨论】:

      【解决方案3】:

      用户名可以更改吗?如果没有,您可以将其用作主键。这将是一个自然键,因此,在我看来,它比您当前使用的代理键更好。

      如果用户名可以更改,那么它不适合用作主键。

      由于您无法知道未来可能出现的所有情况,我怀疑您不能排除用户名可能需要更改的可能性。因此,代理键是面向未来的选择。

      即使用户名不是主键,也可以对用户名进行唯一约束。您很可能还需要一个非空约束。

      【讨论】:

        【解决方案4】:

        这取决于您的应用程序是如何使用的。如果用户名可以更改,我建议使用 ID 作为主键 - 您可以随时在代码中进行一些检查,以确保用户名在创建时是唯一的。

        在从数据库访问数据时使用 ID(主键)是一种常见的做法,因为如果要使用其他任何东西,可能会引入难以调试的意外行为。

        【讨论】:

        • 登录怎么样?不能用身份证,可以吗?
        • 登录时只需搜索唯一的用户名,当您使用 Hibernate 时,返回并存储在 User 对象中。这将带来用户的 ID,然后您可以将其用于以后需要该用户的任何其他任务。
        猜你喜欢
        • 2010-09-07
        • 2020-08-14
        • 2014-07-16
        • 2013-12-29
        • 2020-06-27
        • 1970-01-01
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多