如何在数据库中存储目录/层次结构/树结构?

时间:2008-09-27 19:59:25

标签: sql-server sql-server-2005 database-design tree-structure

如何在数据库中存储目录/层次结构/树结构?即MSSQL Server。

@olavk:看起来你看不出我自己的答案。我使用的方式比递归查询更好:)

p.p.s。 This is要走的路!

8 个答案:

答案 0 :(得分:18)

many ways个存储SQL数据库中的层次结构。选择哪一个取决于您使用的DBMS产品以及数据的使用方式。正如您使用MSSQL2005标记,我认为您应该开始考虑“邻接列表”模型;如果您发现它在您的应用程序中表现不佳,请查看Vadim Tropashko's comparison,其中突出了模型之间的差异,重点关注多个性能特征。

答案 1 :(得分:8)

如果使用Sql Server 2008是一个选项:也许您应该检查新的hierarchyid数据类型。

答案 2 :(得分:5)

答案 3 :(得分:4)

这对我来说不仅仅是一个问题的书签,但它也可能对你有帮助。我使用this article's方法在数据库中存储目录/树结构。

文章中也有一些有用的代码片段。

希望这有帮助。

我不以任何方式加入该网站

答案 4 :(得分:3)

您使用的是SQL Server 2005吗? Recursive queries使查询分层数据更加优雅。

编辑:我认为物化路径有点像黑客。该路径包含非规范化的冗余数据,您必须使用触发器或其他东西来保持更新。例如。如果节点更改父节点,则整个子树必须更新其路径。子树查询必须使用一些丑陋的子串匹配,而不是优雅和快速的连接。

答案 5 :(得分:2)

我遇到了与我的一个项目类似的问题。我们有一个巨大的等级,将永远增加。 我需要快速遍历它,然后在一些复杂的验证后找到合适的组。 当我知道递归查询是唯一可行的解​​决方案时,我怎么能有效地做到这一点,而不是去SQL Server并且摸不着头脑。但是你真的知道在Recursive Queries中是否有任何可能的优化。是否有任何保证您的层次结构在将来不会增加,并且在您发现递归查询太慢而无法在生产中使用的一天之后?

所以,我决定试一试Neo4J。它是一个图形数据库,内置了许多有用的算法,具有令人惊讶的快速遍历,具有良好的文档和示例。 使用Thrift服务(或其他)将层次结构存储在Neo4J中并访问层次结构。 是的,您必须编写将您的SQL查询与Neo4J集成的代码,但您将拥有可扩展且更具前瞻性的解决方案。

希望你觉得这很有用。

答案 6 :(得分:2)

问题类似于已关闭的this question。我发现这两个问题的答案对我的追求非常有帮助,他们最终引导我阅读MongoDB手册,该手册介绍了5种不同的树结构建模方法: https://docs.mongodb.com/manual/applications/data-models-tree-structures/

虽然MongoDB不是关系数据库,但所提供的模型适用于关系数据库以及其他格式(如JSON)。你显然需要根据所提出的优缺点找出哪种模型是正确的。

此问题的作者发现solution结合了Parent和Materialized Paths模型。保持深度和父母可能会出现一些问题(额外的逻辑,性能),但某些需求显然有上升空间。对于我的项目,物化路径将最有效,我通过this文章中的技术克服了一些问题(排序和路径长度)。

答案 7 :(得分:1)

典型的方法是将一个外键(例如“ParentId”)放在自身上。