我在数据库中存储countrycode,在countrycode“eg,ae,bh,qa,kw”列中只有5个选项可以存储。我应该使用char(2)或tinyint或enum('eg','ae','bh','qa','kw')吗?为什么?
guicsvcw1#
使用两个字母的标准国家/地区代码。并且成功了 CHAR(2) CHARACTER SET ascii . 以及ascii\u bin(不允许大小写折叠)和ascii\u general\u ci(用于大小写折叠)之间的争论。那就是2个字节。 ENUM 以及 TINYINT UNSIGNED 可能只有一个字节,但国家总数危险地接近256个。在这一点上,您将需要一个2字节 ENUM 或者 SMALLINT .赞成 CHAR(2) :它是人类可读的(大部分)。而且,如果您需要关于每个国家的更多信息(全名、人口等),您仍然可以有一个带有 PRIMARY KEY(country_code) 而且容易(而且有效) JOIN 需要时。你的5个ccs列表太长,太可能改变;不要使用 ENUM .一般来说, ENUM 应该限制在不太可能改变的非常短的列表中。另外,考虑从以下内容开始 'unknown' 而不是进入战场 NULLable .
CHAR(2) CHARACTER SET ascii
ENUM
TINYINT UNSIGNED
SMALLINT
CHAR(2)
PRIMARY KEY(country_code)
JOIN
'unknown'
NULLable
nr9pn0ug2#
如果你很确定接受值的列表不会增加太多,我会使用枚举来获得更干净的值,避免像'bh''例如'kw'之类的错误输入。
yb3bgrhw3#
ENUM s很好,但在保养方面也有缺点:列出允许的值需要访问表的定义向列表中添加新的可能值需要修改表的结构如果多个表有 CountryCode 列,您需要重新创建另一个 ENUM 因此,只有在列表不打算随时间而改变,并且只有一列使用它的情况下,才应该使用这个方法。在所有其他情况下,使用存储值的引用表并在引用表中创建外键更简单:
CountryCode
-- referential table create table countries (countryCode varchar(2) primary key); insert into countries values ('EG'), ('AE'), ('BH'), ('KW'); -- referencing table create table mytable ( id int, -- and/or other columns of the table ... countryCode varchar(2) references countries(countryCode) );
使用这项技术,您可以获得外键的全部好处和灵活性:易于维护、数据完整性、可能的索引、诸如 on delete cascade ,等等。
on delete cascade
3条答案
按热度按时间guicsvcw1#
使用两个字母的标准国家/地区代码。
并且成功了
CHAR(2) CHARACTER SET ascii
. 以及ascii\u bin(不允许大小写折叠)和ascii\u general\u ci(用于大小写折叠)之间的争论。那就是2个字节。
ENUM
以及TINYINT UNSIGNED
可能只有一个字节,但国家总数危险地接近256个。在这一点上,您将需要一个2字节ENUM
或者SMALLINT
.赞成
CHAR(2)
:它是人类可读的(大部分)。而且,如果您需要关于每个国家的更多信息(全名、人口等),您仍然可以有一个带有PRIMARY KEY(country_code)
而且容易(而且有效)JOIN
需要时。你的5个ccs列表太长,太可能改变;不要使用
ENUM
.一般来说,
ENUM
应该限制在不太可能改变的非常短的列表中。另外,考虑从以下内容开始'unknown'
而不是进入战场NULLable
.nr9pn0ug2#
如果你很确定接受值的列表不会增加太多,我会使用枚举来获得更干净的值,避免像'bh''例如'kw'之类的错误输入。
yb3bgrhw3#
ENUM
s很好,但在保养方面也有缺点:列出允许的值需要访问表的定义
向列表中添加新的可能值需要修改表的结构
如果多个表有
CountryCode
列,您需要重新创建另一个ENUM
因此,只有在列表不打算随时间而改变,并且只有一列使用它的情况下,才应该使用这个方法。在所有其他情况下,使用存储值的引用表并在引用表中创建外键更简单:
使用这项技术,您可以获得外键的全部好处和灵活性:易于维护、数据完整性、可能的索引、诸如
on delete cascade
,等等。