17回答

0收藏

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

技术问答 技术问答 641 人阅读 | 17 人回复 | 2022-03-03

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

    使用道具 举报

    回答|共 17 个

    科技创造

    发表于 2022-3-3 23:31:34 | 显示全部楼层

    垃圾内容,路过为证。
    回复

    使用道具 举报

    卡比兽

    发表于 2022-3-5 13:57:26 | 显示全部楼层

    站位支持
    回复

    使用道具 举报

    杨惠珠

    发表于 2022-3-6 15:06:04 | 显示全部楼层

    看起来好像不错的样子
    回复

    使用道具 举报

    蒸蒸

    发表于 2022-3-7 09:29:53 | 显示全部楼层

    为了三千积分!
    回复

    使用道具 举报

    啊菜

    发表于 2022-3-8 04:59:51 | 显示全部楼层

    围观 围观 沙发在哪里!!!
    回复

    使用道具 举报

    明泽

    发表于 2022-3-8 16:14:08 | 显示全部楼层

    是爷们的娘们的都帮顶!大力支持
    回复

    使用道具 举报

    九九的博物学

    发表于 2022-3-8 23:33:57 | 显示全部楼层

    非常好,顶一下
    回复

    使用道具 举报

    天上来客

    发表于 2022-3-9 05:30:54 | 显示全部楼层

    边撸边过
    回复

    使用道具 举报

    没有做过庄稼的农民

    发表于 2022-3-9 10:54:44 | 显示全部楼层

    发发呆,回回帖,工作结束~
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    29055 积分
    9659 主题
    热门推荐