我正在制作一个视频网站,其中的类别将被嵌套:
例如编程 - > C语言 - > MIT视频 - >视频1编程 - > C语言 - >斯坦福视频 - >视频1编程 - > Python - >视频1
这些类别和子类别将由用户即时创建.当人们以可导航菜单的形式创建它们时,我将需要显示它们,以便人们可以轻松浏览该集合.
有人可以帮助我如何创建这样的数据库吗?
使用以下字段创建类别表:
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
Quassnoi说:
您应该使用嵌套集或父子模型.
我过去常常实现它们.我能说的是:
如果您的类别表不经常更改,请使用嵌套集架构,因为在select子句上它很快且只有一个请求,您可以获取给定条目的层次结构的整个分支.但是在插入或更新子句上,比父子模型花费更多时间来更新左侧和右侧(或下面示例中的下部和上部)字段.
另一点,我必须承认,
这是非常微不足道的,但是:直接在数据库中手动更改层次结构非常困难(可能在开发期间发生).因此,请务必首先实现一个接口以使用嵌套集(更改父节点,移动分支节点,删除节点或整个分支等).
这里有两篇关于这个主题的文章:
在数据库中存储分层数据
在MySQL中管理分层数据
最后一件事,我没有尝试过,但我读到某个地方,你可以在一个嵌套的集合表中有多个树,我的意思是几个根.
从您问题中的示例看起来您希望某个类别可以拥有多个父项(例如,"MIT视频 - >视频1编程"以及"视频 - >视频1编程"),在这种情况下,简单地添加ParentID列是不够的.
我建议创建两个表:一个带有CategoryID和CategoryName列的简单Categories表,以及一个带有ParentCategoryID和ChildCategoryID列的单独CategoryRelationships表.这样,您可以为任何特定类别指定任意数量的父子关系.甚至可以使用这个模型来建立双重关系,其中两个类别是彼此的父母和孩子同时.(在我的脑海中,我无法想到这个场景的用处,但至少它说明了模型的灵活性.)