【问题标题】:Country, city, state, Post code table design国家、城市、州、邮政编码表设计
【发布时间】:2014-01-27 16:56:40
【问题描述】:

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

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

【问题讨论】:

  • 每个字段有多少个重复项?您可以将其标准化到街道级别,但如果没有您的数据的一些迹象,就不可能提出建议。了解应用程序也很重要 - 找到居住在特定邮政编码中的每个人对简单存储用户地址有不同的要求
  • 例如一个国家有 100 万用户,一个城市三个是 5 万用户,类似情况与州、邮政编码。
  • 我遵循这个建议,在不知道其中数据的情况下设计数据库真的很难。您应该比较您将获得的空间和速度,以及您将添加的复杂性。您将访问这些值多少次,您是每次都使用它们还是只使用一次城市,只使用州......。每列一个表意味着每个地址每列 1 个连接和 1 个索引搜索。

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


【解决方案1】:

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

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

【讨论】:

  • 仅供可能正在考虑使用此模型的未来读者使用。即使在美国,也不是所有的城市都有县,也不是所有的县都有城市,所以要小心 city_counties 表并始终加入它。在弗吉尼亚州,根据法律,你要么在一个城市,要么在一个县,你不能同时在这两个地方。这是民权时代的遗产,他们利用法律将学校隔离开来。
  • @HLGEM - 感谢您的补充!我自己很少使用县信息,但我将其包含在这样的帖子中,因为有人可能需要它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2013-04-05
相关资源
最近更新 更多