7

Firebase (または他の NOSQL dbs だと思いますか?) で少し苦労していることの 1 つは、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選択すると、リストのどこから来たのかわかりません。たとえば、後でそれを に追加したい場合は、データを非正規化するか、ある種の逆引きを行うか、 book オブジェクトの代わりに渡し、常にデータを検索する必要があります。何か不足していますか?この問題に対処するベストプラクティスの方法は何ですか?myBook = books[ldJEIF]myBookUserLibraryldJEIF

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 を生成し、作成時にデータに入れることができます。次の巧妙さは、オープンソースの例の 1 つから生まれました。

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 に答える