1

私は Cassandra を初めて使用し、アカウント登録とログイン用の単純なユーザー テーブルを設計することから始めています。これは非常に簡単です:

行キー: ユーザー名; 列: 電子メール、名前、パスワード、ソルト。
または、次のようにします。
行キー: uuid; 列: ユーザー名、電子メール、名前、パスワード、ソルト。

この単純な構造に関して、2 つの質問があります。

  1. メール (およびユーザー名) を検索するためのインデックスが必要です。セカンダリ インデックスを使用するか、手動でインデックスを作成できます。電子メール/ユーザー名列のカーディナリティが高いため、2 番目のオプションを選択する必要がありますか? セカンダリ インデックスは、カーディナリティの低い列を対象としているようです。
  2. さらに重要なことに、キーをテーブルに同時に挿入するという問題にすぐに遭遇します。ユーザー名 (または電子メール) がデータベースにまだ存在しないことを確認するために、書き込み前に読み取りを行う必要があります。潜在的な競合状態を回避する方法はありますか (たとえば、2 人のユーザーが同じユーザー名/電子メールを同時に登録するなど)? それとも、ユーザー登録を処理するために追加のリレーショナル データベースを使用し、ログインやその他の目的でユーザー アカウントの詳細を cassandra データベースにコピーするのが正しい解決策ですか?
4

1 に答える 1

2
  1. はい、あなたが述べた理由から、独自のインデックスを作成する必要があります。電子メールとユーザー名は一意であるため、セカンダリ インデックスの候補にはなりません。

  2. 一意の値が必要な場合は、書き込む前に読み取る必要があります。2 人のユーザーが同時に同じユーザー名を選択するケースはおそらくまれであるため (トラフィックによって異なります)、指を交差させてうまくいくことを願っています。または、次のフローに従うこともできます。

    • ユーザーの存在を確認するために読み取りを行う
    • 存在しない場合は、レコードを書き込み、使用するタイムスタンプを保持します
    • ユーザーを再度読み取り、タイムスタンプを比較します
    • タイムスタンプが正しくない場合 (同じフローに従って他の誰かが最初のレコードを上書きしたことを意味する)、別の名前を指定するようにユーザーに促します。

#2 のフローは、時間枠内に同じユーザー名を書いた 2 番目のユーザーが勝つという効果がありますが、少なくとも 1 人のユーザーにその名前が使用されていることを伝える限り、これは問題ないと思います。

于 2013-02-21T20:49:04.093 に答える