Rad*_*Rad 4 sql uuid rdbms database-design
我们正在为用户实体设计一个表。唯一不平凡的要求是应该有一个指向用户实体的永久URL(例如,他们的个人资料)。网络上有很多关于int / long vs UUID的信息。但是我仍然不清楚。
话虽如此,以下哪一项更好(相对于上述而言)?
CREATE TABLE users(
pk UUID NOT NULL,
.....
PRIMARY KEY(pk)
);
Run Code Online (Sandbox Code Playgroud)
要么
CREATE TABLE users(
pk INT NOT NULL AUTO_INCREMENT,
id UUID NOT NULL,
.....
PRIMARY KEY(pk),
UNIQUE(id)
);
Run Code Online (Sandbox Code Playgroud)
Ami*_*han 13
使用 UUID 作为pk: 第一个问题是,UUID 占用的9x存储空间大于int。第二个问题是,如果您需要更频繁地排序pk,甚至不要考虑 UUID。UUID aspk不会影响where条件或除 之外的其他条件的时间复杂度sort。
使用intaspk:很容易猜到。暴力攻击者会喜欢这个。这是唯一的问题,也是最大的问题。
使用intas pkbut,同时保留 UUID:如果 UUID 不是,pk那么通过 UUID 搜索的时间复杂度将会增加。尽管,所有关系都将由 维护int,但是,当您通过 UUID 搜索时,这将需要时间。由于关系已开启int,9x存储问题就在这里解决了。
Sar*_*oev 11
我看到一篇很好的文章,解释了使用 UUID 作为主键的优点和缺点。最后,它建议对 PK 使用增量整数,对外部世界使用 UUID。永远不要把你的PK暴露在外面。
\n\n\n在几种不同的环境中使用的一种解决方案对我来说很有效,简而言之,可以同时使用这两种情况。(请注意:这不是一个好的解决方案 \xe2\x80\x94 请参阅\n关于下面对原始帖子的回复的注释)。在内部,让数据库使用小型、高效、数字\n顺序键(无论是 int 还是 bigint)来管理数据关系。然后添加一个用 UUID 填充的列(可能作为插入时的触发器)。在数据库本身的范围内,可以使用常用的 PK 和 FK 来管理关系。
\n但是,当对数据的引用需要暴露给\n外部世界时,即使 \xe2\x80\x9coutside\xe2\x80\x9d 意味着另一个内部系统,\n它们也必须仅依赖于 UUID。这样,如果您确实需要更改\n内部主键,则可以确保其\xe2\x80\x99 的范围仅适用于一个\n数据库。(注:正如克里斯所观察到的,这完全是错误的)
\n我们在另一家公司对客户数据使用了这种策略,只是为了避免 \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n的\xe2\x80\x9c:可猜测的\xe2\x80\x9d问题::(注意:避免与预防不同,请参见下文)。
\n在另一种情况下,我们会生成 \xe2\x80\x9cslug\xe2\x80\x9d 文本(例如在像这样的博客文章中),这将使 URL 更加人性化。如果我们有重复项,我们只需附加一个哈希值。
\n即使作为 \xe2\x80\x9c 辅助主键 \xe2\x80\x9d,以字符串形式使用 UUID 也是错误的:使用内置数据库机制,因为值\n存储为 8 字节整数,我会期望。
\n使用整数是因为它们很有效。此外,还使用 UUID 的数据库实现来进行模糊处理的任何外部引用。
\n
https://tomharrisonjr.com/uuid-or-guid-as-primary-keys-be-careful-7b2aa3dcb439
\nThe*_*ler 10
这个问题非常基于意见,所以这是我的。
我的看法是使用第二个,一个独立于 PK 的 UUID。事情是:
如果出于任何原因,UUID 遭到破坏,您将需要更改它。更改 PK 可能会很昂贵并且有很多副作用。如果 UUID 与 PK 是分开的,那么它的更改(虽然不是微不足道的)产生的影响要小得多。
从我的角度来看,这实际上是一个选择问题,这个问题可以提出基于观点的答案。我经常做的事,即使有多余,我还是在自动增量列上创建了主键(我称之为技术键),以使其在数据库中保持一致,并允许“主键”发生更改,以防在设计阶段出现问题。如果其他任何表中的外键约束都指向该键,则还允许占用更少的空间,并且我使候选键唯一且不为null。
除非您决定,否则通常不会向最终用户显示技术密钥。对于出于某些目的(例如修改日期,创建日期,版本,更改记录的用户等)而仅出于数据库目的保留的其他技术专栏,这可以是相同的。
在这种情况下,我会选择第二种方法,但会稍作修改:
CREATE TABLE users(
pk INT NOT NULL AUTO_INCREMENT,
id UUID NOT NULL,
.....
PRIMARY KEY(pk),
UNIQUE(id)
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1694 次 |
| 最近记录: |