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

时间:2014-01-09 08:34:36

标签: sql-server database database-design entity-relationship

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

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

1 个答案:

答案 0 :(得分:4)

以下表格可用于北美地址。县(也包括巴黎和其他类似的地理分区)是以美国为中心的。

addresses表格中,我允许city_idcounty_idNULL,因为根据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_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

请参阅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 codesFIPS region codesISO 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