2013-03-06 3 views
7

Une chose avec laquelle je me bats avec Firebase (ou d'autres db NOSQL, je devine?) Est le fait que les ID ne font pas partie du corps de la ligne". Donc, si ma collection ressemble:Garder la trace des ids dans NOSQL db (firebase)

Books 
    |----ldJEIF 
      |----Title: "A Tale of Two Cities" 
      |----Author: "Charles Dickens" 
      |----Body: "It was the best of times..."  
    |----2difie 
      |----Title: "Moby Dick" 
      |----Author: "Herman Melville" 
      |----Body: "Call me Ishmael..." 

Si je récupère le BooksList, puis sélectionnez myBook = books[ldJEIF] pour faire quelque chose avec les données, myBook n'a aucune idée dans la liste, il est venu. Si par la suite je veux l'ajouter à un UserLibrary, par exemple, je dois soit dénormaliser mes données, soit faire une sorte de recherche inversée, ou passer ldJEIF au lieu de l'objet livre et rechercher constamment les données. Est-ce que je manque quelque chose? Quelle est la meilleure façon de traiter ce problème?

Répondre

16

Saisissez l'ID lorsque vous obtenez les données

Pour Firebase au moins, lorsque vous récupérez les dossiers, vous obtenez également l'ID. Donc, une solution simple est de stocker l'ID alors. Si vous ne disposez pas d'un endroit pratique pour cela, il vous suffit de le coller dans les données:

firebaseRef.on('child_added', function(snapshot) { 
    var data = snapshot.val(); 
    data.id = snapshot.name(); // add the key as an id 
}); 

Bien sûr, si vous faites cela, vous devez vous rappeler de le reprendre avant d'envoyer les données de retour au serveur.

Utilisez l'instantané

Encore une fois spécifique à Firebase, vous pourriez garder un arbitre à l'instantané et passer que près au lieu de seulement les données. Je n'aime pas vraiment cette approche personnellement, mais je n'ai pas été capable de déterminer quel principe interne propre elle enfreint. Il est cependant extrêmement pratique dans certains cas, puisque vous aurez à tout moment une référence aux données, à l'identifiant et à l'objet Firebase; plutôt pratique.

Mettez l'ID dans les données

Une pratique courante dans NoSQL est de mettre juste les ids dans les données - il n'y a rien de mal avec cet autre qu'un peu d'espace de stockage supplémentaire - négligeable dans la plupart cas d'utilisation. Ensuite, lorsque vous récupérez des enregistrements, l'ID est déjà dans les données et tout est époustouflant. Pour Firebase, vous pouvez générer l'ID et le placer dans les données lors de la création. L'intelligence suivante est venue de l'un de leurs exemples open source:

var data = {...}; 
var id = firebaseRef.push().name(); // generate a unique id based on timestamp 
data.id = id; // put id into the data 
firebaseRef.child(id).set(data); 
+0

Merci pour la réponse approfondie. – sprugman

+3

Garder un instantané est en fait une chose parfaitement sûre/correcte à faire. Les instantanés sont immuables, de sorte qu'ils ne seront pas modifiés par vous même si les données sous-jacentes sont modifiées. Chaque instantané a une fonction .ref() que vous pouvez utiliser pour obtenir une nouvelle référence Firebase pour ces données. –

+0

Si la référence de Firebase est Firebase-Util reference -> Il y a un "bug" intéressant avec cette solution (var data = snapshot.val(); data.id = snapshot.name();). Le rappel est déclenché plus de fois. – Casero

Questions connexes