回答

收藏

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

技术问答 技术问答 234 人阅读 | 0 人回复 | 2023-09-11

我正在上一门名为数据库系统的课程,我必须为我们的课堂项目设计一个网站。1 f) Z3 W3 M1 |& r  G) u7 C
这是我创建的表的例子:2 |& Q7 U+ |1 K/ k2 V
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)我应该用用用户名作为主键,因为没有两个用户可以使用相同的用户名。8 g2 n! }0 V& b* @
我告诉他用户ID对我来说很方便,因为我调用的时候domain.com/viewuser?id=我只是用以下命令来检查参数,比如5。is_numeric($_GET['id'])…不用说,他没有说服他。
4 G' ?* Z  R; J6 c0 r7 j- m因为我在很多教程中都见过user_id类似于其他属性(thread_id,comment_id等),查看流行软件(如vbulletin)因此,数据库架构还有许多其他原因(更强)。
8 o3 k0 m6 |8 W& g5 z, T所以我的问题是:你如何证明你需要一个null的自动递增ID而不是使用另一个属性(如用户名)作为主键?5 M- O  |. D1 t4 B
                                                               
0 I: C2 ^& c0 r/ Y( \    解决方案:                                                                # H9 x. z3 P; }8 Q# v
                                                                主键自动递增有几个原因:
$ b$ i/ r. n0 k4 P5 g5 X它们允许重复的用户名像堆栈溢出一样
  L0 Q! K, g5 |, f. X" u7 ?$ W: A, N+ O5 M如果用于登录,可以轻松更改用户名(或电子邮件地址)。
7 i+ y% L$ ^' r9 a5 o: s8 [选择、连接和插入比varchar主键要快,因为它维护数字索引要快得多; k6 O# ?$ Q8 \
正如你所说,验证变得非常简单: if ((int)$id > 0) { ... }2 c5 X  I$ K9 F6 i' @3 t- `+ i
输入的卫生条件很简单: $id = (int)$_GET['id']
: t6 H) D6 {# K' T因为外键不需要重复潜在的大字符串值,所以费用要少得多
我想说的是,当自动增加数字键非常容易使用时,尝试使用任何字符串信息作为记录的唯一标识符是一个坏主意。  V' z  s; ^1 ^  b. [' b" P
唯一的用户名系统非常适合少数用户,但是Internet它们从根本上崩溃了。当考虑到大量的约翰人可能想要与网站互动时,要求他们每个人使用唯一的显示名称是荒谬的。这将导致我们看到的糟糕系统如此频繁地出现,用随机数字和字母来装饰用户名。$ |; U  w4 |- p4 j
然而,即使在强制使用唯一用户名的系统中,主键仍然是一个不好的选择。想象一个有500个帖子的用户:posts表中的外键将包含用户名,重复500次。即使在你认为有人最终可能需要更改用户名之前,费用也太高了。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则