回答

收藏

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

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

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

本版积分规则