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

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

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

pps 这是要走的路!

在SQL数据库中存储层次结构有很多种方法 。 select哪一个取决于您使用的DBMS产品以及数据将如何使用。 正如你已经使用MSSQL2005标签,我认为你应该开始考虑“邻接表”模型; 如果您发现它在您的应用中performance不佳,那么请看看Vadim Tropashko的比较 ,它突出了多种性能特性之间的差异。

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

这对于我来说不仅仅是一个书签,而是对你的帮助。 我已经使用这篇文章的方法来在数据库中存储目录/树结构。

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

希望这可以帮助。

我不以任何方式隶属于该网站

你使用SQL Server 2005吗? recursion查询使查询分层数据更加优雅。

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

我面对与我的一个项目类似的问题。 我们有一个巨大的等级,将永远持续增长。 我需要快速遍历它,然后在复杂的validation之后find合适的组。 当我知道recursion查询是唯一可行的解​​决scheme时,我怎么才能有效地做到这一点,而不是去SQL Server和抓我的脑海。 但是你真的知道在recursion查询中是否有任何可能的优化。 有没有保证你的层次结构在将来不会增加,而且你发现你的recursion查询太慢而不能用于生产?

所以,我决定给Neo4J一个镜头。 这是一个graphics数据库,内置许多有用的algorithm,具有良好的文档和示例,令人惊讶的快速遍历。 将层次结构存储在Neo4J中,并使用Thrift服务(或其他)访问层次结构。 是的,您将不得不编写将您的SQL查询与Neo4J集成在一起的代码,但是您将拥有一个可扩展且更具前瞻性的解决scheme。

希望您觉得这个有帮助。

这个问题与这个被closures的问题类似。 我发现这两个问题的答案都对我的追求非常有帮助,最终让我们看到了MongoDB手册,其中介绍了5种不同的树结构build模方法: https : //docs.mongodb.com/manual/applications/data-models-tree -structures /

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

这个问题的作者发现了一个结合了Parent和Materialized Paths模型的解决scheme 。 保持深度和父母可能会出现一些问题(额外的逻辑,性能),但是对于某些需求显然是有利的。 对于我的项目,Materialized Paths将会最好地工作,并通过本文中的技术克服一些问题(sorting和path长度)。

典型的方法是使用外键(例如“ParentId”)的表。

Interesting Posts