use*_*881 0 database sql-server database-design entity-relationship
我有一个数据库,其中有 Country、city、states 和 postcodes 在一个表中,其中包含大量记录。我想规范化数据库结构以避免冗余并删除任何数据重复。我应该拆分数据库并为国家、城市、州和邮政编码制作单独的表吗?
或者在地址表中合并国家、城市、州、邮政编码?
下表可用于北美的地址。县(也将包含教区和其他类似的地理分区)以美国为中心。
在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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
见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)
Run Code Online (Sandbox Code Playgroud)
请参阅FIPS 州代码、FIPS 区域代码和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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8625 次 |
最近记录: |