想象一下,我们有一张国家表和一张城市表。当然,一个国家可以有很多城市,但一个城市只能是一个国家,这样一个一对多的关系,具有直观意义:指示一对多表中的“规范”记录
countries
| id | name |
| 1 | Lorwick |
| 2 | Belmead |
cities
| id | country | name |
| 1 | 1 | Marblecrest |
| 2 | 1 | Westacre |
| 3 | 2 | Belcoast |
| 4 | 1 | Rosemarsh |
| 5 | 2 | Vertston |
但是除了我们的一个一对多的关系,我们想描述一下国家首都的一对一关系。如果重要的话,假设首都可能会定期改变,而城市可能随意出现并消失,而城市可能会改变国家。点是,这个数据是不稳定的。
我看到一对夫妇的选择:
添加int列
capital
到countries
不能为空。临:总是一个城市; Con:与城市没有关系,在这个国家没有强制执行这个城市,或者它甚至存在。添加布尔列
capital
到cities
,如果为true则表示城市是关联国家的首都。专业:直接与有问题的城市相关联,没有重复的列指示层次结构;康:很确定这是正常化程度很差,因为没有什么东西可以阻止一个国家的零或一个以上的“资本”。创建一个额外的表
capitals
与列country
和city
和两列(或至少在city
)上的唯一约束。 Pro:在countries
或cities
上感觉更干净,易于加入; Con:仍然不能确保城市在国内,或者不存在。
什么是最规范化和/或最好的方式来表示这种关系?有没有办法确保每个国家都有一个实际存在并居住在该国的资本?我想这是不可能的,在这种情况下,我怎样才能最大限度地减少我的客户端代码的问题?
我目前正在使用SQLite,但是我对广义答案感兴趣,无论底层数据库如何。
我做了一点挖掘,发现Indicating primary/default record in database,但我不认为这真的回答了我的问题。注:如果没有资金(可能没有城市!),这并不坏,但如果有多个,那就不好了。
我只是做了类似的问题进行搜索,发现这个答案 http://stackoverflow.com/a/638947/45767 (他的回答加强为什么我认为逻辑的应用所属的) – JeremyWeir 2012-08-16 04:58:41