在表或类似中使用两个主键

时间:2012-12-10 15:19:36

标签: java database hibernate postgresql

我有一张桌子Users

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

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

也许还应该提一下使用hibernate。

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

ALTER TABLE Users 
ADD CONSTRAINT constraint_name UNIQUE (username);

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

如果用户名可能会改变,那么它就不适合用作主键。

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

即使它不是主键,对用户名也有一个唯一约束是完全没问题的。你很可能也想要一个非空约束。