Подтвердить что ты не робот

Запросы в стиле базы данных с Firebase

Есть ли быстрый способ выполнения запросов в стиле базы данных с Firebase?

Например:

Учитывая ссылку на firebase users с полями user_id, name и age, что было бы лучшим способом сделать запрос, подобный этому:

SELECT name FROM users WHERE `user_id`=147;

и

SELECT COUNT(*) FROM users WHERE age=21;
4b9b3361

Ответ 1

В общем, нет. Firebase по существу является "базой данных в реальном времени", постоянно передавая вам обновления, поскольку изменения данных, поэтому сложнее делать запросы общего назначения. На данный момент существует несколько (предположительно ограниченных) примитивов запросов, которые предоставляются. См. Страницу Запросы/Ограничения в документах.

Вы можете часто обойти эти ограничения с помощью различных подходов:

  • Использовать имена местоположений и приоритеты разумно. Если вы структурируете свои данные как /users/ [userid]/name, вы можете выполнить свой первый "запрос", просто загрузив /users/ 147/name. Если вы знаете, что хотите запросить по возрасту, вы можете использовать возраст в качестве приоритета для пользовательских узлов, а затем выполните "usersRef.startAt(21).endAt(21).on(" child_added ",...)" на получить всех пользователей в возрасте 21 года. Вам все равно придется подсчитывать их вручную.
  • Выполнять запросы на стороне клиента. Если весь набор данных невелик, вы можете получить весь набор данных, а затем фильтровать/обрабатывать его вручную на клиенте.
  • Запустить отдельный сервер. Он может подключаться к Firebase, синхронизировать данные, а затем отвечать на "запросы" для клиентов. Он по-прежнему может связываться с клиентами через Firebase, а Firebase все еще может быть основным хранилищем данных, но ваш отдельный сервер может выполнять работу по быстрому выполнению запросов.

Мы намерены улучшить это с течением времени, поскольку мы понимаем это слабое место по сравнению с гибким запросом, предоставляемым традиционными системами реляционных баз данных.

Ответ 2

г. Lehenbauer, конечно, мастер всех вещей Firebase, так что слушайте его.;) Тем не менее, эта конкретная тема - это то, над чем я работаю уже пару недель.

Вот несколько моих мыслей, чтобы улучшить ответы "Запустить отдельный сервер" и "Клиентский запрос":

ElasticSearch (a node.js script)

При использовании node.js script на сервере вы можете интегрировать ElasticSearch и обеспечить поиск твердых данных в течение часа. Здесь сообщение в блоге и lib, что делает его еще проще: https://www.firebase.com/blog/2014-01-02-queries-part-two.html

кэшируемые/общие запросы

Они могут обрабатываться процессом server/cron, который считывает таблицу и дублирует данные. Например, предположим, что я хочу показать "недоступный/доступный" для имени входа пользователя во время регистрации, но хранить записи пользователя по другому уникальному идентификатору по какой-то сложной причине.

Мой cron/server может считывать все записи из таблицы пользователей, а затем вставлять их в другую таблицу, которая хранится по адресу электронной почты, со значением идентификатора записи пользователя (или любых других данных, которые я, возможно, хочу знать).

Этот дублированный подход к данным является методом ручной кэширования и является распространенной практикой в ​​окружениях без SQL; мы торгуем складским пространством (которое считается дешевым и доступным) для ускорения и упрощения процессов.

настроенные запросы (с использованием очереди)

Пользовательские запросы могут быть отправлены через XHR (ajax) непосредственно на сервер, который может выполнять тяжелый труд и возвращать лучшие результаты. В качестве альтернативы вы можете использовать Firebase для подключения к серверному серверу, используя очередь.

Клиент ставит запрос запроса как JSON в специальную таблицу Firebase под названием queue и ожидает ответа.

Сервер прослушивает queue.on('child_added', ...) и возвращает данные обратно с помощью `queue_record.child('response',... data here...)

У этого есть некоторые приятные преимущества. Например, любое количество серверов может прослушивать и обслуживать ответы, делая балансировку нагрузки ветерок. Код для этого очень упрощен для настройки и в другом потоке здесь, в SO.

Надеюсь, что это будет полезно!

Ответ 3

Я создал свою собственную CMS для firebase, поэтому, создав таблицу данных firebase, я отфильтровал ее с помощью этого

var child = ref.child();
var compare;
switch(filter){
          case "First_Name":
            compare = child.First_Name;
          break;
          case "Last_Name":
            compare = child.Last_Name;
          break;
          case "Phone_Number":
            compare = child.Phone_Number;
          break;
          case "Department_Number":
            compare = child.Department_Number;
          break;
          case "Position":
            compare = child.Position;
          break;
          case "Status":
            compare = child.Status;
          break;
          case "Tier":
            compare = child.Tier;
          break;
      }


      if(compare.match("^" + string)){
        //display items