MySQL中的大型唯一键

3

我正在为我创建的网站实现一个非常简单的用户数据库,自然而然地,我希望尽可能接近“最佳实践”。该数据库使用MySQL,并且我在表定义方面遇到了困难。

CREATE TABLE IF NOT EXISTS 'users' (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'auto incrementing user_id of each user, unique index',
  `user_email` varchar(254) COLLATE utf8_unicode_ci COMMENT 'user''s email',
  `user_password_hash` text COLLATE utf8_unicode_ci NOT NULL COMMENT 'user''s password in salted and hashed format',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_email` (`user_email`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='user data' AUTO_INCREMENT=1 ;

我从php-login.net借用了这个表的定义,并将user_email更改为唯一键(原始定义中它是一个文本字段,非唯一)。

在阅读了一些资料之后,我看到了一些评论,说有一个这么大的唯一键/索引(254 * 3字节)意味着糟糕的数据库设计,而MySQL的最大键长度为1000字节让我认为我做错了什么。 这个数据库能被改进吗?还是现在就很好?

我不知道MySQL中索引的内部工作原理以及涉及的开销量,因此我认为这样一个如此大的键可能并不高效。

感谢您的帮助。


电子邮件并不是您的主键。这是在数据库层面上强制实施唯一电子邮件的唯一合理方式。 - Álvaro González
1个回答

2
将电子邮件设为唯一索引以充当约束并通过电子邮件提高查找效率是可以的,但为什么不减小电子邮件字段的大小呢?您计划拥有多少个长度为254个字符的电子邮件地址,您可以通过将该列设置为varchar(128)来牺牲它们吗?我不会将其用作主键,请保留自动递增的bigint。
至于其他最佳实践,为什么要在用户表中的每个列后添加“user_”?用户表中是否有任何不适用于用户记录的列?只需使用id,email等...在编写查询时,user.id和user.email比user.user_id和user.user_email更好。此外,当您在其他表中使用它们作为外键时,只需将它们称为user_id即可,从而我可以判断外键是user表的id列。在整个数据库中始终保持一致。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接