Представете си, че имаме таблица с държави и таблица с градове. Една държава, разбира се, може да има много градове, но един град може да бъде само в една държава, така че връзката "един към много" има интуитивен смисъл:
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
, която не може да бъде нула. Професионалисти: винаги точно един град; Против: не е свързано с града, нищо, което налага града, не е в страната или че дори съществува.Добавете булева колона
capital
къмcities
, която, ако е вярна, показва, че градът е столица на асоциираната държава. Професионалист: директно свързан с въпросния град, без дублиращи се колони, показващи йерархия; Против: почти сигурен, че това е лоша нормализация, тъй като нищо не пречи да има нула или повече от една „столица“ за дадена държава.Създайте допълнителна таблица
capitals
с колониcountry
иcity
и уникално ограничение за двете колони (или поне заcity
). Професионалист: усеща се по-чисто, лесно свързване наcountries
илиcities
; Против: все още не гарантира, че градът е в страната или че съществува.
Кой е най-нормализираният и/или най-добрият начин за представяне на тази връзка? Има ли някакъв начин да се гарантира, че всяка държава има точно една столица, която в действителност съществува и се намира в тази страна? Предполагам, че не е възможно, в който случай, как най-добре мога да минимизирам проблемите за моя клиентски код?
В момента използвам SQLite, но се интересувам от обобщени отговори, независимо от основната база данни.
Разрових се малко и открих Посочване на първичен/запис по подразбиране в база данни, но аз не мисля, че това наистина отговаря на въпроса ми.
PS: Не е толкова лошо, ако няма столица (може да няма градове!), но би било лошо, ако има няколко.