国家、城市、州、邮政编码表设计

use*_*881 0 database sql-server database-design entity-relationship

我有一个数据库,其中有 Country、city、states 和 postcodes 在一个表中,其中包含大量记录。我想规范化数据库结构以避免冗余并删除任何数据重复。我应该拆分数据库并为国家、城市、州和邮政编码制作单独的表吗?

或者在地址表中合并国家、城市、州、邮政编码?

Ben*_*ill 5

下表可用于北美的地址。县(也将包含教区和其他类似的地理分区)以美国为中心。

addresses表中,我允许city_idcounty_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_idcounty_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)

  • 仅供未来可能考虑使用此模型的读者使用。即使在美国,也不是所有的城市都有县,也不是所有的县都有城市,所以要小心城市_县表并始终保持加入它。在弗吉尼亚州,根据法律,你在一个城市或一个县,你不能同时在这两个城市。这是民权时代的遗产,他们使用法律来保持学校的隔离。 (4认同)