我正在上一门名为“数据库系统”的课程,对于我们的课堂项目,我必须设计一个网站。
这是我创建的表的示例:
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'])…不用说,他并没有说服他。
is_numeric($_GET['id'])
由于我在很多教程中都看到过user_id和其他类似的属性(thread_id,comment_id等),并查看了流行软件(例如vbulletin)的数据库架构,因此,还有很多其他(更强)的原因。
所以我的问题是:您如何证明需要一个不为null的自动递增ID作为主键,而不是使用另一个属性(如用户名)?
自动递增主键之所以有用,有以下几个原因:
if ((int)$id > 0) { ... }
$id = (int)$_GET['id']
我想说,当自动递增数字键非常容易使用时,尝试将任何字符串信息用作记录的唯一标识符是一个坏主意。
具有唯一用户名的系统非常适合极少数用户,但是Internet已使它们从根本上崩溃了。当考虑到可能要与网站进行交互的数量庞大的“约翰”人时,要求他们每个人使用唯一的显示名称是荒谬的。这会导致我们看到的糟糕的系统如此频繁地出现,用随机数字和字母来装饰用户名。
但是,即使在强制使用唯一用户名的系统中,对于主键仍然是一个糟糕的选择。想象一个有500个帖子的用户:posts表中的外键将包含用户名,重复了500次。甚至在您认为某人最终可能需要更改其用户名之前,开销都是过高的。
posts