Запросы в стиле базы данных с Firebase
Есть ли быстрый способ выполнения запросов в стиле базы данных с Firebase?
Например:
Учитывая ссылку на firebase users
с полями user_id
, name
и age
, что было бы лучшим способом сделать запрос, подобный этому:
SELECT name FROM users WHERE `user_id`=147;
и
SELECT COUNT(*) FROM users WHERE age=21;
Ответы
Ответ 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