想象一下,我们有一张国家表和一张城市表。一个国家当然可以有很多城市,但一个城市只能在一个国家,因此一对多的关系很直观:
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 |
但是除了我们的一对多关系之外,我们还想描述国家首都的一对一关系。如果这很重要,假设首都可能会相当有规律地变化,因此城市会随意出现和消失,并且城市可能会切换国家。关键是,这个数据是不稳定的。
我看到了几个选项:
添加一个不能为空
capital
的int 列。countries
优点:总是只有一个城市;缺点:与城市无关,没有强制城市在乡村,或者它甚至存在。capital
向中添加一个布尔列cities
,如果为 true,则表明该城市是相关国家的首都。Pro:直接与相关城市相关联,没有重复的列表示层次结构;缺点:很确定这是一个糟糕的正常化,因为没有什么可以阻止给定国家的“首都”为零或不止一个。创建一个附加表
capitals
,其中包含列country
和city
两个列(或至少在 上city
)的唯一约束。优点:感觉更干净,很容易加入countries
或cities
;缺点:仍然不能确保城市在国内,或者两者都存在。
表示这种关系的最规范和/或最佳方式是什么?有什么办法可以确保每个国家都有一个确实存在并位于该国境内的资本?我想这是不可能的,在这种情况下,我怎样才能最好地减少我的客户端代码的问题?
我目前正在使用 SQLite,但无论底层数据库如何,我都对通用答案感兴趣。
我做了一些挖掘,发现在数据库中指示主要/默认记录,但我认为这并不能真正回答我的问题。
PS:没有首都也没那么糟糕(可能没有城市!),但如果有多个就糟糕了。