Как создать вложенные категории в базе данных?

Я делаю веб-сайт видео, где категории будут вложены:

например, программирование - > язык 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 Стэнфорд Видео

и т. д. Так что все, что вам нужно, это скрипт для обработки идентификатора, чтобы первая цифра представляла категорию верхнего уровня и так далее, когда вы идете глубже по иерархии