国家:countryID,countryName 区域:regionID,countryID(FK),regionName 城市:cityID,regionID(FK),cityName
前端场景:
我可以在设计中看到一个错误,它只适用于有地区的国家。如果国家/地区没有区域,则只需填写城市列表并忽略区域列表。
我可以将countryID和regionID放在City表中。但是,我需要你的建议。
从长远来看,哪种最佳解决方案/设计是稳定的?
如果:
所有国家都有城市。
和:
并非所有国家都有地区。
然后:
只需将countryID和regionID放在City表中即可
是最明显的模型建模方式。如你所知,它不是一个分层模型。有3个独立的关系:
因此,您需要明确捕获它们。但是,您需要逻辑来确保一致性,即防止以下情况:
另一个选择是在同一个表中捕获国家和地区,我们称之为Area
:
AreaID Name Type ParentID
001 'UnitedKingdom' 'Country' NULL
002 'West Midlands' 'Region' 001
这样做可以解决上述问题。每个城市都有一个强制性的FK到Area表,指向适当的'Country'或'Region'条目。它还允许更高的层次结构灵活性;例如可以在区域内添加区域(如果需要),和/或添加其他类型的区域(例如大陆)。但是,您仍然需要强制执行某些逻辑(例如,无法将Region添加为Country的父级)。
两种解决方案都可行;哪个最好将取决于其他要求(例如写入次数与读取次数)。
心连心。
为什么城市表中没有countryID,因此您可以根据当时的需要将地图映射回地区或国家/地区
好吧,如果你把regionID放在你的城市表中,如果你没有区域,它也会在你的城市表中为空。所以没有任何好处。
您询问的是0-To-Many关系,它是一种特殊形式的1对多关系。您允许区域部分为NULL。如果将来你的国家'X'有区域,你以前的设计从长远来看是可行的。
你有两个不同的问题。
虽然这两个问题在某种程度上相互作用,但它们实际上并没有太大关系。
对于数据库设计问题,旧金山的“全名”是
San Francisco, California, United States of America
这与San Francisco, Alabama, United States of America
区别开来,California, United States of America
甚至不存在。
而且,更进一步,加利福尼亚州的全名是
California, Scotland
这与qazxswpoi不同,后者同样不存在。
这对您有用吗?
我更喜欢原始选项:tblCountry - > tblRegion - > tblCity。如果没有Region存在Region = Country添加一个复选框以指示Region不存在并忽略重复条目。只是一个想法。