У меня есть таблица, где строки могут быть связаны друг с другом, и логически, отношения между двумя строками (в основном, без направления). (И если вам интересно, да, это действительно должна быть одна таблица. Это две вещи одного и того же логического объекта / типа.) Я могу придумать пару способов представить это:
- Храните отношения и их обратное
- Сохраняйте связь одним способом, ограничивайте базу данных от ее хранения другим способом и имейте два индекса с противоположными порядками для FK (один индекс является индексом PK)
- Сохраните отношения в одном направлении с двумя индексами и позвольте второму быть вставленным так или иначе (звучит немного противно, но эй, полнота)
- Создайте некоторую таблицу группировки и поместите в нее FK на исходной таблице. (Возникает много вопросов. Таблица группировки будет иметь только номер; зачем даже таблица? Сделать FK NULLable или иметь группы с одной связанной строкой?)
Каковы некоторые основные плюсы и минусы этих способов, и, конечно, есть какой-то способ, о котором я не думал?
Вот SQLFiddle для игры: http://sqlfiddle.com/#!12/7ee1a/1/0 . (Получается, что это PostgreSQL, так как это то, что я использую, но я не думаю, что этот вопрос очень специфичен для PostgreSQL.) В настоящее время он хранит как отношение, так и обратное, просто в качестве примера.