Отслеживание идентификаторов в 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);