【发布时间】:2011-05-05 10:38:36
【问题描述】:
我正在学习一门名为“数据库系统”的课程,为了我们的课程项目,我必须设计一个网站。
这是我创建的表的示例:
CREATE TABLE users
(
uid INT NOT NULL AUTO_INCREMENT,
username VARCHAR(60),
passhash VARCHAR(255),
email VARCHAR(60),
rdate DATE,
PRIMARY KEY(uid)
);
教授告诉我“uid”(用户 id)完全没用且没有必要,我应该使用用户名作为主键,因为没有两个用户可以拥有相同的用户名。
我告诉他我使用用户 ID 很方便,因为当我调用类似 domain.com/viewuser?id=5 的东西时,我只需检查参数:is_numeric($_GET['id'])... 不用说他不相信.
由于我在大量教程中看到了 user_id 和其他类似属性(thread_id、comment_id 等),并查看了流行软件(例如 vbulletin)的数据库模式,因此肯定有很多其他(更强大的)原因。
所以我的问题是:与使用用户名等其他属性相比,您如何证明需要非空自动递增 id 作为主键?
【问题讨论】:
-
Joe Celko 总是说同样的话,“你应该尽可能使用有意义的 PK。”
-
你的教授是不是读漫画书比读 PHP/MySQL 多?
-
如果你不是很在乎你的成绩,告诉你的老师,这就是他教理论而不是在行业工作的原因:p
-
您的教授指出您应该使用户名唯一且不可为空,如果要求用户名应该是唯一的,那么您的教授正在做正确的事情。 uid 也可以是一个键,但除非您在某处实际使用它,否则不需要它。设计中更重要的方面应该是实现自然键。所以我同意你教授的评论。
-
我确实担心 USERNAME 的大小。如果你打算让人们使用他们的电子邮件地址作为用户名,那么 60 个字符比可能的最长电子邮件地址要小得多。如果您希望他们使用像 user186909 这样的名称,那么 60 似乎太长了,特别是如果您要将它用作自然键,您希望它尽可能小。
标签: sql database database-design data-modeling