我有一个数据库,其中有一个国家,城市,州,邮政编码在一个表中有大量记录。我想规范化数据库结构以避免冗余并删除任何数据重复。我应该拆分数据库并为国家,城市,州和邮政编码制作单独的表吗?
或者在地址表中合并国家,城市,州,邮政编码?
答案 0 :(得分:4)
以下表格可用于北美地址。县(也包括巴黎和其他类似的地理分区)是以美国为中心的。
在addresses
表格中,我允许city_id
和county_id
为NULL
,因为根据HLGEM的评论,您可以参加城市或一个县,但不是两个都在弗吉尼亚州。应用程序代码需要强制执行以下规则:至少其中一个字段不是NULL
。
addresses
id unsigned int(P)
street varchar(50)
extended varchar(50) // Default NULL
city_id unsigned int(F cities.id) Default NULL
county_id unsigned int(F counties.id) Default NULL
zip varchar(6) // Will handle all north American zips
zip4 char(4) // Default NULL
lat decimal(10,8) // Allows for ~1mm accuracy at equator. Default NULL
lon decimal(11,8) // Allows for ~1mm accuracy at equator. Default NULL
cities
id unsigned int(P)
state_id unsigned int(F states.id)
name varchar(45)
fips unsigned int // Default NULL
census_code unsigned int // Default NULL
census_class_code char(2) // Default NULL
gsa_code unsigned int // Default NULL
opm_code unsigned int // Default NULL
city_id
和county_id
构成主键,是各自表的外键。
cities_counties
city_id unsigned int(F cities.id) ---\_(P)
county_id unsigned int(F counties.id)--/
counties
id unsigned int(P)
state_id unsigned int(F states.id)
name varchar(50)
fips unsigned int // Default NULL
请参阅http://en.wikipedia.org/wiki/ISO_3166-1
countries
id char(2)(P)
iso3 char(3)(U)
iso_num char(3)(U)
name varchar(44)(U)
请参阅FIPS state codes,FIPS region codes和ISO 3166-2。
states
id unsigned int(P)
country_id char(2)(F countries.id)
code varchar(3)(I)
name varchar(45)
fips unsigned int // Default NULL