如何在数据库中创建嵌套类别?

Mat*_*mer 10 database nested categories

我正在制作一个视频网站,其中的类别将被嵌套:

例如编程 - > C语言 - > MIT视频 - >视频1编程 - > C语言 - >斯坦福视频 - >视频1编程 - > Python - >视频1

这些类别和子类别将由用户即时创建.当人们以可导航菜单的形式创建它们时,我将需要显示它们,以便人们可以轻松浏览该集合.

有人可以帮助我如何创建这样的数据库吗?

The*_*TXI 12

使用以下字段创建类别表:

  • CategoryID - 整数
  • CategoryName - String/Varchar/Whatever
  • 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
Run Code Online (Sandbox Code Playgroud)

  • Jake:我不知道您将如何进行自己的导航,但标准方法是首先使用“select * from tblCategories where ParentID is NULL”这样的查询来显示单个级别(例如顶级),因此您会得到狗和猫。然后,当您单击 dog 时,您可以通过查询“Select * from tblCategories where ParentID = 1”来获得下一个级别,因为 1 是 Dog 的 categoryid。然后以相同的方式继续向下钻取。 (2认同)

小智 9

Quassnoi说:

您应该使用嵌套集或父子模型.

我过去常常实现它们.我能说的是:

如果您的类别表不经常更改,请使用嵌套集架构,因为在select子句上它很快且只有一个请求,您可以获取给定条目的层次结构的整个分支.但是在插入或更新子句上,比父子模型花费更多时间来更新左侧和右侧(或下面示例中的下部和上部)字段.

另一点,我必须承认,
这是非常微不足道的,但是:直接在数据库中手动更改层次结构非常困难(可能在开发期间发生).因此,请务必首先实现一个接口以使用嵌套集(更改父节点,移动分支节点,删除节点或整个分支等).

这里有两篇关于这个主题的文章:

最后一件事,我没有尝试过,但我读到某个地方,你可以在一个嵌套的集合表中有多个树,我的意思是几个根.


Qua*_*noi 5

您应该使用nested setsparent-child模型。

Parent-child:

typeid 父名称

1 0 买家
2 0 卖家
3 0 裁判
4 1 电气
5 1 机械师
SELECT  *
FROM    mytable
WHERE   group IN
        (
        SELECT  typeid
        FROM    group_types
        START WITH
                typeid = 1
        CONNECT BY
                parent = PRIOR typeid
        )
Run Code Online (Sandbox Code Playgroud)

将选择 中的所有买家Oracle

Nested sets:

typeid 下 上 名称
1 1 2 买家
2 3 3 卖家
3 4 4 裁判
4 1 1 电气
5 2 2 机械师
SELECT  *
FROM    group_types
JOIN    mytable
ON      group BETWEEN lower AND upper
WHERE   typeid = 1
Run Code Online (Sandbox Code Playgroud)

将选择任何数据库中的所有买家。

有关更多详细信息,请参阅此答案。

Nested sets查询起来比较容易,但是更新比较困难,构建树结构也比较困难。


Dan*_*Tao 5

从您问题中的示例看起来您希望某个类别可以拥有多个父项(例如,"MIT视频 - >视频1编程"以及"视频 - >视频1编程"),在这种情况下,简单地添加ParentID列是不够的.

我建议创建两个表:一个带有CategoryID和CategoryName列的简单Categories表,以及一个带有ParentCategoryID和ChildCategoryID列的单独CategoryRelationships表.这样,您可以为任何特定类别指定任意数量的父子关系.甚至可以使用这个模型来建立双重关系,其中两个类别是彼此的父母和孩子同时.(在我的脑海中,我无法想到这个场景的用处,但至少它说明了模型的灵活性.)