Какой лучший способ обработки категорий, подкатегорий - иерархических данных? - PullRequest
0 голосов
/ 25 апреля 2009

Дубликат:

SQL - как хранить и перемещаться по иерархиям


Если у меня есть база данных, в которой клиенту требуются категории, подкатегории, подкатегории и т. Д., Как лучше всего это сделать? Если им нужно было только три, и они всегда знали, что им нужно три, я мог бы просто создать три таблицы: cat, subcat, subsubcat или тому подобное. Но что, если они хотят больше глубины? Мне не нравятся три таблицы, но это единственный способ, которым я знаю, как это сделать.

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

EDIT: надеялся, что sql вернет список, если это возможно

Спасибо.

Ответы [ 5 ]

2 голосов
/ 25 апреля 2009

Вы можете взглянуть на книгу Джо Селко или этот предыдущий вопрос .

2 голосов
/ 25 апреля 2009
table categories: id, title, parent_category_id


 id | title | parent_category_id
----+-------+-------------------
  1 |  food |              NULL
  2 | pizza |                 1
  3 | wines |              NULL
  4 |   red |                 3
  5 | white |                 3
  6 | bread |                 1

Обычно я делаю select * и алгоритмически собираю дерево на прикладном уровне.

0 голосов
/ 26 апреля 2009

Не рекомендуемый метод, но я видел людей, использующих точечные обозначения в данных. Food.Pizza или Wines.Red.Cabernet

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

0 голосов
/ 25 апреля 2009

Я работал с несколькими методами, но все еще придерживался простого "id, parent_id" отношения внутри таблицы, где корневые элементы имеют parent_id=0. Если вам нужно часто запрашивать элементы в дереве, особенно когда вам нужны только «ветви» или все базовые элементы одного узла, вы можете использовать вторую таблицу: "id, path_id, level", содержащую ссылку на каждый узел в восходящем пути каждый узел. Это может выглядеть как большой объем данных, но это значительно улучшает поиск ветвлений при использовании и вполне управляемо для рендеринга в триггерах.

0 голосов
/ 25 апреля 2009

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

...