Иерархические данные - модель вложенного набора: MySql - PullRequest
7 голосов
/ 20 марта 2011

Я только изучаю, как реализовать модель вложенных множеств, но все еще не могу понять, что в ней есть элементы, которые могут входить в несколько категорий.Учитывая приведенный ниже пример, который был взят из ЗДЕСЬ и отражает многие другие примеры, с которыми я столкнулся ...

Hierarchical Data: Numbered Tree

Table

Как избежать дублирования в БД при добавлении яблок, поскольку они разноцветные (т.е. красные, желтые, зеленые)?

Ответы [ 4 ]

6 голосов
/ 20 марта 2011

Вы не избегаете дублирования, и яблоко (или ссылка на яблоко) будет размещено дважды в вашем дереве, иначе это будет не дерево, а график.Ваш вопрос в равной степени применим, если вы создаете ... Swing JTree или дерево HTML;).

Модель с вложенным множеством - это всего лишь эффективный способ перемещения и обхода древовидной структуры в реляционной БДне сама структура данных.Он более популярен среди пользователей MySQL, поскольку в MySQL отсутствует функциональность для обработки древовидных структур (например, таких, которые предоставляет Oracle).

Ура!

3 голосов
/ 25 мая 2012

Здесь мыслят вслух, но, возможно, было бы полезно просмотреть некоторые атрибуты (например, красный, желтый и зеленый) как «теги» вместо «категорий» и обрабатывать их с помощью отдельной логики.Это позволит вам сохранить модель Nested Set и избежать ненужного дублирования.Кроме того, это позволит вам упростить ваши категории.

Все зависит от того, как вы относитесь к информации.Категории - это просто еще один способ представления атрибутов.Я понимаю, что ваш пример был только в иллюстративных целях, но если вы собираетесь классифицировать фрукты по цвету, почему бы вам не классифицировать мясо так же, как белое мясо и красное мясо?Скорее всего, вы бы не.Поэтому я хочу сказать, что, возможно, нет необходимости классифицировать фрукты по цвету.

Вместо этого некоторые атрибуты лучше представлены другими способами.Фактически, в простейшем виде его можно записать в виде столбца в таблице «еда» с пометкой «цвет».Или, если это очень распространенный атрибут, и вы обнаружите, что значительно дублируете значение, его можно разделить на отдельную таблицу с именем «color» и сопоставить с каждым продуктом из третьей таблицы.Конечно, более абстрактный подход заключается в обобщении таблицы в виде «тегов» и включении каждого цвета в качестве отдельного тега, который затем можно сопоставить с любым продуктом питания.Затем вы можете сопоставить любое количество меток (цветов) с любым количеством продуктов питания, что дает вам истинное отношение «многие ко многим» и освобождает обозначения вашей категории, чтобы быть более обобщенными.

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

3 голосов
/ 20 марта 2011

Модель вложенного набора - это структура для отношений 1: N (один ко многим), вы хотите использовать отношение M: N (многие ко многим) (многие элементы могут иметь яблоко в качестве родителя, но могут иметь более одного родитель).

См. Эту статью

Wikipedia

Но вы должны знать, что иерархические отношения M: N могут очень быстро усложниться!

0 голосов
/ 04 апреля 2013

Старая тема, но я нашел лучший ответ на эту проблему.

Поскольку яблоко может иметь разный цвет, ваша структура - это график, а не дерево. Модель с вложенным множеством не подходит для этого.

Поскольку вы упоминаете в комментарии, что используете Mysql, лучшим решением будет использование механизма Open Query Graph (http://openquery.com/graph/doc), который представляет собой плагин mysql, позволяющий создать специальную таблицу, в которую вы помещаете отношения, в основном parentId и childId. Волшебство заключается в том, что вы запрашиваете эту таблицу с помощью специального фиксатора столбца, в зависимости от значения, переданного в запросе, и подскажет механизму OQGRAPH, какую команду выполнить. Подробности смотрите в документации.

...