64

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

@olavk:看起来您没有看到我自己的答案。我使用的方式比递归查询更好:)

pps这就是要走的路!

4

8 回答 8

21

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

于 2008-09-27T20:27:59.067 回答
8

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

于 2008-11-17T14:09:03.603 回答
5

还有树的嵌套集模型,它比 ParentID 模型具有一些优势。见http://www.evanpetersen.com/item/nested-sets.htmlhttp://falsinsoft.blogspot.nl/2013/01/tree-in-sql-database-nested-set-model.html

于 2008-09-27T20:23:08.613 回答
3

这对我来说更像是一个书签而不是一个问题,但它也可能对你有所帮助。我已经使用本文的方法在数据库中存储目录/树结构。

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

希望这可以帮助。

我与该网站没有任何关联

于 2008-09-27T19:59:32.273 回答
3

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

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

于 2008-09-27T20:14:31.457 回答
3

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

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

希望您觉得这个有帮助。

于 2011-10-14T18:01:37.047 回答
2

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

虽然 MongoDB 不是关系数据库,但提供的模型适用于关系数据库以及 JSON 等其他格式。您显然需要根据所呈现的优点/缺点来确定哪种模型是正确的。

这个问题的作者找到了一个结合了父路径和物化路径模型的解决方案。保持深度和父级可能会带来一些问题(额外的逻辑、性能),但对于某些需求显然有好处。对于我的项目,物化路径效果最好,我通过本文中的技术克服了一些问题(排序和路径长度

于 2017-01-06T00:02:06.563 回答
1

典型的方式是一个带有外键(例如“ParentId”)的表。

于 2008-09-27T20:17:49.997 回答