11

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

eg Programming-> C Language -> MIT Videos -> Video 1 Programming -> C Language -> Stanford Video -> Video 1 Programming -> Python -> Video 1

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

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

4

6 回答 6

16

制作一个包含以下字段的类别表:

  • 类别 ID - 整数
  • 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
于 2009-05-29T14:15:22.090 回答
13

夸斯诺伊 说:

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

我曾经实现它们。我能说的是:

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

还有一点,我必须承认,
这很微不足道,但是:直接在数据库中手动更改层次结构非常困难(可能在开发过程中发生)。所以,一定要先实现一个接口来玩嵌套集(更改父节点,移动分支节点,删除节点或整个分支等)

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

最后一件事,我没有尝试过,但我在某处读到,嵌套集合表中可以有不止一棵树,我的意思是几个根。

于 2009-05-29T14:48:10.823 回答
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
        )

将选择 中的所有买家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

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

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

Nested sets更容易查询,但更难更新,更难构建树形结构。

于 2009-05-29T14:14:14.463 回答
5

从您问题中的示例来看,您似乎希望给定类别可能有多个父级(例如,“MIT Videos -> Video 1 Programming”以及“Video -> Video 1 Programming”),在这种情况下,仅添加 ParentID 列是不够的。

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

于 2009-05-29T14:44:54.933 回答
0

你需要的是一个基本的父子关系:

Category (ID: int, ParentID: nullable int, Name: nvarchar(1000))
于 2009-05-29T14:15:36.070 回答
0

存储表的 parent_id 的更好方法是将其嵌套在 ID 中,例如

100000 编程 110000 C 语言 111000 视频 1 编程 111100 C 语言 111110 斯坦福视频

等等..所以你只需要一个脚本来处理ID,这样第一个数字代表顶级类别等等,当你深入层次结构时

于 2009-07-28T06:49:21.773 回答