【问题标题】:How to design database tables for hierarchical data with unknown depth?如何为深度未知的分层数据设计数据库表?
【发布时间】:2016-10-10 10:18:53
【问题描述】:

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

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

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

我的想法是将它们全部放在一个表中,并有一个父列保存父类别的 ID,如下所示:

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

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

我使用的是 MS SQL Server 2012

【问题讨论】:

  • 这似乎是一个常见的问题。有没有使用此设计无法回答的问题?维护数据呢?
  • 你可能会读到HIERARCHYID。通常,您会将所有行存储在一个表中并连接回父表。这样的结构非常笨拙……
  • @Shnugo 加入回来的意思和我在问题中提到的一样吗?
  • @MuhammadNourm 是的。这是常见的设计。
  • @Shnugo 那么还有其他更好的方法吗?

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


【解决方案1】:

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

1.邻接列表(您的方法) 专业版 - 易于理解,可在任何地方快速插入 Con - 递归查询深度未知的树很慢

2。嵌套集 专业版 - 快速查询 Con - 列表中间的插入速度很慢

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

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

来源:SQL 反模式 - Bill Karwin

【讨论】:

    【解决方案2】:

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

    一种替代方法称为“嵌套集”。下面是对嵌套集的简要描述:https://en.wikipedia.org/wiki/Nested_set_model

    如果您查看 Adjacency List vs Nested Set,您会看到很多文章讨论两者之间的权衡。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-01
      • 2012-12-08
      • 1970-01-01
      • 2013-05-16
      • 2016-12-21
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      相关资源
      最近更新 更多