【问题标题】:Country/Region/City Data Model国家/地区/城市数据模型
【发布时间】:2011-10-12 08:01:15
【问题描述】:

国家:countryID、countryName
地区:regionID、countryID (FK)、regionName
城市:cityID、regionID (FK)、cityName

  1. 所有国家都会有城市。
  2. 并非所有国家都有地区。 Region 只会携带以下行 有国家 ID。只有一行的 regionID 为 9999 并且 countryID 为 NULL regionName 为 NONE。
  3. 任何城市都没有regionID,都会引用9999 regionID。

前端场景:

  1. 用户从下拉列表中选择一个国家
  2. 区域下拉列表已填充
  3. 城市下拉列表被填充 - 只有城市属于区域

我发现我的设计有一个错误,它只对有地区的国家有效。 如果国家/地区没有地区,则只需填充城市列表并忽略地区列表。

我可以将 countryID 和 regionID 放在 City 表中。不过,我需要你的建议。

长期稳定的最佳解决方案/设计是什么?

【问题讨论】:

    标签: database database-design data-modeling


    【解决方案1】:

    为什么在 city 表中也没有 countryID,这样您就可以根据当时的需要映射回任何一个地区或国家

    【讨论】:

    • 乍一看似乎很好的解决方案。我怎么知道哪个城市属于哪个地区?
    • 您将 regionId 和 countryID 与城市一起存储
    • 或者你可以创建一个城市到地区的表和一个城市到国家的表
    【解决方案2】:

    好吧,如果你把 regionID 放在你的 city 表中,如果你没有 region,那么它在你的 city 表中也会为 null。所以没有任何好处。

    您询问的是 0 对多关系,这是一种特殊形式的一对多关系。您允许区域部分为 NULL。如果将来您的国家“X”有区域,那么您之前的设计从长远来看是可行的。

    【讨论】:

    • 这是可行的,但是如果它们之间没有区域链接,我如何将城市与国家联系起来......
    • 由于我偏向于拥有 3 个表,因此作为一种解决方法,您可以使用“DEFAULT”之类的区域名称,并将所有城市放在该国家/地区没有区域的名称之下。
    【解决方案3】:

    如果:

    所有国家都会有城市。

    和:

    并非所有国家/地区都有地区。

    然后:

    只需将 countryID 和 regionID 放入 City 表中

    是最明显的建模方式。正如您所建议的,它不是分层模型。有 3 个独立的关系:

    • 地区城市
    • 乡村城市
    • 国家地区

    因此,您需要明确捕获它们。但是,您需要逻辑来确保一致性,即防止出现以下情况:

    • “伯明翰”(城市)位于“西米德兰兹”(地区)
    • “伯明翰”位于“英国”(国家/地区)
    • “西米德兰兹”位于“法国”(国家/地区)。

    另一种选择是在同一个表中捕获国家和地区,我们称之为Area

    AreaID     Name             Type    ParentID
    001    'UnitedKingdom'    'Country'   NULL
    002    'West Midlands'    'Region'    001
    

    这样做可以消除上述问题。每个城市都有一个到 Area 表的强制性 FK,根据需要指向“Country”或“Region”条目。它还允许层次结构具有更大的灵活性;例如可以在区域内添加区域(如有必要),和/或添加其他类型的区域(例如大陆)。但是,您仍然需要强制执行一些逻辑(例如,不能将区域添加为国家/地区的父级)。

    任何一种解决方案都可以工作;哪个最好取决于其他要求(例如写入次数与读取次数)。

    第一次。

    【讨论】:

      【解决方案4】:

      这里有两个不同的问题。

      • 数据库设计问题(如何为城市名称建模)
      • 用户界面设计问题(用户应如何输入城市名称)

      虽然这两个问题有些互动,但它们实际上并没有太大的关系。

      对于数据库设计问题,旧金山的“全称”是

      San Francisco, California, United States of America
      

      这将它与 San Francisco, Alabama, United States of America 区分开来,后者甚至不存在。

      而且,更进一步,加利福尼亚的全名是

      California, United States of America
      

      这将它与 California, Scotland 区分开来,California, Scotland 同样不存在。

      这对您来说是一种有用的方法吗?

      【讨论】:

        【解决方案5】:

        我更喜欢原来的选项:tblCountry -> tblRegion -> tblCity。如果没有 Region 存在 Region = Country 添加复选框以指示 Region 不存在并忽略重复条目。只是一个想法。

        【讨论】:

          猜你喜欢
          • 2012-03-29
          • 1970-01-01
          • 2011-04-28
          • 1970-01-01
          • 2015-11-18
          • 2017-06-30
          • 1970-01-01
          • 1970-01-01
          • 2019-08-05
          相关资源
          最近更新 更多