Несколько таблиц в иерархии вложенных наборов

У меня есть ряд отдельных элементов, хранящихся в разных таблицах MySQL, которые я хотел бы поместить в древовидную иерархию. Используя модель списка смежности, я могу добавить поле parent_id в каждую таблицу и связать таблицы с помощью отношения внешнего ключа.

Однако я хотел бы использовать модель обхода дерева вложенных наборов/модифицированного предварительного заказа. Данные будут использоваться в среде, которая сильно ориентирована на чтение, и типы запросов, которые я ожидаю выполнять, благоприятствуют этому подходу.

Проблема в том, что вся информация о вложенных множествах, которая у меня есть, предполагает, что у вас есть только один тип элементов, хранящихся в одной таблице. Способы обойти это, о которых я могу думать, следующие:

  • Наличие нескольких полей внешнего ключа в дереве, по одному для каждого типа таблицы/элемента.
  • Сохранение имени таблицы элементов в древовидной структуре, а также идентификатора элемента.

Оба подхода, мягко говоря, неэлегантны, так что есть ли лучший способ сделать это?


person Community    schedule 06.07.2009    source источник
comment
Я не могу придумать никакого способа сделать это, кроме тех, которые вы упомянули. Я склоняюсь ко второму варианту, сохраняя дискриминатор типов в узлах дерева, а таблицы элементов ссылаются на узлы дерева. Я бы зашел так далеко, что использовал один и тот же первичный ключ для узла дерева и соответствующего элемента, сделав PK таблицы элементов также FK, ссылающимся на таблицу дерева. В целом это подход, используемый большинством объектно-реляционных картографов для обработки наследования, FWIW.   -  person Tom Anderson    schedule 15.05.2010


Ответы (2)


СУБД не очень хорошо подходят для хранения иерархий, и ваш вариант использования делает это даже худший. Я думаю, что немного более тонкие, но все же уродливые варианты ваших собственных предложений - это то, что вы получите, используя СУБД. ИМХО, другие модели данных обеспечат лучшее решение вашей проблемы, например базы данных графов или, возможно, базы данных документов. В статье Следует ли вам выходить за рамки реляционных баз данных? дает хорошее знакомство с такими вещами.

person nawroth    schedule 07.07.2009

У вас есть несколько типов деревьев и одна таблица, содержащая информацию о дереве (т. е. левые/правые значения) для всех типов деревьев?

Если у вас есть несколько типов деревьев, почему бы не создать отдельную таблицу для каждого типа?

person ChrisW    schedule 06.07.2009
comment
Нет. Одно дерево, несколько типов данных. Представьте себе таблицу каждой из стран, городов, магазинов и кафе. Каждая таблица будет содержать разные данные, но все элементы будут иметь имя и идентификатор, которые можно использовать в одном дереве для представления положения магазинов и кафе в географической иерархии. - person ; 07.07.2009
comment
Я не понимаю, как вы надеетесь select данные для стран, городов, магазинов и кафе в одном операторе выбора, учитывая, что типы имеют разные поля данных. Или, если у них нет разных полей данных, то они не являются разными типами данных и могут быть одной и той же таблицей. - person ChrisW; 07.07.2009