我有一个具有以下属性的User类:
用户名和电子邮件唯一标识用户的实例。在我的数据库中,它们应该用作主键还是应该为每个实例生成不同的唯一标识符。据我所知,在SELECT
上,比较字符串比比较数字要慢。我不应该使用自我指定的int,long,double等,或者在用户的ID列中使用AUTO_INCREMENT
吗?那么使用UUID(再次使用长字符串的问题)?我的问题也适用于我稍后可能添加的其他所有域类。
答案 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,而不是代理键。这将具有根据您的唯一性要求维护数据完整性的额外好处。