【问题标题】:How to Design "Country", "Province" and "City" Tables?如何设计“国家”、“省”和“城市”表?
【发布时间】:2011-06-01 22:31:26
【问题描述】:

示例 1:

xTable: xTableID, CountryName, PovinceName, CityName
  • 或

示例 2:

Country: CountryID, CountryName
Province: ProvinceID, ProvinceName
City: CityID, CityName

问题:

  1. 您是否建议我在应用程序级别填充国家、省和城市列表,然后使用示例 1 设计?还是我应该像示例 2 那样在数据库级别填充它?

  2. 城市将根据所选省份(如果有)或国家名称显示。省份(如果有)将根据所选国家显示。省将仅适用于一个国家,而城市将仅适用于一个省/国家。没有一个/多对多的关系,所以我设计如下

注意:每个国家都会有一个城市,但不是每个国家都会有一个省名。

Country: CountryID (PK), CountryName
Province: CountryID (PK - FK), ProvinceName
City: CountryID (PK - FK), CityName

【问题讨论】:

    标签: asp.net sql-server database database-design rdbms


    【解决方案1】:

    我已经修改并成功使用了它:
    http://www.endswithsaurus.com/2009/07/lesson-in-address-storage.html

    写这篇文章的人是一个非常活跃的SO用户:
    BenAlabaster

    【讨论】:

      【解决方案2】:

      我建议您将ProvinceId 和CityId 添加到表Province 和City。一个省可以有很多城市,一个国家也可以有很多省。无需在城市中保留 countryId,ProvinceId 就足够了,因为它将由省触发,而不是由国家触发。

      【讨论】:

      • 并非所有国家都有可以称为省的细分(想想梵蒂冈城)。同样,其他县有多个细分级别(例如英国:组成国家分为县)。
      【解决方案3】:

      您需要从城市到国家、省到国家以及城市到省的直接关系。 所有省份都在一个国家/地区,因此 Province 表需要 CountryID 作为 FK。同样,所有城市都在一个国家/地区,所以那里也一样。 由于并非所有国家/地区都有可称为省的区域,因此它们不能用于从城市导航到国家/地区。 ProvinceID 应该在 City 表中,但允许空值。

      或者,您可以为没有省份的国家/地区建立虚拟省份(例如省份名称 = 无省份),并使用它们将城市与国家联系起来。如果有一个城市在一个有省份的国家中,但它本身并不在一个省份中(如果存在这样的东西,那么该省可能就是城市)。

      【讨论】:

      • 我提出了另一个在某种程度上符合您的建议。我创建了一个包含以下列的新表:ID、CountryID、ProvinceID、CityID。我知道这符合多对多的关系,但看起来更容易处理。您对所述设计有任何 cmet 吗?
      • 我不能说我很喜欢它。这取决于保持实体之间的严格关系对您来说有多重要。表格设计不会限制城市与多个国家/地区相关联,您必须以编程方式执行此操作,这可能会导致错误。如果您想使用您的数据库来维持严格的关系,那么这不是这样做的方法。另一方面,如果您只是对快速而肮脏的修复感兴趣以启动并运行一些代码,那么它可能会正常工作:-) 您确实需要您的 CityID 作为主键。所以我会选择上述两种解决方案之一。
      • 旁注:我假设您想根据国家和省份的选择对数据进行过滤,例如过滤下拉值。为了避免分支代码,虚拟省份解决方案(为每个没有省份的国家创建一个虚构的省份)将是最简单的。您可能想检查一个国家是否只有一个虚构的省份并在这种情况下禁用该省下拉菜单,如果一个国家只有一个省(无论是否虚构),您还可以预加载城市下拉列表。
      • 你是对的。我采用了您的解决方案来防止可能出现的问题......谢谢
      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 2014-01-27
      • 2019-02-15
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      相关资源
      最近更新 更多