Как создать вложенные категории в базе данных?
Я делаю веб-сайт видео, где категории будут вложены:
например, программирование - > язык C - > MIT Videos - > Video 1 Программирование - > Язык C - > Стэнфорд Видео - > Видео 1 Программирование - > Python - > Видео 1
эти категории и подкатегории будут созданы пользователями. Мне нужно будет показать их, как люди создают их в виде навигационного меню, чтобы люди могли легко просматривать коллекцию.
кто-то может пожалуйста, помогите мне, как я могу создать такую базу данных?
6 ответов
Quassnoi сказал :
вы должны использовать либо вложенные наборы, либо модели родитель-потомок.
Я использовал для реализации обоих из них. Вот что я мог бы сказать:--1-->
используйте вложенную архитектуру набора, если ваша таблица категорий не меняется часто, потому что в предложении select это быстро и только с одним запросом вы можете получить всю ветвь иерархии для данной записи. Но для предложения insert или update требуется больше времени, чем для родительской дочерней модели обновите левые и правые (или нижние и верхние в приведенном ниже примере) поля.
еще один момент, довольно тривиальный, я должен признать, но:
Очень сложно изменить иерархию вручную непосредственно в базе данных (это может произойти во время разработки). Итак, не забудьте сначала реализовать интерфейс для игры с вложенным набором (изменение родительского узла, перемещение узла ветви, удаление узла или всей ветви и т. д.)
вот две статьи на тема:
последнее, я не пробовал, но я где-то читал, что у вас может быть более одного дерева во вложенной таблице наборов, я имею в виду несколько корней.
создайте таблицу категорий со следующими полями:
- CategoryID-Целое Число
- CategoryName-String / Varchar / Что Угодно
- ParentID-Целое Число
ваш ParentID затем будет ссылаться на CategoryID своего родителя.
пример:
CategoryID CategoryName ParentID
---------------------------------
1 Dog NULL
2 Cat NULL
3 Poodle 1
4 Dachsund 1
5 Persian 2
6 Toy Poodle 3
из примера в вашем вопросе похоже, что вы хотите, чтобы у данной категории было несколько родителей (например, "MIT Videos -> Video 1 Programming", а также "Video -> Video 1 Programming"), в этом случае простого добавления столбца ParentID будет недостаточно.
Я бы рекомендовал создать две таблицы: простую таблицу категорий со столбцами CategoryID и CategoryName и отдельную таблицу CategoryRelationships с ParentCategoryID и Столбцы ChildCategoryID. Таким образом, вы можете указать столько отношений "родитель-потомок", сколько хотите для любой конкретной категории. Можно было бы даже использовать эту модель, чтобы иметь двойные отношения, где две категории являются родителями и детьми друг друга одновременно. (В голове не укладывается, как использовать этот сценарий, но, по крайней мере, он показывает, насколько гибка модель.)
вы должны использовать nested sets
или parent-child
модели.
Parent-child
:
typeid parent name 1 0 Buyers 2 0 Sellers 3 0 Referee 4 1 Electrical 5 1 Mechanic
SELECT *
FROM mytable
WHERE group IN
(
SELECT typeid
FROM group_types
START WITH
typeid = 1
CONNECT BY
parent = PRIOR typeid
)
будет выбрать всех покупателей в Oracle
.
Nested sets
:
typeid lower upper Name 1 1 2 Buyers 2 3 3 Sellers 3 4 4 Referee 4 1 1 Electrical 5 2 2 Mechanic
SELECT *
FROM group_types
JOIN mytable
ON group BETWEEN lower AND upper
WHERE typeid = 1
будет выбирать всех покупателей в любой базе данных.
посмотреть ответ подробнее.
Nested sets
легче запросить, но сложнее обновить и сложнее построить древовидную структуру.
что вам нужно, это базовые отношения родитель-ребенок:
Category (ID: int, ParentID: nullable int, Name: nvarchar(1000))
лучший способ сохранить parent_id таблицы-это вложить его в идентификатор е.г
Программирование 100000 110000 Языке C 111000 Видео 1 Программирование 111100 Языке C 111110 Стэнфорд Видео
и т. д. Так что все, что вам нужно, это скрипт для обработки идентификатора, чтобы первая цифра представляла категорию верхнего уровня и так далее, когда вы идете глубже по иерархии