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

How to design database tables for hierarchical data with unknown depth?

我想像这样创建深度未知的分层数据:

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

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

我想做的是将它们合二为一 table 并且有一个包含父类别 ID 的父列,如下所示:

我不知道这是否是正确的方法,但我看不到任何其他方法。

我进行了快速搜索,发现的内容与数据库 table 设计没有直接关系。

我正在使用 MS SQL Server 2012

在表中表示层次结构的最广泛使用的设计模式称为 "Adjacency List"。这是您在问题中提出的模式。

另一种方法称为 "Nested Sets"。以下是嵌套集的简要说明:https://en.wikipedia.org/wiki/Nested_set_model

如果您查找邻接列表与嵌套集,您会看到很多文章讨论两者之间的权衡。

基本上,邻接表很容易更新,但很难使用,除了最基本的操作。嵌套 Set 很难更新,但易于使用。从根开始寻路、寻子树等操作简单易懂。

有 3 种常见的方法和 1 种不太常见的方法。

1.邻接列表(你的方法) Pro -简单易懂,随处快速插入 缺点 - 递归查询未知深度的树很慢

2。嵌套集 Pro -查询速度快 Con - 在列表中间插入很慢

3。路径 - 类似于 hierarchyid(基本上是二进制路径) Pro -Con - 像 hierarchyid 通常有长度限制 - 我认为 hierarchyid 最大约为 892 字节

4.关闭 table Pro - 最好的嵌套集和邻接列表。快速插入和选择。 缺点 - 一开始有点难以理解,但如果性能有问题,那么值得努力

来源:SQL 反模式 - Bill Karwin