gpt4 book ai didi

mysql - 自增列还是 UNIQUE 约束?

转载 作者:行者123 更新时间:2023-11-29 01:05:33 26 4
gpt4 key购买 nike

这是我的带有自动递增列的语言表定义(DBMS 是 MySQL):

DROP TABLE IF EXISTS languages;
CREATE TABLE IF NOT EXISTS languages (
language VARCHAR(16) NOT NULL,
PRIMARY KEY (language)
) ENGINE=InnoDB;

这是它的另一个版本,但应用了 UNIQUE 约束:

DROP TABLE IF EXISTS languages;
CREATE TABLE IF NOT EXISTS languages (
language_id TINYINT NOT NULL AUTO_INCREMENT,
language VARCHAR(16) NOT NULL,
PRIMARY KEY (language_id),
UNIQUE (language)
) ENGINE=InnoDB;

对于哪个版本更好用,我有两种想法。一方面,根据数据库设计理论,第一个定义似乎是正确的,只是因为其中没有多余的垃圾,并且 PRIMARY KEY 约束保证不能有两行具有相同的值,也就是说,有不可能,例如,“英语”这个词可以在列中出现两次,这当然是一件好事。但这样做的问题是,另一个表中引用语言列的外键字段必须存储字符串而不是 ID 号。这仅仅意味着引用表将把整个内容存储在列中,如果应用程序可以提供一个下拉组合框列表,其中包含预填充的唯一值,那么使用语言表似乎没有意义。但是,从理论上讲,第一种方式还是比较正确的。

另一方面,第二种方法听起来更实用。为了确保唯一性,我们可以使用 UNIQUE 约束,我们在引用列中使用整数而不是字符串,这往往占用更少的内存,而且据我所知,它们在搜索操作期间比字符串快得多。

请帮我弄清楚这一点。

最佳答案

我在这里问过类似的问题 Should an SQL Dictionary table have an IDENTITY column

在那种情况下,我发现没有 ID 列是正确的决定,因为我绝不会通过代码中 PK 以外的任何其他方式引用数据。那就是没有依赖于该表的外键。

如果您正在查找一些任意数据或将其作为外键引用,我总是赞成使用 id 列,因为它会减少数据库的大小并且可以立即识别它对于任何具有最基本数据库知识的人来说都是外键。

关于mysql - 自增列还是 UNIQUE 约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15934584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com