如何在数据库中存储目录/层次/树型结构?(How to store directory / hier

2019-07-18 11:25发布

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

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

PPS 这是要走的路!

Answer 1:

有许多方法来存储层次结构中的SQL数据库。 选择哪一个取决于哪个DBMS您使用的产品,以及数据将如何使用。 当您使用了MSSQL2005标记,我想你应该开始考虑“邻接表”模式; 如果你发现它不适合你的应用程序执行好,然后看看瓦迪姆Tropashko的比较 ,其突出重点放在多个性能模式之间的差异。



Answer 2:

如果使用SQL Server 2008是一个选择:也许你应该看看新HIERARCHYID数据类型。



Answer 3:

还有是在PARENTID模型具有一定的优势树木的嵌套集模型。 见http://www.evanpetersen.com/item/nested-sets.html和http://falsinsoft.blogspot.nl/2013/01/tree-in-sql-database-nested-set-model.html



Answer 4:

这是需要我的书签不是问题,但它可能会帮助你。 我用这篇文章的方式,以目录/树结构存储在数据库中。

有文章中一些有用的代码片断为好。

希望这可以帮助。

我没有以任何方式与该网站无关



Answer 5:

你使用SQL Server 2005? 递归查询使更多的优雅查询层次数据。

编辑:我认为物化路径是一个黑客攻击的一位。 路径包含非标准化的冗余数据,你必须使用触发器或东西,让他们更新。 例如。 如果一个节点改变家长,整个子树得有自己的路径更新。 和子树的查询必须使用一些丑陋的子串匹配,而不是一个优雅的和快速的加入。



Answer 6:

我跟我的一个项目所面临的类似问题。 我们有一个庞大的层级,这将永远保持增长。 我需要快速,然后遍历它的一些复杂的验证后,找到正确的组。 而不是去SQL Server和抓我的头,我怎么能做到有效地那里,当我知道递归查询是唯一可行的解​​决方案。 但你真的知道,如果有可能的话在递归查询任何优化。 有没有保证您的层次结构不会在将来的增加,在一个晴朗的一天,你发现你的递归查询是在生产中使用过慢?

所以,我决定给了一枪Neo4j的。 这是一个与许多有用的算法在建的,惊人的快遍历体面的文档和示例图形数据库。 存储使用节俭服务(或别的东西)中的Neo4j和访问层级的层次结构。 是的,你需要编写代码,将SQL查询与Neo4j的整合,但你将有一个可扩展性和更面向未来的解决方案。

希望您觉得这个有帮助。



Answer 7:

现在的问题是类似这个问题已关闭。 我发现回答这两个问题在我的追求非常有帮助,他们最终导致我的MongoDB手册中介绍了5点不同的方式来树形结构模型: https://docs.mongodb.com/manual/applications/data-models-tree -structures /

虽然MongoDB是不是一个关系数据库,提出的模型是适用于关系数据库,以及其他格式,如JSON。 你显然需要找出哪些模型是正确的基础上,优点/缺点呈现。

这个问题笔者找到了一个解决方案 ,联合双方的父母和物化路径模型。 维护深度和父亲可以提出一些问题(额外的逻辑,性能),但明显有上升空间的某些需要。 对于我的项目,物化路径将工作最好的,我通过从技术克服了一些问题(排序和路径长度) 此文章。



Answer 8:

典型的方式是使用外键(如“的ParentId”)到自身的表。



文章来源: How to store directory / hierarchy / tree structure in the database?