在查询Firebase Realtime数据库时,以下哪个效率更高:按键名查询或按值查询

时间:2019-03-08 23:57:17

标签: javascript firebase-realtime-database

下面是我正在用于游戏的数据库的当前结构,其中包含“房间”,而在每个房间中都包含“动作”。移动键是随机生成的字符串,我将移动号“ n”存储为该键的属性。我需要查询数据库以获取特定移动编号n的移动数据:

{
  "rooms": {
    "-LXU8-36ISMY8YZnI7fr": {
      "moves": {
        "-LXZv-7zMCZdrH7ffoWf": {"n": 1, "x": 532, "y": 242},
        "-LXZv7LlQTkBEtls0PP2": {"n": 2, "x": 352, "y": 944}
      }
    }
  }
} 

我正在实现这样的目标-例如,如果我需要移动n = 1,则可以这样做:

moveRef = roomRef.child('moves').orderByChild("n").equalTo(1)

从文档中我还不清楚过滤是在服务器上完成的,还是所有动作都将下载到客户端然后进行过滤,这似乎效率很低。

这是我的问题:将每个动作的键名设置为这样的动作编号会更有效(特别是,较少的数据传输到客户端,从而更便宜)吗?

{
  "rooms": {
    "-LXU8-36ISMY8YZnI7fr": {
      "moves": {
        "1": {"x": 532, "y": 242},
        "2": {"x": 352, "y": 944}
      }
    }
  }
} 

然后通过引用我想要的特定动作进行查询,例如获得动作1:

moveRef = roomRef('/1');

在我看来这会更有效,但是我对使用此方法持谨慎态度,因为我确定我在文档中的某个地方读到以这种方式进行操作是个坏主意。谢谢。

1 个答案:

答案 0 :(得分:0)

如果您想使用n: 2获取特定房间的位置,则可以使用以下命令高效地执行该查询:

moveRef = roomRef.child('moves').orderByChild("n").equalTo(1)

只要您在n上定义了索引,查询就会在服务器上执行。在您当前的结构中,该索引为:

{
  "rules": {
    "rooms": {
      "$roomid": {
        "moves": {
          ".indexOn": "n"
        }
      }
    }
  }
}

这将在服务器上很好地扩展,至少移动几十万(每个房间),甚至可能移动一百万(再次:每个房间)。

但是使用第二个数据结构,您可以直接查找具有特定n值的房间的移动。而且直接查找总是比查询更快,因为您是在告诉数据库确切的数据位置。

roomRef.child('moves/1')