这是我的带有自动增量列的语言表定义(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 约束保证不能有两行具有相同的值,也就是说,有例如,“English”这个词不可能在列中出现两次,这当然是一件好事。但是这样做的问题是另一个表中引用语言列的外键字段必须存储字符串而不是 ID 号。这仅仅意味着引用表将把整个内容存储在列中,如果应用程序可以提供一个下拉组合框列表,其中包含预先填充的唯一值,那么拥有语言表似乎没有意义。但,
另一方面,第二种方法听起来更实用。为了确保唯一性,我们可以使用 UNIQUE 约束,并且在引用列中使用整数而不是字符串,这往往会占用更少的内存,据我所知,它们在搜索操作期间比字符串快得多。
请帮我弄清楚这一点。