我必须在数据库中存储一棵树,那么最好的方法是什么?显示您使用的方法并命名其优缺点。 (我使用的是SQL Server 2005)
答案 0 :(得分:14)
我发现SQL Anti-patterns中的讨论非常有用,因为它也关注每个实现的缺点。
此外,this presentation中的幻灯片48-77重申了这些分析。
最重要的是,没有通用树这样的东西,也没有SQL树的银弹。 您将不得不问自己数据,如何选择,修改,分支移动等等,并根据这些答案实施合适的解决方案。
答案 1 :(得分:7)
答案 2 :(得分:4)
嗯,最简单的方法是让记录拥有一个ParentID列,以便它知道哪个记录是其父记录。这是一个非常标准的做法。例如,在线商店可能具有产品类别的层次结构。每个类别都有一个ParentID。示例:服装数据库中的“牛仔裤”类别可能将“裤子”作为父类别。如果你想要一条记录来表明它的孩子是哪一个,那就更难了,除非你限制孩子的数量。如果需要二叉树,可以使用LeftChildID和RightChildID列。如果您允许任意数量的子项,则可以使用逗号分隔的ID(例如1,4,72,19
)的子列,但这会使查询变得相当困难。如果您的数据库允许列中的数组类型,您可以使用数组而不是分隔字符串,这很容易查询 - 但我不确定MS SQL Server是否支持。
除此之外,它取决于您建模的数据类型,以及您计划对此树执行的操作类型。
答案 3 :(得分:1)
我过去通过在SQL中将数据存储为xml来完成此操作。