При запросе к базе данных Firebase Realtime, какой из них более эффективен: запрос по имени ключа или запрос по его значению - PullRequest
0 голосов
/ 09 марта 2019

Ниже приведена текущая структура моей базы данных, которую я использую для игры, которая содержит «комнаты», а внутри каждой комнаты «ходы».Ключ перемещения - это случайно сгенерированная строка, и я сохраняю номер хода, 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 голосов
/ 09 марта 2019

Если вы хотите получить ходы с n: 2 для конкретной комнаты, вы можете довольно эффективно выполнить этот запрос с помощью:

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

Пока вы определили индекс для n, запрос будет выполняться на сервере. В вашей текущей структуре этот индекс будет:

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

Это достаточно хорошо масштабируется на сервере, по крайней мере, до нескольких сотен тысяч ходов (на комнату) и, вероятно, даже до миллиона ходов (опять же: на комнату).

Но с вашей второй структурой данных вы можете выполнить прямой просмотр перемещений для комнаты с конкретным значением n. И прямой поиск всегда будет быстрее, чем запрос, поскольку вы точно указываете базе данных, где найти данные.

roomRef.child('moves/1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...