如何在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 },

我正在使用Firebase构建一个应用程序,在为我的应用程序需要的层次结构构建数据时遇到了问题

概念

我的应用程序由
项组成
。每个项目可以有
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”再次感谢!!