国のテーブルと都市のテーブルがあるとします。もちろん、国は多くの都市を持つことができますが、都市は 1 つの国にしか存在できないため、1 対多の関係は直感的に理解できます。
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 |
しかし、1 対多の関係に加えて、首都の 1 対 1 の関係についても説明したいと思います。それが重要な場合、首都はかなり定期的に変更される可能性があり、さらに言えば、都市は意のままに現れたり消えたりし、その都市は国を切り替える可能性があると想定してください。ポイントは、このデータは不安定です。
いくつかのオプションが表示されます。
null にできないint 列
capital
を追加します。countries
長所: 常に正確に 1 つの都市。短所: 都市に関連付けられていない、都市を強制するものは何も国にない、または都市が存在することさえありません。ブール列
capital
を に追加します。truecities
の場合、その都市が関連する国の首都であることを示します。長所: 問題の都市に直接関連付けられており、階層を示す列が重複していません。短所:特定の国の「首都」がゼロまたは複数であることを止めるものは何もないため、これは正規化が不十分であることは間違いありません。capitals
列country
とを含む追加のテーブルを作成し、city
両方の列 (または少なくともcity
) に一意の制約を設定します。countries
良い点: どちらでもすっきりと簡単に参加できcities
ます。短所:都市が国にあること、またはそのいずれかが存在することはまだ保証されていません。
この関係を表す最も正規化された、または最良の方法は何ですか? 各国に、実際に存在し、その国の中に存在する首都が 1 つだけあることを確認する方法はありますか? それは不可能だと思いますが、その場合、クライアント コードの問題を最小限に抑えるにはどうすればよいでしょうか?
私は現在 SQLite を使用していますが、基礎となるデータベースに関係なく、一般化された回答に興味があります。
少し掘り下げて、Indicating primary/default record in databaseを見つけましたが、これが本当に私の質問に答えているとは思いません。
PS: 首都がなくても問題ありませんが (都市がなくてもかまいません!)、複数あると大変です。