我正在使用Firebase构建应用,并且无法为我的应用所需的层次结构构建数据。
概念
我的应用由items
组成。每个项目都有n
- 许多child items
。数据库和任何给定项目中将有数千个项目。我想得到所有子项目(即:直接儿童,大孩子,曾孙子等)。
当前结构示例
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
,每当添加新项目时,为所有父项增加该数字?或者在需要时递归计算子计数会更好吗?
请记住,数据库中将有500,000多个项目,其中一些项目共有10,000多个孩子。
非常感谢您的时间!
答案 0 :(得分:2)
在Firebase中(与大多数NoSQL数据库一样),您应该为应用程序使用它的方式建模数据(我强烈建议您阅读NoSQL data modeling上的这篇文章以获得更多智慧)。
要实现的一件重要事情是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)
)如果您有更多用例,则可能需要扩展数据模型。