回答

收藏

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

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

我正在上一门名为数据库系统的课程,我必须为我们的课堂项目设计一个网站。
! ]" U4 x; O4 h这是我创建的表的例子:
+ `7 M2 h# M* d0 Y$ @8 eCREATE TABLE users(  uid INT NOT NULL AUTO_INCREMENT, username VARCHAR(60), passhash VARCHAR(255), email VARCHAR(60), rdate DATE, PRIMARY KEY(uid));教授告诉我, uid”(用户ID)我应该用用用户名作为主键,因为没有两个用户可以使用相同的用户名。$ v; U4 F. z& m2 s
我告诉他用户ID对我来说很方便,因为我调用的时候domain.com/viewuser?id=我只是用以下命令来检查参数,比如5。is_numeric($_GET['id'])…不用说,他没有说服他。
. ^* w- m' {8 ^4 T: I因为我在很多教程中都见过user_id类似于其他属性(thread_id,comment_id等),查看流行软件(如vbulletin)因此,数据库架构还有许多其他原因(更强)。. l  J( F4 {" q% o' b
所以我的问题是:你如何证明你需要一个null的自动递增ID而不是使用另一个属性(如用户名)作为主键?! `' d! h6 J2 J. M8 K. s. B
                                                                * B* M4 N; v( d% a/ j
    解决方案:                                                                , ~% O2 x+ g; J, M
                                                                主键自动递增有几个原因:" i& T7 G4 M& o" P. O3 l% j0 p
它们允许重复的用户名像堆栈溢出一样1 o  M7 v5 z8 R, C* v$ N
如果用于登录,可以轻松更改用户名(或电子邮件地址)。* y$ g3 G9 A% Q/ X
选择、连接和插入比varchar主键要快,因为它维护数字索引要快得多! _! v6 b- v/ r& `, s$ }
正如你所说,验证变得非常简单: if ((int)$id > 0) { ... }  H8 B9 w  c  N1 ]; a
输入的卫生条件很简单: $id = (int)$_GET['id']
( |& F% t7 W. `3 P9 ?/ b+ L/ t5 t0 k因为外键不需要重复潜在的大字符串值,所以费用要少得多
我想说的是,当自动增加数字键非常容易使用时,尝试使用任何字符串信息作为记录的唯一标识符是一个坏主意。. U' K# Y  T, {3 R# ]
唯一的用户名系统非常适合少数用户,但是Internet它们从根本上崩溃了。当考虑到大量的约翰人可能想要与网站互动时,要求他们每个人使用唯一的显示名称是荒谬的。这将导致我们看到的糟糕系统如此频繁地出现,用随机数字和字母来装饰用户名。
/ G9 b8 k7 {/ [' F0 k然而,即使在强制使用唯一用户名的系统中,主键仍然是一个不好的选择。想象一个有500个帖子的用户:posts表中的外键将包含用户名,重复500次。即使在你认为有人最终可能需要更改用户名之前,费用也太高了。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则