Отслеживание идентификаторов в NoSQL db (firebase)

одна вещь, с которой я борюсь немного с Firebase (или другими NoSQL dbs, я предполагаю?) является тот факт, что идентификаторы не являются частью тела "строки". Поэтому, если моя коллекция выглядит так:

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..."

если я получу BooksList и выберите myBook = books[ldJEIF] чтобы что-то сделать с данными, myBook понятия не имеет, откуда он взялся в списке. Если я позже захочу добавить его в UserLibrary, например, я должен либо де-нормализовать свои данные, либо сделать какой-то обратный поиск, либо передать ldJEIFвокруг вместо объекта книги и постоянно искать данные. Я что-то упускаю? Каков наилучший способ решения этой проблемы?

1 ответов


возьмите идентификатор, когда вы получите данные

для Firebase по крайней мере, когда вы извлекаете записи, вы также получаете идентификатор. Таким образом, простое решение-сохранить идентификатор. Если у вас нет удобного места для этого, вы можете просто вставить его в данные:

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

конечно, если вы это сделаете, вы должны помнить, чтобы взять его обратно, прежде чем отправлять данные обратно на сервер.

используйте снимок

снова специфичный для Firebase, вы можете сохранить ссылку на снимок и передать его, а не только данные. Лично мне этот подход не очень нравится, но я не смог определить, какой аккуратный внутренний принцип он нарушает.

это, однако, очень удобно в некоторых случаях, так как у вас будет ссылка на данные, идентификатор и объект Firebase в любое время; довольно удобно.

поставить код в

обычная практика в NoSQL просто помещает идентификаторы в данные-в этом нет ничего плохого, кроме немного дополнительного пространства для хранения-незначительного в большинстве случаев использования. Затем, когда вы извлекаете записи, идентификатор уже находится в данных, и все шикарно.

для Firebase вы можете сгенерировать идентификатор и поместить его в данные во время создания. Следующий ум пришел из одного из их примеров с открытым исходным кодом:

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);