7

我在使用 Firebase(或其他 NOSQL 数据库,我猜?)有点挣扎的一件事是,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则不知道它来自列表中的哪个位置。例如,如果我以后想将它添加到 aUserLibrary中,我必须对我的数据进行反规范化,或者进行某种反向查找,或者传递ldJEIF而不是 book 对象并不断查找数据。我错过了什么吗?处理这个问题的最佳实践方法是什么?

4

1 回答 1

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);
于 2013-03-06T14:50:48.010 回答