我正在制作一个将嵌套类别的视频网站:
eg Programming-> C Language -> MIT Videos -> Video 1 Programming -> C Language -> Stanford Video -> Video 1 Programming -> Python -> Video 1
这些类别和子类别将由用户动态创建。当人们以可导航菜单的形式创建它们时,我将需要展示它们,以便人们可以轻松地浏览集合。
有人可以帮助我如何创建这样的数据库吗?
我正在制作一个将嵌套类别的视频网站:
eg Programming-> C Language -> MIT Videos -> Video 1 Programming -> C Language -> Stanford Video -> Video 1 Programming -> Python -> Video 1
这些类别和子类别将由用户动态创建。当人们以可导航菜单的形式创建它们时,我将需要展示它们,以便人们可以轻松地浏览集合。
有人可以帮助我如何创建这样的数据库吗?
制作一个包含以下字段的类别表:
然后,您的 ParentID 将引用回其父级的 CategoryID。
例子:
CategoryID CategoryName ParentID
---------------------------------
1 Dog NULL
2 Cat NULL
3 Poodle 1
4 Dachsund 1
5 Persian 2
6 Toy Poodle 3
夸斯诺伊 说:
您应该使用嵌套集或父子模型。
我曾经实现它们。我能说的是:
如果您的类别表不经常更改,请使用嵌套集架构,因为在 select 子句上它很快,并且只需一个请求,您就可以获得给定条目的层次结构的整个分支。但是在插入或更新子句上,更新左和右(或下例中的下和上)字段比父子模型花费更多时间。
还有一点,我必须承认,
这很微不足道,但是:直接在数据库中手动更改层次结构非常困难(可能在开发过程中发生)。所以,一定要先实现一个接口来玩嵌套集(更改父节点,移动分支节点,删除节点或整个分支等)
这里有两篇关于这个主题的文章:
最后一件事,我没有尝试过,但我在某处读到,嵌套集合表中可以有不止一棵树,我的意思是几个根。
您应该使用其中一个nested sets
或parent-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
更容易查询,但更难更新,更难构建树形结构。
从您问题中的示例来看,您似乎希望给定类别可能有多个父级(例如,“MIT Videos -> Video 1 Programming”以及“Video -> Video 1 Programming”),在这种情况下,仅添加 ParentID 列是不够的。
我建议创建两个表:一个包含 CategoryID 和 CategoryName 列的简单 Categories 表,以及一个包含 ParentCategoryID 和 ChildCategoryID 列的单独 CategoryRelationships 表。这样,您可以为任何特定类别指定任意数量的父子关系。甚至可以使用此模型建立双重关系,其中两个类别同时是彼此的父级和子级。(在我的脑海中,我想不出这种场景有什么用处,但至少它说明了模型的灵活性。)
你需要的是一个基本的父子关系:
Category (ID: int, ParentID: nullable int, Name: nvarchar(1000))
存储表的 parent_id 的更好方法是将其嵌套在 ID 中,例如
100000 编程 110000 C 语言 111000 视频 1 编程 111100 C 语言 111110 斯坦福视频
等等..所以你只需要一个脚本来处理ID,这样第一个数字代表顶级类别等等,当你深入层次结构时