我正在选修一门名为“数据库系统”的课程,对于我们的课程项目,我必须设计一个网站。
下面是我创建的一个表的示例:
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等),并且查看了流行软件的数据库模式(例如。肯定还有很多其他(更强大的)原因。
所以我的问题是:你如何证明需要一个不为空的自动递增id作为主键,而不是使用另一个属性,比如用户名?
发布于 2010-11-05 11:46:13
如果用户名是主键,并且用户更改了他/她的用户名,则需要更新所有具有对users表的外键引用的表。
发布于 2010-11-05 20:06:50
如果你已经向你的教授证明,为每个用户分配一个唯一的任意整数对你的应用程序是有价值的,那么他说这是“完全无用和不必要的”,当然是错误的。
然而,也许你没有理解他的意思。如果他告诉你的要求是“两个用户不能有相同的用户名”,那么你就没有满足这个要求。
真诚的感谢你张贴你的SQL,它是非常有用的,但大多数人不会为此而烦恼。
使用您的表,我可以这样做:
INSERT INTO users (username) VALUES (NULL);
INSERT INTO users (username) VALUES (NULL);
INSERT INTO users (username) VALUES (NULL);
INSERT INTO users (username) VALUES (NULL);
INSERT INTO users (username) VALUES (NULL);
这将导致以下结果:
SELECT uid, username, passhash, email, rdate
FROM users;
uid username passhash email rdate
1 <NULL> <NULL> <NULL> <NULL>
2 <NULL> <NULL> <NULL> <NULL>
3 <NULL> <NULL> <NULL> <NULL>
4 <NULL> <NULL> <NULL> <NULL>
我认为这就是你的教授试图表达的观点:如果不在username
上强制使用自然密钥,你就根本没有任何数据完整性。
如果我是教授,我也会敦促你从你的设计中删除可以为空的列。
发布于 2010-11-05 11:53:24
这通常被称为surrogate key,它有很多优点。其中之一是将数据库关系与应用程序数据隔离。更多细节和相应的缺点可以在上面提供的wiki链接中找到。
https://stackoverflow.com/questions/4103433
复制相似问题