Поиск товаров с родительскими и дочерними категориями - PullRequest
1 голос
/ 25 июня 2010

Я создаю веб-сайт корзины покупок и использую таблицы SQL

КАТЕГОРИЯ

Id int,
Parent_Id,
Description varchar(100)

Данные:

1   0   Electronics
2   0   Furniture
3   1   TVs
4   3   LCD
5   4   40 inches
6   4   42 inches

Продукты

Id int,
Category_Id int
Description...

Данные:

1   5   New Samsung 40in LCD TV
2   6   Sony 42in LCD TV

Как видите, у меня есть только один столбец для последней дочерней категории

Теперь мне нужно выполнить поиск по главной категории на домашней странице, например, если пользователь нажимает на кнопку «Электроника», показывать оба телевизора, так как они имеют идентификатор «родитель-родитель-родитель» на электронике, имея в виду, что таблица «Продукты» имеет только один столбец для категории.

Должен ли я обновить Таблицу продуктов и включить 6 столбцов для категории потомков, чтобы решить эту проблему? Или как для этого построить эффективную хранимую процедуру SQL?

Спасибо

Jerry

Ответы [ 3 ]

1 голос
/ 25 июня 2010

в Oracle, вы бы использовали CONNECT BY

0 голосов
/ 25 июня 2010

Используйте для этого рекурсивные CTE! работает как мечта! http://msdn.microsoft.com/en-us/library/ms186243.aspx

0 голосов
/ 25 июня 2010

Если вы используете SQL 2008, вы можете посмотреть на тип данных HIERARCHYID.В противном случае, вы можете рассмотреть возможность изменения таблицы категорий.Как вы сейчас это смоделировали, вы должны использовать рекурсию, чтобы получать от детей заметки родителям или от родителей через детей.

Вместо использования модели связанного списка (что у вас есть), вы можете использоватьМодель вложенного множества для иерархий.Выполните поиск по модели Джо Селко и Nested Set Model, и вы сможете найти несколько хороших ее описаний.Он также написал целую книгу по моделированию деревьев и иерархий в SQL .Модель вложенного набора требует некоторой настройки для обслуживания данных, но с ней гораздо проще работать при выборе данных.Поскольку ваши категории, вероятно, останутся относительно стабильными, это кажется хорошим решением.

РЕДАКТИРОВАТЬ: Чтобы действительно ответить на ваш вопрос ... вы могли бы написать хранимую процедуру, которая находится в цикле WHILE, выбирая дочерние элементы и собирая любые продукты.найдено в табличной переменной.Проверяйте @@ ROWCOUNT в каждом цикле, и если он равен 0, то вы дошли до конца.Затем вы просто выбираете из таблицы переменную.Это рекурсивный (и медленный) метод, поэтому этот тип модели не очень хорошо работает во многих случаях в SQL.

Почти ни при каких обстоятельствах не следует просто добавлять 6 (или 7 или 8)идентификаторы категорий для вашей таблицы продуктов.Плохой.Плохой.Плохой.Помимо всего прочего, это будет кошмар обслуживания (что произойдет, когда ваши категории перейдут на 7 уровней глубже ... затем 8 ... затем 9.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...