Представьте, что у нас есть таблица стран и таблица городов. В стране, конечно, может быть много городов, но город может находиться только в одной стране, поэтому связь «один ко многим» имеет интуитивный смысл:
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
). Pro: кажется более чистым, легкое присоединение наcountries
илиcities
; Против: все еще не гарантирует, что город находится в стране или что он существует.
Каков самый нормальный и / или лучший способ представить эти отношения? Есть ли способ гарантировать, что каждая страна имеет ровно одну столицу, которая действительно существует и находится внутри этой страны? Я полагаю, что это невозможно, и в таком случае, как мне лучше всего свести к минимуму проблемы для моего клиентского кода?
В настоящее время я использую SQLite, но меня интересуют обобщенные ответы, независимо от базовой базы данных.
Я немного покопался и нашел с указанием основной записи / записи по умолчанию в базе данных, но я не думаю, что это действительно отвечает на мой вопрос.
PS: Не так уж и плохо, если нет столицы (а может и не быть городов!), Но было бы плохо, если бы их было несколько.