我想创建具有未知深度的分层数据,如下所示:
创建类别和子类别,对于这些子类别,它们也将具有子类别等。
子类别的深度未知,只有用户才能在运行时完成。
我的意思是,但是他们都在一个表中并且有一个父列,其中包含父类别的ID,如下所示:
我不知道这是否是正确的做法,但我无法通过其他方式看到。
我做了一个快速搜索,我找到的与DB表设计没有直接关系。
我正在使用MS SQL Server 2012
答案 0 :(得分:3)
这种方法有3种常见方法。 1并不常见。
<强> 1。邻接列表(您的方法) Pro - 易于理解,可快速插入任何地方 Con - 以递归方式查询未知深度的树
<强> 2。嵌套集 Pro - 快速查询 Con - 列表中间的插入速度很慢
第3。路径 - 类似hierarchyid(基本上是二进制路径) 亲 - 快 Con - 就像hierarchyid通常有限的长度 - 我认为hierarchyid最大约为892字节
<强> 4。关闭表 Pro - 最好的嵌套设置&amp;邻接名单。快速插入和选择。 Con - 一开始有点难以理解,但如果性能问题则值得付出努力
来源:SQL Antipatterns - Bill Karwin
答案 1 :(得分:0)
用于在表中重新分配层次结构的最广泛使用的设计模式称为“邻接列表”。这是你在问题中提出的模式。
一种替代方案称为“嵌套集”。以下是对嵌套集的描述:https://en.wikipedia.org/wiki/Nested_set_model
如果你查看Adjacency List vs Nested Set,你会得到很多文章讨论两者之间的权衡。
基本上,邻接列表很容易更新,但很难处理,除了最基本的操作。嵌套Set很难更新,但易于使用。像从根查找路径,查找子树这样的操作非常明确且易于理解。