2012-07-20 27 views
46

¿Existe alguna manera rápida de realizar consultas de estilo de base de datos con Firebase?Consultas de tipo de base de datos con Firebase

Por ejemplo:

Dada una referencia firebase users con campos user_id, name, y age, lo que sería la mejor manera de hacer una consulta similar a esto:

SELECT name FROM users WHERE `user_id`=147; 

y

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

Respuesta

70

En general, no. Firebase es esencialmente una "base de datos en tiempo real", que le transmite actualizaciones constantemente a medida que los datos cambian, por lo que es más difícil realizar consultas de propósito general. Por ahora, hay un par de primitivas de consulta (ciertamente limitadas) que se proporcionan. Consulte la página Queries/Limits en los documentos.

A menudo se puede evitar estas limitaciones a través de una variedad de enfoques:

  • nombres Uso ubicación y prioridades de forma inteligente. Si estructura sus datos como/users/[userid]/name, puede realizar su primera "consulta" simplemente recuperando/users/147/name. Si sabe que desea consultar por edad, puede usar la edad como prioridad para los nodos de usuario y luego hacer "usersRef.startAt (21) .endAt (21) .on ('child_added', ...)" para consiga que todos los usuarios tengan 21 años. Aún debe contarlos manualmente.
  • Hacer consultas en el lado del cliente. Si todo el conjunto de datos es pequeño, es posible que pueda recuperar todo el conjunto de datos y luego filtrarlo/procesarlo manualmente en el cliente.
  • Ejecute un servidor por separado. Se puede conectar a Firebase, sincronizar datos y luego responder "consultas" para los clientes. Todavía se puede comunicar con los clientes a través de Firebase, y Firebase aún puede ser el principal almacén de datos, pero tu servidor por separado puede hacer el trabajo para realizar consultas rápidamente.

Tenemos la intención de mejorar esto con el tiempo, ya que nos damos cuenta de que es un punto débil en comparación con las consultas flexibles proporcionadas por los sistemas de bases de datos relacionales tradicionales.

+1

Michael, tiene su equipo hizo cualquier novedad con consulta? –

+3

Sin nuevas características notables. Sin embargo, es posible que le interese esta publicación de blog que hemos publicado recientemente, en la que se describen las mejores prácticas para estructurar sus datos para Firebase, dado que no admitimos consultas similares a las de SQL: https://www.firebase.com/blog/2013- 04-12-denormalizing-is-normal.html –

+3

Ahora hay una publicación en el blog y una nueva versión para el enfoque "Ejecutar como un servidor separado" que muestra lo increíblemente fácil que es integrar ElasticSearch: https: // www. firebase.com/blog/2014-01-02-queries-part-two.html – Kato

24

El Sr. Lehenbauer es, por supuesto, el maestro de todas las cosas de Firebase, así que escúchalo. ;) Sin embargo, este tema en particular es uno en el que he estado trabajando durante un par de semanas.

Aquí están algunos de mis pensamientos, para mejorar el "Ejecutar un servidor independiente" y "Consulta del lado del cliente" respuestas:

Elasticsearch (un guión Node.js)

Con una script node.js en el servidor, puede tener ElasticSearch integrado y proporcionar algunas búsquedas de contenido sólido en menos de una hora. Aquí hay una entrada de blog y una librería que hace que sea aún más fácil: https://www.firebase.com/blog/2014-01-02-queries-part-two.html

/consultas comunes cacheables

Estos pueden ser manejados por un proceso de servidor/cron que lee la mesa y duplica los datos. Por ejemplo, supongamos que deseo mostrar "no disponible/disponible" para el nombre de inicio de sesión de un usuario durante el registro, pero almaceno los registros del usuario con una identificación única diferente por algún motivo complejo.

Mi cron/servidor podría leer todos los registros de la tabla de usuarios, luego insertarlos en otra tabla almacenada por correo electrónico, con un valor de identificación de registro del usuario (o cualquier otro dato que yo desee saber) .

Este enfoque de datos duplicados es una técnica de almacenamiento en caché manual y es una práctica común en entornos sin SQL; estamos intercambiando espacio de almacenamiento (que se presume barato y disponible) por la velocidad y los procesos simplificados.

consultas personalizadas (utilizando una cola)

consultas personalizadas podrían ser enviados a través de XHR (Ajax) directamente a un servidor, lo que podría hacer el trabajo duro y volverá mejores resultados. Alternativamente, puede utilizar Firebase para conectarse con un servidor de back-end mediante la utilización de una cola.

El cliente coloca la solicitud de consulta como un JSON en una tabla especial de Firebase llamada queue y espera una respuesta.

El servidor espera queue.on('child_added', ...) y sirve los datos de nuevo utilizando `queue_record.child ('respuesta', ... datos aquí ...)

Esto tiene algunas ventajas agradables. Por un lado, cualquier cantidad de servidores podría escuchar y dar respuestas, haciendo que el equilibrio de carga sea muy fácil. El código para esto es muy simple de configurar y covered in another thread aquí en SO.

Espero que ayude esto!

+1

Ahora también hay una posibilidad para integrar ElasticSearch, que es increíblemente fácil y hace que las búsquedas sean fáciles como circular, a costa de un script node.js : https://www.firebase.com/blog/2014-01-02-queries-part-two.html – Kato

2

he creado mi propio CMS para la base de fuego por lo que al crear una tabla de datos de la base de fuego Filtré con este

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 
+0

Esto es lo que Lehenbauer quiere decir con "consultas del lado del cliente". Y yo recomendaría usar este equivalente pero más forma legible: 'if (child [filter] .match ('^' + string)) {' (reemplaza todo desde la segunda línea en adelante) – Jonathan

Cuestiones relacionadas