2

我有一张桌子Users

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

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

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

4

4 回答 4

5

通常,您会在用户名上添加“唯一约束”。拥有自动增量 id 并不是严格需要的,但不使用“自然键”是一种常见的做法。请参阅此相关问题:本 机主键还是自动生成的主键?.

于 2012-12-10T15:28:30.240 回答
2

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

ALTER TABLE Users 
ADD CONSTRAINT constraint_name UNIQUE (username);

无需更改主键。id有一个主键很有用。它允许您更改用户名,而无需UPDATE链接表。

UPD:唯一的情况是,当您不想保持两个 PK(一个真正的,另一个“半”PK)时,就是桌子UPDATE/INSERT/DELETE每秒有很多。在这种情况下,2 个索引与 1 个索引的开销可能会很明显。

于 2012-12-10T15:31:51.507 回答
1

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

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

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

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

于 2012-12-10T15:36:28.260 回答
1

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

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

于 2012-12-10T15:30:52.387 回答