国家/地区:countryID,countryName
区域:regionID,countryID(FK),regionName
城市:cityID,regionID(FK),cityName
前端场景:
我可以在设计中看到一个错误,它只适用于有地区的国家。 如果国家/地区没有区域,则只需填写城市列表并忽略区域列表。
我可以将countryID和regionID放在City表中。但是,我需要你的建议。
从长远来看,最佳解决方案/设计是什么?
答案 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不存在,并忽略重复的条目。只是一个想法。