从数据库(nosql 或关系数据库)检索嵌套组织层次结构的最简单方法是什么?
What is the easiest way to retrieve a nested organization hierarchy from a database (nosql or relational)?
因此,我一直在研究 SQL 的数据库技术,了解如何最好地存储分层数据。共识似乎是嵌套集。
但是,在我看来,它并不容易回答问题 "give me the entire hierarchy"。不管我的查询是什么,我总是 returned a table。因此,为了获得树状结构,我总是不得不对多个查询结果进行某种混乱的解析。
如果我有分层数据,是否有某种方法可以仅使用一个查询来获取一个元素的所有子元素的嵌套 return 集?如果是这样,我应该如何设置我的 nosql/relational 数据库来做到这一点?数据库选择无关紧要。只要能做这个查询最简单。
例子。给我史蒂夫的后代:
Mary: {
Steve: {
Paul: {
Nick: {}
}
Emily: {}
}
}
结果:
Steve: {
Paul: {
Nick: {}
}
Emily: {}
}
编辑:关于"How should I set up my database.",我更想指出的是关于模式、本体等的任何事情。是公平的游戏(在实际原因内)。就我所知,我不知道有什么东西可以在一行中给我这样的查询结果,所以我不想施加任何限制。
因此,虽然您的问题非常广泛,但我已经解决了这个问题并想分享我的一些经验教训。
So I've been reviewing database techniques for SQL on how to best store hierarchical data. The consensus seemed to be nested sets.
首先,出于多种原因,我要挑战这一共识,其中最大的原因是 "what do you do if your set is extremely large?" 该模型在该假设下完全失效。
我的数据库模拟楼宇自动化系统。一个或两个 BAS 系统没什么大不了的,但是成百上千个建筑物,每个建筑物都有数千个对象,对于简单的 SQL 数据库来说可能不堪重负。
我试过 HierarchyID,发现它很麻烦而且无法维护。
我在 SQL 中尝试了递归 CTE,发现它们的性能随着 table 大小的增加呈指数下降。
最终,我发现最简单的方法是将单个对象连同对其父对象的引用存储在一个平面中 table,然后让外部进程索引父子关系。 Couchbase
在其视图系统中自动执行此操作。查询整个层级的开销还是很大的,但是这个问题可以通过多种方式解决。
所以,一个广泛的问题得到一个广泛的答案。您有更具体的问题想问吗?
因此,我一直在研究 SQL 的数据库技术,了解如何最好地存储分层数据。共识似乎是嵌套集。
但是,在我看来,它并不容易回答问题 "give me the entire hierarchy"。不管我的查询是什么,我总是 returned a table。因此,为了获得树状结构,我总是不得不对多个查询结果进行某种混乱的解析。
如果我有分层数据,是否有某种方法可以仅使用一个查询来获取一个元素的所有子元素的嵌套 return 集?如果是这样,我应该如何设置我的 nosql/relational 数据库来做到这一点?数据库选择无关紧要。只要能做这个查询最简单。
例子。给我史蒂夫的后代:
Mary: {
Steve: {
Paul: {
Nick: {}
}
Emily: {}
}
}
结果:
Steve: {
Paul: {
Nick: {}
}
Emily: {}
}
编辑:关于"How should I set up my database.",我更想指出的是关于模式、本体等的任何事情。是公平的游戏(在实际原因内)。就我所知,我不知道有什么东西可以在一行中给我这样的查询结果,所以我不想施加任何限制。
因此,虽然您的问题非常广泛,但我已经解决了这个问题并想分享我的一些经验教训。
So I've been reviewing database techniques for SQL on how to best store hierarchical data. The consensus seemed to be nested sets.
首先,出于多种原因,我要挑战这一共识,其中最大的原因是 "what do you do if your set is extremely large?" 该模型在该假设下完全失效。
我的数据库模拟楼宇自动化系统。一个或两个 BAS 系统没什么大不了的,但是成百上千个建筑物,每个建筑物都有数千个对象,对于简单的 SQL 数据库来说可能不堪重负。
我试过 HierarchyID,发现它很麻烦而且无法维护。 我在 SQL 中尝试了递归 CTE,发现它们的性能随着 table 大小的增加呈指数下降。
最终,我发现最简单的方法是将单个对象连同对其父对象的引用存储在一个平面中 table,然后让外部进程索引父子关系。 Couchbase
在其视图系统中自动执行此操作。查询整个层级的开销还是很大的,但是这个问题可以通过多种方式解决。
所以,一个广泛的问题得到一个广泛的答案。您有更具体的问题想问吗?