我正在与Firebase(或其他NOSQL dbs,我猜?)进行一些挣扎是因为id不是“行”主体的一部分。所以如果我的收藏如下:
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
而不是书对象和不断查找数据。我错过了什么吗?处理这个问题的最佳做法是什么?
答案 0 :(得分:16)
获取数据时抓取ID
至少对于Firebase,当您检索记录时,您还会获得ID。因此,一个简单的解决方案是存储ID。如果您没有方便的地方,可以将其粘贴到数据中:
firebaseRef.on('child_added', function(snapshot) {
var data = snapshot.val();
data.id = snapshot.name(); // add the key as an id
});
当然,如果你这样做,你必须记住在将数据发送回服务器之前将其取回。
使用快照
再次特定于Firebase,您可以保留对快照的引用并传递它而不仅仅是数据。我个人并不喜欢这种方法,但我无法确定它所违反的整洁内部原则。
但是,在某些情况下,它非常方便,因为您可以随时引用数据,ID和Firebase对象;相当方便。
将ID放入数据
NoSQL的一个常见做法是将id放入数据中 - 除了一点额外的存储空间之外没有任何问题 - 在大多数用例中都是微不足道的。然后,当您获取记录时,ID已经存在于数据中,而且一切都很漂亮。
对于Firebase,您可以生成ID并在创建期间将其放入数据中。以下聪明之处来自他们的一个开源示例:
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);