小编典典

当存在其他唯一字段时,为什么要使用自动递增的主键?

sql

我正在上一门名为“数据库系统”的课程,对于我们的课堂项目,我必须设计一个网站。

这是我创建的表的示例:

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)的数据库架构,因此,还有很多其他(更强)的原因。

所以我的问题是:您如何证明需要一个不为null的自动递增ID作为主键,而不是使用另一个属性(如用户名)?


阅读 193

收藏
2021-04-15

共1个答案

小编典典

自动递增主键之所以有用,有以下几个原因:

  • 它们允许重复的用户名,如堆栈溢出一样
  • 它们允许轻松更改用户名(或电子邮件地址,如果用于登录)。
  • 选择,联接和插入比varchar主键要快,因为它维护数字索引要快得多
  • 正如您提到的,验证变得非常简单: if ((int)$id > 0) { ... }
  • 输入的卫生状况很简单: $id = (int)$_GET['id']
  • 由于外键不必重复潜在的大字符串值,因此开销要少得多

我想说,当自动递增数字键非常容易使用时,尝试将任何字符串信息用作记录的唯一标识符是一个坏主意。

具有唯一用户名的系统非常适合极少数用户,但是Internet已使它们从根本上崩溃了。当考虑到可能要与网站进行交互的数量庞大的“约翰”人时,要求他们每个人使用唯一的显示名称是荒谬的。这会导致我们看到的糟糕的系统如此频繁地出现,用随机数字和字母来装饰用户名。

但是,即使在强制使用唯一用户名的系统中,对于主键仍然是一个糟糕的选择。想象一个有500个帖子的用户:posts表中的外键将包含用户名,重复了500次。甚至在您认为某人最终可能需要更改其用户名之前,开销都是过高的。

2021-04-15