46 votes

Requêtes de type base de données avec Firebase

Existe-t-il un moyen rapide d'effectuer des requêtes de type base de données avec Firebase?

Par exemple:

Avec une référence de base de feu users avec des champs user_id , name et age , quelle serait la meilleure façon de faire une requête similaire à cette:

 SELECT name FROM users WHERE `user_id`=147;
 

et

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

70voto

Michael Lehenbauer Points 4538

En général, non. Firebase est essentiellement un "temps réel de la base de données", constamment streaming mises à jour pour vous en tant que modifications de données, il est donc plus difficile de le faire à des fins générales de l'interrogation. Pour l'instant, il y a un couple de (certes limitée) interrogation des primitives qui sont fournis. Voir les Requêtes ou des Limites de page dans la documentation.

Bien souvent, vous pouvez contourner ces limitations par le biais d'une variété d'approches:

  • Utiliser les noms de lieux et les priorités de manière intelligente. Si vous structurez vos données /users/[nom d'utilisateur]/nom, vous pouvez effectuer votre premier "requête" par juste de la récupération /utilisateurs/147/nom. Si vous savez que vous aurez envie de requête par l'âge, vous pouvez utiliser l'âge comme la priorité pour l'utilisateur nœuds et puis faire "usersRef.startAt(21).endAt(21).sur('child_added', ...)" pour obtenir tous les utilisateurs de l'âge de 21 ans. Vous avez encore de les compter manuellement.
  • Faire côté client de l'interrogation. Si l'ensemble du jeu de données est petite, vous pourriez être en mesure de récupérer la totalité de l'ensemble de données, puis filtre / processus manuellement sur le client.
  • Exécuter un serveur distinct. Il peut se connecter à Firebase, synchronisation des données, puis de répondre à des "questions" pour les clients. Il peut encore communiquer aux clients par le biais de Firebase, et Firebase peut encore être la principale banque de données, mais votre serveur distinct peut faire le travail pour exécuter des requêtes rapidement.

Nous avons l'intention d'améliorer ce au fil du temps, nous sommes conscients que c'est un point faible par rapport à la flexibilité de l'interrogation fournis par les traditionnels systèmes de base de données.

24voto

Kato Points 12210

M. Lehenbauer est bien sûr le maître de toutes choses Firebase, afin de l'écouter. ;) Cependant, ce sujet particulier est celui que j'ai été travailler plus pour un couple de semaines maintenant.

Voici quelques-unes de mes pensées, pour améliorer la "Exécuter un serveur distinct" et "côté Client de l'interrogation" réponses:

ElasticSearch (un node.js le script)

Avec un node.js script sur le serveur, vous pouvez avoir ElasticSearch intégré et d'offrir une certaine teneur en solides recherches en moins d'une heure. Voici un blog et une lib qui le rend encore plus facile: https://www.firebase.com/blog/2014-01-02-queries-part-two.html

cache/requêtes communes

Ceux-ci peuvent être traitées par un serveur/cron processus qui lit la table et les doublons dans les données. Par exemple, supposons que je veux montrer "non disponible/disponibles" pour un nom de l'utilisateur lors de l'inscription, mais stocker les enregistrements d'utilisateur par un autre IDENTIFIANT unique pour certains complexes de la raison.

Mon cron/serveur est capable de lire tous les enregistrements de la table des utilisateurs, puis de les insérer dans une autre table qui est stocké à l'adresse e-mail, avec une valeur de l'ID de l'enregistrement (ou toutes autres données que j'aimerais bien le savoir).

Cette données dupliquées approche est en quelque sorte un manuel technique de mise en cache et est une pratique courante dans le No-SQL environs; nous sommes à la négociation de l'espace de stockage (qui est présumée être disponible et bon marché) pour la vitesse et la simplification des processus.

des requêtes personnalisées (à l'aide d'une file d'attente)

Personnalisé les requêtes peuvent être envoyées via XHR (ajax) directement à un serveur, ce qui peut faire le dur travail et le retour à de meilleurs résultats. Alternativement, vous pouvez utiliser Firebase pour se connecter à un serveur de back-end en utilisant une file d'attente.

Le client de la demande de requête en tant que JSON dans une Firebase table appelée queue et attend une réponse.

Le serveur est à l'écoute de queue.on('child_added', ...) , et sert les données à l'aide de `queue_record.enfant (la'réponse', ...données ici...)

Cela a de beaux avantages. Pour l'un, un nombre quelconque de serveurs ont pu écouter et de servir les réponses, faire de l'équilibrage de la charge un jeu d'enfant. Le code est très simple à configurer et à couvert dans un autre thread ici dans.

Espérons que cela est utile!

2voto

Jakob Hartman Points 3

J'ai créé mon propre CMS pour Firebase, donc lors de la création d'un tableau des données Firebase, je l'ai filtré avec cette

 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 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X