答案 0 :(得分:18)
有many ways个存储SQL数据库中的层次结构。选择哪一个取决于您使用的DBMS产品以及数据的使用方式。正如您使用MSSQL2005标记,我认为您应该开始考虑“邻接列表”模型;如果您发现它在您的应用程序中表现不佳,请查看Vadim Tropashko's comparison,其中突出了模型之间的差异,重点关注多个性能特征。
答案 1 :(得分:8)
如果使用Sql Server 2008是一个选项:也许您应该检查新的hierarchyid数据类型。
答案 2 :(得分:5)
还有树的嵌套集模型,它比ParentID模型有一些优势。请参阅http://www.evanpetersen.com/item/nested-sets.html和http://falsinsoft.blogspot.nl/2013/01/tree-in-sql-database-nested-set-model.html
答案 3 :(得分:4)
答案 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”)放在自身上。