查询firebase中的分层数据结构

时间:2014-07-21 15:44:38

标签: firebase

我有一个以树形结构存储数据的应用程序,我希望将其保存到Firebase。

树中的每个节点都是这样的:

    node:
        size: // the number of items
        data: // array of items
        0: // child node 0
        1: // child node 1
        2: // child node 2
        3: // child node 3

所以基本上,它是一个四叉树。问题是如果我加载树的根节点,它将是巨大的,因为firebase将创建包含整个树的快照。如果我能阅读树形结构但没有“数据”,那将是一件好事。首先是字段,然后我可以有选择地加载数据'某些节点中的字段。

目前,似乎没有办法有效地做到这一点。我能想到的唯一方法是逐节点地查询树节点:

    read /node/size
    if (node has children)
      for i=0:3
         read /node/i/size

然而,这种方法将使用太多的往返,并且没有办法判断一个节点是否有孩子而没有完全装载孩子(如果我添加一个' hasChild&#可以做到) 39;节点中的字段,但似乎是多余的。)

我真诚地建议firebase开发团队可以实现一种方法,允许用户过滤返回的数据中的字段。一种新的查询方法将是最好的。

    var query = rootRef.filter("*/size");
    query.on('value', function(snapshot) {
        // snapshot contains only 'size' fields.
    });

filter参数可以是正则表达式,查询将返回与正则表达式匹配的任何路径。我认为没有像这样的查询方法,使用firebase来存储分层数据结构是很重要的。当前的查询方法都假设存储在firebase中的数据是一个相当平坦的数据。要有效率。

问题:

  1. 如何使用现有的firebase基础架构存储树结构,以便可以有效地查询?我需要能够向下和向上走树,并检索与特定节点相关的数据。

  2. firebase适合这种数据结构吗?什么替代策略更合适?

  3. 由于

1 个答案:

答案 0 :(得分:5)

我重组了我的数据结构以存储数据'字段分开,使树结构小到足以完全适合客户端。对于树中的每个节点,我使用通向节点的路径作为存储“数据”的密钥。例如,

    root:
      2:
        0:
          3:
            size: 123
            data: [ //list of items ]

存储为:

    root:
      2:
        0:
          3:
            size: 123
    data:
      203: [ // list of items ]

通过这种方式,我可以通过使用该节点的路径作为密钥,有选择地加载每个节点的数据。