因此,这更像是关于MySQL数据类型的一般化问题。我想在此示例中正确存储5位数的美国邮政编码( zip_code )。
一个县有10个不同的城市和5个不同的邮政编码。
city | zip code
-------+----------
city 0 | 33333
city 1 | 11111
city 2 | 22222
city 3 | 33333
city 4 | 44444
city 5 | 55555
city 6 | 33333
city 7 | 33333
city 8 | 44444
city 9 | 22222
我通常会将这样的表构造为varchar(50),int(5),而不是三思而后行。
(1)如果我们想确保此表只有5种不同的邮政编码中的一种,我们应该使用枚举数据类型,对吗?
现在想一个更大规模的类似场景。在一个州,有500个城市,有418个不同的邮政编码。
(2)我应该将418个邮政编码存储为枚举数据类型还是 int 并创建另一个表来引用?
答案 0 :(得分:1)
Zipcodes应该是整数... MEDIUMINT是您正在寻找的。 ENUM
只有几千个不同的值不是好主意 - 除了IIRC ENUM
限制为64个不同的值。
您可以创建另一个名为city
的表来存储城市。结构非常简单:只需要城市名称的标准ID +列 - VARCHAR(50)
即可。
当然,您必须将city_id
添加到zipcodes表(附加了外键)。
答案 1 :(得分:0)
如果smallint unsigned(0到65535)太小则更改为mediumint。
create table city(
city_id smallint unsigned not null auto_increment primary key,
name varchar(255) not null
)engine=innodb;
create table city_zip(
city_id smallint unsigned not null,
zip_code smallint unsigned not null,
primary key (city_id, zip_code)
)engine=innodb;