2013-03-06 11 views
7

Jedną rzeczą, z którą walczę trochę z Firebase (lub innymi bazami danych NOSQL, zgaduję?) Jest fakt, że identyfikatory nie są częścią ciała rząd". Więc jeśli moja kolekcja wygląda następująco:Śledzenie identyfikatorów w 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..." 

Gdybym odzyskać BooksList, a następnie wybierz myBook = books[ldJEIF] coś zrobić z danymi, myBook nie ma pojęcia, gdzie na liście pochodzi. Jeśli później chcę go dodać na przykład do UserLibrary, muszę albo zdenormalizować moje dane, albo przeprowadzić odwrotne wyszukiwanie, albo przepuścić ldJEIF wokół obiektu książki i stale wyszukiwać dane. Czy czegoś brakuje? Jaki jest najlepszy sposób postępowania z tym problemem?

Odpowiedz

16

Grab identyfikator kiedy masz dane

Dla Firebase przynajmniej, kiedy pobierać rekordy, można również uzyskać identyfikator. Tak więc prostym rozwiązaniem jest przechowywanie ID następnie. Jeśli nie masz dogodnym dla niego miejsce, można po prostu trzymać go w danych:

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

Oczywiście, jeśli to zrobić, trzeba pamiętać, aby zabrać go z powrotem przed wysłaniem danych z powrotem na serwer.

pomocą migawka

Ponownie specyficzne Firebase, można zachować wg migawce i przekazać, że ok, a nie tylko danych. Naprawdę nie podoba mi się to podejście osobiście, ale nie byłem w stanie przyswoić sobie tego, co narusza wewnętrzna zasada.

Jest to jednak bardzo przydatne w niektórych przypadkach, ponieważ w dowolnym momencie będziesz mieć odwołanie do danych, identyfikatora i obiektu Firebase; raczej przydatny.

Put identyfikator do danych

Powszechną praktyką w NoSQL jest po prostu umieścić identyfikatory do danych - nie ma nic złego w tym inne niż trochę dodatkowego miejsca do przechowywania - nieistotne w większości przypadków użycia. Kiedy pobierasz rekordy, ID jest już w danych i wszystko jest w porządku.

W Firebase można wygenerować identyfikator i umieścić go w danych podczas tworzenia. Poniższa sprytność pochodzi od jednego z ich otwartych przykładów:

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

Dzięki za dokładną odpowiedź. – sprugman

+3

Prowadzenie migawki jest właściwie całkowicie bezpieczne/poprawne. Migawki są niezmienne, więc nie ulegną zmianie, nawet jeśli podstawowe dane zostaną zmienione. Każda migawka ma funkcję .ref(), której można użyć do uzyskania nowej referencji Firebase dla tych danych. –

+0

Jeśli odwołanie do bazy Firebase-Util -> Istnieje interesujący "błąd" z tym rozwiązaniem (var data = snapshot.val(); data.id = snapshot.name();). Oddzwanianie jest wyzwalane więcej razy. – Casero

Powiązane problemy