回答

收藏

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

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

我正在上一门名为数据库系统的课程,我必须为我们的课堂项目设计一个网站。$ [1 M- q' n5 C/ u9 r5 S3 y; G
这是我创建的表的例子:. F# v5 z+ [0 y" v% U7 i6 p+ m
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)我应该用用用户名作为主键,因为没有两个用户可以使用相同的用户名。
+ L$ x1 H* [: F/ \我告诉他用户ID对我来说很方便,因为我调用的时候domain.com/viewuser?id=我只是用以下命令来检查参数,比如5。is_numeric($_GET['id'])…不用说,他没有说服他。
4 f4 x# {7 T( C9 J' T% l3 p5 }0 m8 B因为我在很多教程中都见过user_id类似于其他属性(thread_id,comment_id等),查看流行软件(如vbulletin)因此,数据库架构还有许多其他原因(更强)。- r* r5 A, u/ ?- M& R( n
所以我的问题是:你如何证明你需要一个null的自动递增ID而不是使用另一个属性(如用户名)作为主键?
: g+ P) l8 i4 \" e% Z9 u                                                                8 j9 \( r4 R2 p5 O% m1 R  @
    解决方案:                                                               
' U" l- _4 C" r& i& L$ f; {                                                                主键自动递增有几个原因:
! ]; q6 A9 J$ m  {4 g9 {它们允许重复的用户名像堆栈溢出一样
& o3 t+ ^1 h! q+ @  ?; |0 _4 k. N. Y! s如果用于登录,可以轻松更改用户名(或电子邮件地址)。
' z: e; M+ E+ l- a9 a1 P' P2 O选择、连接和插入比varchar主键要快,因为它维护数字索引要快得多$ q) D5 S0 `$ I" K
正如你所说,验证变得非常简单: if ((int)$id > 0) { ... }" d$ g) P9 ?# G
输入的卫生条件很简单: $id = (int)$_GET['id']
1 L/ K" M) H2 z: N! h" p因为外键不需要重复潜在的大字符串值,所以费用要少得多
我想说的是,当自动增加数字键非常容易使用时,尝试使用任何字符串信息作为记录的唯一标识符是一个坏主意。6 }2 j2 y* A  g& @; ?
唯一的用户名系统非常适合少数用户,但是Internet它们从根本上崩溃了。当考虑到大量的约翰人可能想要与网站互动时,要求他们每个人使用唯一的显示名称是荒谬的。这将导致我们看到的糟糕系统如此频繁地出现,用随机数字和字母来装饰用户名。
7 @8 \% f. {2 X, K8 f7 n+ {然而,即使在强制使用唯一用户名的系统中,主键仍然是一个不好的选择。想象一个有500个帖子的用户:posts表中的外键将包含用户名,重复500次。即使在你认为有人最终可能需要更改用户名之前,费用也太高了。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则