2013-03-06 14 views
7

Una cosa su cui sto combattendo un po 'con Firebase (o altri dbs di NOSQL, sto supponendo?) È il fatto che gli id ​​non fanno parte del corpo di la riga". Quindi, se la mia collezione si presenta come:Tenere traccia degli id ​​in 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..." 

Se posso recuperare il BooksList, quindi selezionare myBook = books[ldJEIF] di fare qualcosa con i dati, myBook non ha idea di dove nella lista è venuto. Se successivamente voglio aggiungerlo a un UserLibrary, ad esempio, devo de-normalizzare i miei dati, o fare una sorta di ricerca inversa, o passare ldJEIF in giro invece dell'oggetto libro e cercare costantemente i dati. Mi sto perdendo qualcosa? Qual è il modo migliore per affrontare questo problema?

risposta

16

Afferra l'ID quando si ottengono i dati

Per Firebase almeno, quando si recuperano i record, è anche ottenere l'ID. Quindi una soluzione semplice è quella di memorizzare l'ID allora. Se non si dispone di un posto comodo per esso, si può solo attaccare in dati:

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

Naturalmente, se si fa questo, si deve ricordare di prendere di nuovo fuori prima di inviare i dati indietro al server.

Usare l'istantanea

Anche in questo caso specifico per Firebase, si potrebbe tenere un ref per l'istantanea e passa che circa, invece di solo i dati. Non mi piace molto questo approccio, personalmente, ma non sono stato in grado di definire in che ordine il principio interno viola.

In alcuni casi è estremamente utile, poiché in qualsiasi momento si avrà un riferimento ai dati, all'ID e all'oggetto Firebase; piuttosto a portata di mano.

Mettere il ID nei dati

Una pratica comune in NoSQL è quello di mettere solo gli ID nei dati - non c'è niente di sbagliato in questo diverso da un po 'di spazio di archiviazione aggiuntivo - insignificante in più casi d'uso. Quindi quando recuperi i record l'ID è già nei dati e tutto è spinto.

Per Firebase, è possibile generare l'id e inserirlo nei dati durante la creazione. La seguente intelligenza proviene da uno dei loro esempi 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

Grazie per la risposta completa. – sprugman

+3

Mantenere un'istantanea in giro è in realtà una cosa perfettamente sicura/corretta da fare. Le istantanee sono immutabili, quindi non verranno cambiate da sotto di te anche se i dati sottostanti sono cambiati. Ogni snapshot ha una funzione .ref() che è possibile utilizzare per ottenere un nuovo riferimento Firebase per tali dati. –

+0

Se il riferimento firebase è firebase-riferimento Util -> C'è un "bug" interessante con questa soluzione (var data = snapshot.val(); data.id = snapshot.name();). Il callback viene attivato più volte. – Casero

Problemi correlati