如何在Firebase中处理分层数据?
我正在使用Firebase构建一个应用程序,在为我的应用程序需要的层次结构构建数据时遇到了问题 概念 我的应用程序由如何在Firebase中处理分层数据?,firebase,firebase-realtime-database,hierarchical-data,nosql,Firebase,Firebase Realtime Database,Hierarchical Data,Nosql,我正在使用Firebase构建一个应用程序,在为我的应用程序需要的层次结构构建数据时遇到了问题 概念 我的应用程序由项组成。每个项目可以有n-许多子项目。数据库和任何给定的项目中都会有100到数千个项目。我想得到所有子项的计数(即:直系子女、孙子女、曾孙子女等) 当前结构示例 items: { 1: { name: 'neat item 1' }, 2: { name: 'neat item 2', parentId: 1 },
项组成
。每个项目可以有n
-许多子项目
。数据库和任何给定的项目中都会有100到数千个项目。我想得到所有子项的计数(即:直系子女、孙子女、曾孙子女等)
当前结构示例
items: {
1: {
name: 'neat item 1'
},
2: {
name: 'neat item 2',
parentId: 1
},
3: {
name: 'neat item 3',
parentId: 2
}
}
问题
在Firebase中,跟踪项目的子项数量的最佳方法是什么?因此,在上面的示例中,项目#1共有2个子项,项目#2共有1个子项
是否最好在每个项目上保持childCount
,并且每当添加新项目时,为所有家长增加该数字?或者在需要时递归计算子计数会更好吗
请记住,数据库中将有500000多个项目,有些项目总共有10000多个子项
非常感谢您抽出时间 在Firebase中(就像在大多数NoSQL数据库中一样),您应该根据应用程序的使用方式对数据进行建模(我强烈建议您阅读本文以获得更多的智慧)
需要了解的一件重要事情是Firebase始终加载整个节点,包括该节点下的所有数据。(在SDK中)无法加载所谓的浅层数据
因此,如果你的应用程序总是显示整个树,那么你肯定可以将数据建模为一棵树
但是,考虑到树的大小,很可能一次只显示一个级别,然后允许用户单击以扩展该级别。如果将数据建模为层次结构,则最终会加载节点的所有子节点,即使用户从未扩展该节点。那是浪费
因此,更常见的是将层次结构存储为列表,这与将其存储在关系数据库中的方式非常相似。然后,您将保留每个节点的子节点的单独列表。请注意,这是一个列表,而不是树
nodes
nodeKey1
name: "Node 1"
childrenCount: 2
nodeKey2
name: "Node 2"
childrenCount: 1
parentKey: "nodeKey1"
nodeKey3
name: "Node 3"
childrenCount: 0
parentKey: "nodeKey1"
nodeKey4
name: "Node 4"
childrenCount: 0
parentKey: "nodeKey2"
nodeChildren
nodeKey1
nodeKey2
nodeKey3
nodeKey2
nodeKey4
这允许高效地读取/查询:
- 顶级节点列表(
)ref.orderByChild('parentNode').equalTo(null)
- 特定节点的元数据
- 特定节点的父节点
- 特定节点的子节点
如果您有更多的用例,您可能需要扩展数据模型。非常感谢您的快速响应!这是我的想法,但我关心的是如何获得任何给定项目的“totalChildCount”。在您的示例中,“childrenCount”是仅针对直接子女,还是针对所有子女?不管是哪种方式,我都想知道有效计算给定项的totalChildCount的最佳方法(是否应该在添加项时设置/增加,或者是否应该在检索项时计算)。旁注:您是对的,我一次不需要所有子项,只需要直接子项和“totalChildCount”再次感谢!!