5

Web アプリのユーザー データのデータ ストアとして firebase を使用することを考えています。私の現在の考えは、各ユーザーのデータを参照するキーとして参加したときのタイムスタンプを使用して、各ユーザーのデータを保存することです。この方式の利点は、一意の整数 ID をユーザーに割り当てる簡単な方法であり、ユーザーの時系列の並べ替えが簡単になることです。

ただし、欠点は、2 つのadd user要求が同じデータで送信された場合、アプリが喜んで 2 つの別個のエントリを追加することです。これは理想的ではありません。物事をシャッフルすることはできますが (現在のスキームではなく、電子メールをキーとして使用し、データの結合によって優先順位を付ける必要があると考え始めています)、そうしたくないとします。データの重複を防ぐ方法はありますか?

素朴なアプローチは、おそらく次のようなことをするだけです:

if(!searchFirebaseForUser(data)) {
    addUser(data);
}

しかし、これは間違いなく競合状態です。2 つの要求で、クエリを実行してデータベース内のユーザーを見つけられず、両方とも追加するのは簡単です。トランザクションでこれを行いたいのですが、Firebase トランザクション サポートがこのケースをカバーしていないようです。これを処理する方法はありますか?

4

4 に答える 4

9

おそらく、ユーザー名または電子メール アドレスをキーとして使用し、その場所へのアトミックな書き込みを試みる必要があります。

これは、トランザクション関数リファレンスからの関連するコード サンプルです。この場合、wilmaユーザーのキーとして使用します。

// Try to create a user for wilma, but only if the user id 'wilma' isn't already taken.
var wilmaRef = new Firebase('https://SampleChat.firebaseIO-demo.com/users/wilma');
wilmaRef.transaction(function(currentData) {
  if (currentData === null) {
    return {name: {first: 'Wilma', last: 'Flintstone'} };
  } else {
    console.log('User wilma already exists.');
    return; // Abort the transaction.
  }
}, function(error, committed, snapshot) {
  if (error)
    console.log('Transaction failed abnormally!', error);
  else if (!committed)
    console.log('We aborted the transaction (because wilma already exists).');
  else
    console.log('User wilma added!');
  console.log('Wilma\'s data: ', snapshot.val());
});
于 2013-09-04T22:16:55.520 に答える
4

セキュリティ ルールは、一意性を強制するのに十分ではありませんか? それらがアトミックかどうかはわかりません。

{
    "rules": {
        "users": {
            "$username": {
                ".write": "!data.exists()"
            }
        }
    }
}
于 2013-09-07T08:55:29.170 に答える