如何在Firebase中处理分层数据?

时间:2016-10-14 06:47:19

标签: firebase firebase-realtime-database hierarchical-data nosql

我正在使用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多个孩子。

非常感谢您的时间!

1 个答案:

答案 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)
  • 特定节点的元数据
  • 特定节点的父级
  • 特定节点的子节目

如果您有更多用例,则可能需要扩展数据模型。