为域对象分配唯一标识符有哪些做法?

时间:2012-10-12 21:13:22

标签: mysql database identity

  

可能重复:
  How to choose my primary key?

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

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

用户名和电子邮件唯一标识用户的实例。在我的数据库中,它们应该用作主键还是应该为每个实例生成不同的唯一标识符。据我所知,在SELECT上,比较字符串比比较数字要慢。我不应该使用自我指定的int,long,double等,或者在用户的ID列中使用AUTO_INCREMENT吗?那么使用UUID(再次使用长字符串的问题)?我的问题也适用于我稍后可能添加的其他所有域类。

3 个答案:

答案 0 :(得分:1)

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

示例:公司创建一个包含社会安全号码的“用户”表。这些应该是每个人独有的。但是,在某些时候,当用户输入时,ssn被错误键入。错误键入的号码尚不存在,并且保存了记录。一段时间后,另一个用户试图输入他们的ssn,它实际上与先前错误键入的数字相同。用户可能无法实际保存其个人资料并继续,直到公司自己找到并解决此问题。鉴于此问题,该公司决定放宽对ssn的“独特”约束。如果ssn不是主键,这将相对容易 - 只需删除唯一约束。如果主键是ssn,那将更难。

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

CREATE TABLE Persons
 (
 person_id int NOT NULL AUTO_INCREMENT,
 LastName varchar(255) NOT NULL,
...

答案 1 :(得分:1)

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

此外,使用用户名或电子邮件将使用外键“删除”数据库中的其他表,使这些表更难以编制索引。将它设为int或long并使用AUTO_INCREMENT。

答案 2 :(得分:0)

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