Что такое Item1 и Item2? Они разные объекты? Тогда дизайн мне кажется подходящим.
Например, вы можете заполнить базу данных решениями проблемы коммивояжера. У вас есть таблица City (cityId, широта, долгота) и путь к таблице (pathId, salesmanId). Теперь путь, по которому продавец посещает n + 1 городов, будет представлен n записями в PathSegment (pathId ,gmentId, fromCityId, toCityId). Здесь, хотя fromCityId и toCityId являются внешними ключами, которые ссылаются на одну и ту же таблицу City, они описывают различные атрибуты сущности PathSegment, поэтому это не нарушает NF1.
Edit:
То есть вы хотите хранить деревья, на самом деле, только ваши деревья в основном являются связанными списками, и большинство из них являются связанными списками с двумя узлами, верно? И, очевидно, ваш коллега хочет сделать это как список смежности, так что дерево, как
1-2-3
\-4
становится
(1,2)
(2,3)
(1,4)
В этом нет ничего плохого, но это не единственный способ сохранить дерево в базе данных. Для хорошего резюме альтернатив, см. Здесь .
В вашем случае преимущество использования списка смежности состоит в том, что большинство ваших деревьев имеют только два узла, поэтому большинство из них в конечном итоге составляют одну строку в таблице, что делает это простым. Кроме того, вопросы о ближайших соседях легко. "Какой счет на этот платеж?" становится
select item1 from link where item2 = :paymentID
что тоже неплохо. Однако есть и недостатки. Порядок дочерних узлов часто имеет значение, и этот список здесь вам не поможет, поэтому вы должны хранить его как отдельный столбец или как что-то вроде меток времени в таблицах, на которые ссылаются ваши внешние ключи). Кроме того, восстановление всей ветви становится рекурсивной задачей, и не все системы баз данных могут это сделать. Таким образом, если вашему приложению часто приходится получать обзор истории счетов, похожий на доску объявлений, ему может потребоваться некоторая логика на стороне приложения, которая превращает список соседних узлов в дерево на клиенте и работает на этом. Если это становится слишком громоздким, вы можете рассмотреть представление вложенных множеств, см. Здесь .
Что лучше для вашей проблемы? Зависит от нескольких вещей: размер и форма ваших деревьев (если они действительно в основном короткие связанные списки, список смежности хорош), частота вставок и обновлений (если часто, список смежности хорош, потому что его вставки дешевы), частота и сложность запросов (если частые и сложные, вложенные множества хороши, потому что их выбор прост и быстр). Так что для доски объявлений я бы использовал вложенные наборы (или даже Tropashkos вложенные интервалы для скорости и дополнительной крутости), но для простой таблицы «запрос-ответ» (а иногда и больше ответов), я Возможно, я буду использовать список смежности.