【问题标题】:How to handle hierarchical data in Firebase?如何在 Firebase 中处理分层数据?
【发布时间】:2016-10-14 06:47:18
【问题描述】:

我正在使用 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 中,跟踪项目的子项数量的最佳方法是什么?所以在上面的例子中,item #1 总共有 2 个孩子,item #2 总共有 1 个孩子。

最好在每个项目上维护一个childCount,并且每当添加新项目时,为所有父母增加该数字?还是在需要时递归计算子项计数会更好?

请记住,数据库中将有 500,000 多个项目,其中一些项目总共有 10,000 多个子项。

非常感谢您的宝贵时间!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的快速回复!这就是我的想法,但我关心的是如何获取任何给定项目的“totalChildCount”。在您的示例中,“childrenCount”是否仅适用于直接孩子,还是适用于 所有 孩子?无论哪种方式,我都想知道有效计算给定项目的 totalChildCount 的最佳方法(是否应该在添加项目时设置/递增,或者是否应该在检索项目时计算它。旁注:你是正确的因为我一次不需要所有子孩子,只需要直接孩子和“totalChildCount”再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2014-03-15
    • 2014-09-12
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多