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 中索引的内部工作原理以及所涉及的开销量,所以我认为这么大的键很可能效率不高。

谢谢您的帮助。

4

1 回答 1

2

使电子邮件成为唯一索引可以作为约束并改善电子邮件查找,但为什么不减小电子邮件字段的大小呢?您计划拥有多少个 254 字符的电子邮件地址,您可以通过将列设为 varchar(128) 来牺牲它们吗?我不会将它用作您的主键,请保持您的自动递增 bigint。

至于其他最佳实践,为什么要附加user_到用户表中的每一列?用户表中是否有任何列不适用于用户记录?只需使用idemail...在编写查询时user.id, anduser.emailuser.user_idand更干净user.user_email。此外,当您在其他表中使用 as 外键时,您只需将它们称为user_id,从中我可以看出外键是表的iduser。在整个数据库中始终如一地执行此操作。

于 2012-11-29T17:23:28.047 回答