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

时间:2011-07-25 05:43:40

标签: database database-design data-modeling

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

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

  4. 前端场景:

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

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

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

      从长远来看,最佳解决方案/设计是什么?

5 个答案:

答案 0 :(得分:3)

如果:

  

所有国家/地区都有城市。

  

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

然后:

  

将countryID和regionID放在City表中

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

  • 地区城市
  • 国家城市
  • 国家/地区

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

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

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

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

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

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

第h

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

这里有两个不同的问题。

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

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

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

San Francisco, California, United States of America

这可以区别于San Francisco, Alabama, United States of America,甚至不存在。

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

California, United States of America

这可以区别于California, Scotland,它同样不存在。

这是否对您提出了有用的方法?

答案 4 :(得分:0)

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