Как хранить категории конкретных полей в MySQL? - PullRequest
0 голосов
/ 05 января 2011

Допустим, у меня есть таблица категорий, в которой хранятся категории.Он реализован в стиле вложенного набора (с левыми и правыми значениями).

category_id   lft  rgt
 1             1    6
 2             2    5
 3             3    4

Таким образом, категория 1 является родительской для категории 2. Категория 2 является родительской для категории 3. Таким образом, это по существу один путь изот корня до листа.

Поля категории категории 1 должны наследоваться категорией 2, которая, в свою очередь, наследуется категорией 3

Теперь, каков наилучший способ хранения полей для конкретногокатегория?Мое решение состояло в том, чтобы создать другую таблицу, которая имеет внешний ключ идентификатора категории и имя поля.

category_id   fieldname
   1           field1
   1           field2 
   2           field3
   3           field4

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

Так что проблема в основном заключается в проблеме оптимизации.Это оптимальное решение?

Ответы [ 2 ]

0 голосов
/ 05 января 2011

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

В вашем случае вы хотите получить все идентификаторы категорий с помощью символа lftравное или меньшее значения 'lft' для заданного вами уровня иерархии, и объедините результаты с полями идентификатора категории в таблице полей.

Запрос выглядит примерно так: -

select table2.fieldname from table2 left join table1 on table1.category_id = table2.category_id where table1.lft <= [lft value for given level of hierarchy]

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

0 голосов
/ 05 января 2011

Я просто сохраняю такие данные в таблице, которая имеет следующую схему:

CategoryID ParentCategoryID Путь

чтобы вы могли иметь

1 0 1 \

тогда

2 1 1 \ 2

тогда

3 2 1 \ 2 \ 3

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

другой, но простой подход, который работает для меня с последних 4+ лет без каких-либо проблем: -)

...