-3

可能重复:
如何选择我的主键?

我有一个具有以下属性的用户类:

  • 用户名(唯一)
  • 密码
  • 电子邮件(唯一)
  • 年龄

用户名和电子邮件唯一标识用户的一个实例。在我的数据库中,这些应该用作主键还是应该为每个实例生成不同的唯一标识符。据我所知,在 onSELECT的情况下,比较字符串比比较数字要慢。然后我不应该使用自分配的 int、long、double 等,还是AUTO_INCREMENT在用户的 ID 列中使用?使用 UUID 怎么样(又是长字符串的问题)?我的问题也适用于我以后可能添加的所有其他域类。

4

3 回答 3

1

主键应该与任何其他字段分开,应该没有业务价值并且应该是唯一的整数。

示例:一家公司创建一个带有社会安全号码的“用户”表。这些对每个人来说应该是独一无二的。然而,在某些时候,当用户输入 ssn 时,ssn 会被错误键入。输入错误的号码不存在,记录已保存。一段时间后,另一个用户尝试输入他们的 ssn,它实际上与之前输入错误的数字相同。在公司自己发现并解决此问题之前,用户可能无法实际保存他们的个人资料并继续。鉴于这个问题,公司决定在这一点上放宽对 ssn 的“唯一”限制。如果 ssn 不是主键,这将相对容易 - 只需删除唯一约束。如果主键是 ssn,这将更难。

将该字段定义为 auto_increment,mysql 将处理它:

CREATE TABLE Persons
 (
 person_id int NOT NULL AUTO_INCREMENT,
 LastName varchar(255) NOT NULL,
...
于 2012-10-12T21:18:54.613 回答
1

生成索引时,我尝试遵循以下提示:http ://cherry.world.edoors.com/CzyAhL90b5RA (MySQL 索引提示列表)

此外,使用用户名或电子邮件将使用外键“弄乱”数据库中的其他表,从而使这些表也更难以索引。将其设为 int 或 long 并使用 AUTO_INCREMENT。

于 2012-10-12T21:20:42.757 回答
0

考虑由唯一列组成的复合主键,而不是代理键。这将具有根据您的唯一性要求维护数据完整性的额外好处。

于 2012-10-12T21:28:23.903 回答