Quelle est la meilleure façon de structurer les données sur firebase?

je suis nouveau à firebase et je veux savoir quelle est la meilleure façon de structurer les données.

j'ai un exemple simple:

il y a des candidats et des demandes sur mon projet. 1 le demandeur peut présenter plusieurs demandes . Comment puis-je relier ces 2 objets sur firebase? Cela fonctionne comme une base de données relationnelle? Ou l'approche doit être complètement différent en termes de conception de données?

100
demandé sur koceeng 2013-05-07 18:10:01

3 réponses

UPDATE : il existe maintenant un doc sur la structuration des données . Voir aussi cet excellent article sur NoSQL data structures .

le principal problème avec les données hiérarchiques, par opposition aux RDBMS, est qu'il est tentant de nicher des données parce que nous le pouvons. En général, vous voulez normaliser les données dans une certaine mesure (comme vous le feriez avec SQL) malgré l'absence de join statements et de requêtes.

vous aussi Vous voulez dénormaliser dans les lieux où lire l'efficacité est un sujet de préoccupation. C'est une technique utilisée par toutes les applications à grande échelle (par exemple Twitter et Facebook) et bien que cela aille à l'encontre de nos Principes DRY, c'est généralement une caractéristique nécessaire des applications évolutives.

L'essentiel ici est que vous voulez travailler dur sur l'écrit pour faire lit simple. Gardez les composants logiques qui sont lus séparément (par exemple, pour les salons de discussion, ne mettez pas le messages, méta-informations sur les salles, et listes de membres tous au même endroit, si vous voulez être en mesure d'itérer les groupes plus tard).

la principale différence entre les données en temps réel de Firebase et un environnement SQL est la recherche de données. Il n'y a pas de façon simple de dire "sélectionner les utilisateurs où X = Y", en raison de la nature en temps réel des données (il est en constante évolution, partage, rapprochement, etc, ce qui nécessite un modèle interne plus simple pour garder les clients synchronisés en échec)

un exemple simple vous mettra probablement dans le bon état d'esprit, alors voici:

/users/uid
/users/uid/email
/users/uid/messages
/users/uid/widgets

maintenant, puisque nous sommes dans une structure hiérarchique, si je veux itérer les adresses email des utilisateurs, je fais quelque chose comme ceci:

// I could also use on('child_added') here to great success
// but this is simpler for an example
firebaseRef.child('users').once('value')
.then(userPathSnapshot => {
   userPathSnapshot.forEach(
      userSnap => console.log('email', userSnap.val().email)
   );
})
.catch(e => console.error(e));

Le problème avec cette approche est que j'ai juste forcé le client à télécharger tous les utilisateurs messages et widgets . Pas de problème si rien de tout ça ne compte des milliers de personnes. Mais une grosse affaire pour les utilisateurs de 10k avec plus de 5K messages chacun.

ainsi maintenant la stratégie optimale pour une structure hiérarchique, en temps réel devient plus évidente:

/user_meta/uid/email
/messages/uid/...
/widgets/uid/...

Un outil supplémentaire qui est extrêmement utile dans cet environnement sont des indices. En créant un index des utilisateurs avec certains attributs, je peux rapidement simuler une requête SQL en itérant simplement l'index:

/users_with_gmail_accounts/uid/email

maintenant si je veux, dites, obtenez des messages pour les utilisateurs gmail, je peux faire quelque chose comme ceci:

var ref = firebase.database().ref('users_with_gmail_accounts');
ref.once('value').then(idx_snap => {
   idx_snap.forEach(idx_entry => {
       let msg = idx_entry.name() + ' has a new message!';
       firebase.database().ref('messages').child(idx_entry.name())
          .on(
             'child_added', 
             ss => console.log(msg, ss.key);
          );
   });
})
.catch(e => console.error(e));

j'ai offert quelques détails dans un autre so post sur la dénormalisation des données, donc vérifier ceux-ci ainsi . Je vois que Frank a déjà posté L'article D'Anant, donc je ne vais pas le répéter ici, mais c'est aussi une excellente lecture.

130
répondu Kato 2017-05-23 12:34:44

Firebase est très bien pas comme une base de données relationnelle. Si vous voulez la comparer à quoi que ce soit, je la comparerais à une base de données hiérarchique.

Anant a récemment écrit un grand billet sur le blog Firebase sur la dénormalisation de vos données: https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html

je suggérerais en effet de conserver la "carte D'identité" de chaque demande en tant qu'enfant de chaque demandeur.

47
répondu Frank van Puffelen 2013-05-07 15:34:55

votre scénario ressemble à un à plusieurs dans le monde relationnel, car selon votre exemple un candidat ont de nombreuses applications. Si nous arrivons à NoSQL firebase comme il ressemble ci-dessous. Il devrait être mis à l'échelle sans aucun problème de rendement. C'est pourquoi nous avons besoin de dénormalisation comme mentionné ci-dessous.

applicants:{
applicant1:{
    .
    .
    applications:{
        application1:true,
        application3:true
    }
},
applicant2:{
    .
    .
    applications:{
        application2:true,
        application4:true
    }
}}

applications:{
application1:{
    .
    .
},
application2:{
    .
    .
},
application3:{
    .
    .
},
application4:{
    .
    .
}}
4
répondu Prateep Gedupudi 2016-02-23 19:46:42