2011-07-25 108 views
3

国家:countryID,国家名称
地区:regionID,countryID(FK),regionName
市:cityID,regionID(FK)的cityName国家/地区/城市数据模型

  1. 所有国家都会有城市。
  2. 不是所有的国家都会有地区。区域将只携带 具有countryID的行。只有一行的区域ID为9999且countryID为NULL regionName为NONE。
  3. 任何城市都没有regionID,它将被引用到9999 regionID。

前端情景: - 仅市属地区

  1. 用户从下拉列表
  2. 地区下拉被填充
  3. 市下拉被填充选取一个国家

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

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

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

回答

3

如果:

所有国家都会有城市。

和:

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

则:

只是把countryID和regionID市台

内是模拟它最明显的方式。正如你所建议的那样,这不是一个分层模型。有3个独立的关系:

  • 市中区
  • 市国家
  • 地区在国家

因此,你需要明确地捕捉它们。但是你需要逻辑,以确保一致性,即防止如情况:

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

另一种办法是捕捉国家和地区,在同一个表,让我们把它叫做Area

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

这样做会删除上面的问题。每个城市都有一个强制FK到Area表,指向适当的'国家'或'地区'条目。它还允许层次结构更灵活;例如可以在区域内添加区域(如有必要),和/或添加其他类型的区域(例如Continent)。但是,您仍然需要强制执行某些逻辑(例如,不能添加区域作为国家/地区的父级)。

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

hth。

0

为什么不能在城里表countryID以及所以你可以映射回无论是国家或地区根据您的需要的时候

+0

似乎很好的解决方案,一见钟情。我怎么知道哪个城市属于哪个地区? – user311509

+0

您将regionId和countryID与城市 – plague

+0

一起存储,或者您可以创建城市到区域表和城市到国家表 – plague

0

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

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

+0

这是可行的,但是如何在城市与国家之间没有区域链接的情况下将城市与国家相关联。 – user311509

+0

由于我偏向于拥有3个表格,作为解决方法,您可以使用像“DEFAULT”这样的地区名称,并将所有城市放在该国家没有地区的地方。 – Shahriar

0

这里有两个不同的问题。

  • 数据库设计问题(如何城市地名模型)
  • 的使用者界面设计问题(用户应该是如何进入城市名)

虽然这两个问题互动一些,他们真的彼此没有太大关系。

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

San Francisco, California, United States of America 

也就是说,比如说,从San Francisco, Alabama, United States of America,它甚至不存在的区别。

,往前一步,加利福尼亚州的全名是

California, United States of America 

也就是说,比如说,从California, Scotland,这同样是不存在的区别。

这是否意味着对您有用的方法?