国家/地区/城市数据模型

问题描述 投票:3回答:5

国家:countryID,countryName 区域:regionID,countryID(FK),regionName 城市:cityID,regionID(FK),cityName

  1. 所有国家都有城市。
  2. 并非所有国家都有地区。 Region只会携带具有countryID的行。只有一行具有regionID 9999且countryID为NULL regionName为NONE。
  3. 任何城市都没有regionID,它将被称为9999 regionID。

前端场景:

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

我可以在设计中看到一个错误,它只适用于有地区的国家。如果国家/地区没有区域,则只需填写城市列表并忽略区域列表。

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

从长远来看,哪种最佳解决方案/设计是稳定的?

database database-design data-modeling
5个回答
3
投票

如果:

所有国家都有城市。

和:

并非所有国家都有地区。

然后:

只需将countryID和regionID放在City表中即可

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

  • 区域内的城市
  • 国家的城市
  • 国家地区

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

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

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

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

这样做可以解决上述问题。每个城市都有一个强制性的FK到Area表,指向适当的'Country'或'Region'条目。它还允许更高的层次结构灵活性;例如可以在区域内添加区域(如果需要),和/或添加其他类型的区域(例如大陆)。但是,您仍然需要强制执行某些逻辑(例如,无法将Region添加为Country的父级)。

两种解决方案都可行;哪个最好将取决于其他要求(例如写入次数与读取次数)。

心连心。


0
投票

为什么城市表中没有countryID,因此您可以根据当时的需要将地图映射回地区或国家/地区


0
投票

好吧,如果你把regionID放在你的城市表中,如果你没有区域,它也会在你的城市表中为空。所以没有任何好处。

您询问的是0-To-Many关系,它是一种特殊形式的1对多关系。您允许区域部分为NULL。如果将来你的国家'X'有区域,你以前的设计从长远来看是可行的。


0
投票

你有两个不同的问题。

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

虽然这两个问题在某种程度上相互作用,但它们实际上并没有太大关系。

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

San Francisco, California, United States of America

这与San Francisco, Alabama, United States of America区别开来,California, United States of America 甚至不存在。

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

California, Scotland

这与qazxswpoi不同,后者同样不存在。

这对您有用吗?


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.