【发布时间】:2017-04-17 22:20:11
【问题描述】:
我必须在数据库中存储一棵树,那么最好的方法是什么?展示你使用的方法并说出它的优缺点。 (我使用的是 SQL Server 2005)
【问题讨论】:
标签: sql sql-server tsql hierarchical-data
我必须在数据库中存储一棵树,那么最好的方法是什么?展示你使用的方法并说出它的优缺点。 (我使用的是 SQL Server 2005)
【问题讨论】:
标签: sql sql-server tsql hierarchical-data
我发现SQL Anti-patterns 中的讨论非常有帮助,因为它还侧重于每个实现的缺点。
另外,this presentation 中的幻灯片 48-77 重申了分析。
归根结底,没有通用树之类的东西,也没有 SQL 树的灵丹妙药。 您必须问自己有关数据的问题,选择、修改它们的方式和数量、移动分支等,并根据这些答案实施合适的解决方案。
【讨论】:
嗯,最简单的方法是让记录有一个 ParentID 列,这样它就知道哪条记录是它的父记录。这是一个非常标准的做法。例如,在线商店可能具有产品类别的层次结构。每个类别都有一个 ParentID。示例:服装数据库中的“牛仔裤”类别可能将“裤子”作为父类别。如果您想要一个记录来指示哪些是它的孩子,这会有点困难,除非您限制孩子的数量。如果你想要一个二叉树,你可以有 LeftChildID 和 RightChildID 列。如果您允许任意数量的子项,则可以有一个以逗号分隔 ID 的 Children 列(例如 1,4,72,19),但这会使查询变得相当困难。如果您的数据库允许列中的数组类型,您可能可以使用数组而不是分隔字符串,这很容易查询 - 但我不确定 MS SQL Server 是否支持。
除此之外,这取决于您要建模的数据类型,以及您计划对这棵树执行的操作类型。
【讨论】:
我过去曾通过在 SQL 中将数据存储为 xml 来做到这一点。
【讨论】: