如何为深度未知的分层数据设计数据库表?

时间:2016-10-10 10:18:53

标签: sql-server database-design hierarchical-data

我想创建具有未知深度的分层数据,如下所示:

创建类别和子类别,对于这些子类别,它们也将具有子类别等。

子类别的深度未知,只有用户才能在运行时完成。

我的意思是,但是他们都在一个表中并且有一个父列,其中包含父类别的ID,如下所示:

enter image description here

我不知道这是否是正确的做法,但我无法通过其他方式看到。

我做了一个快速搜索,我找到的与DB表设计没有直接关系。

我正在使用MS SQL Server 2012

2 个答案:

答案 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很难更新,但易于使用。像从根查找路径,查找子树这样的操作非常明确且易于理解。