Я пытаюсь смоделировать, какие страны граничат друг с другом в MySQL. У меня есть три таблицы:
nodes
-----
node_id MEDIUMINT
countries
---------
country_id MEDIUMINT (used as a foreign key for nodes.node_id)
country CHAR(64)
iso_code CHAR(2)
node_adjacency
--------------
node_id_1 MEDIUMINT (used as a foreign key for nodes.node_id)
node_id_2 MEDIUMINT (used as a foreign key for nodes.node_id)
Я ценю, что таблица узлов избыточна в этом примере, но это является частью более крупной архитектуры, где узлы могут представлять множество других элементов, отличных от стран.
Вот некоторые данные (идентификаторы (которые отображаются во всех трех таблицах) и страны)
59 Bosnia and Herzegovina
86 Croatia
130 Hungary
178 Montenegro
227 Serbia
232 Slovenia
Хорватия граничит со всеми другими странами, и это представлено в таблице node_adjacency как:
59 86
86 130
86 178
86 227
86 232
Таким образом, идентификатор Сербии может выглядеть как node_id_1
или node_id_2
. Данные в этой таблице по существу являются данными неориентированного графа.
Вопросы:
Учитывая имя 'Хорватия', какой SQL я должен использовать, чтобы получить его соседей?
Bosnia and Herzegovina
Hungary
Montenegro
Serbia
Slovenia
Будет ли какой-либо выигрыш в эффективности поиска при хранении информации о смежности в виде данных ориентированного графа? Например. Хорватия граничит с Венгрией, а Венгрия граничит с Хорватией, по сути дублируя хранилище отношений:
86 130
130 86