0

私はブログアプリにcassandraを使用しています。私の列ファミリーの 1 つは、ユーザーのすべてのフォロワー (UserFollowers) を格納するためのものです。ここで、各行はユーザーで、列は firstname+lastname+uuid で構成されるフォロワーのソートされたキーです。複合キーは、フォロワーの範囲を検索してページ分割して提供できるようにするためのものです。

例 - ユーザー A のフォロワーは次のようになります。

あ | ジョン:2f432t3 | サム:f242fg | ジョー:f24gf24

これまでのところすべて順調です。フォロワーを追加すると、彼は自分のソートされた場所に落ち、好きなように検索して取得できます。でも今、サムはフォロワーをやめる決心をしたので、私は彼を削除する必要があります。さらに、その直前に sam が名前を samuel に変更したため、現在送信している削除メッセージは samuel:f242fg です。その値は見つからず、列 sam:f242fg は残ります。

それに対する私の唯一の解決策は、削除したいときに行全体を引き出す必要があるということです。彼の ID だけでサムを見つけます。最初に保存されたキーを取得して削除します。多くのフォロワーを持つ人々にとっては非常に非効率的であり、これらの種類の削除があまり行われないことに依存しています.

より良い戦略はありますか?

ありがとうまたは

4

2 に答える 2

1

次のことをお勧めします。

  1. UserFollowers のキーをユーザーを表す ID に変更します。
  2. そのユーザーの名前を含む「名前」列を追加します。
  3. フォロワーの名前を保存する代わりに、ID を保存します。

したがって、データは次のようになります。

f1341df | name: george | 2f432t3 | f242fg | f24gf24
2f432t3 | name: john | f242fg | f1341df

... etc

これで、最初にユーザーにクエリを実行して ID のリストを取得し、次に単一のクエリでこれらすべてのキーを使用してマルチ取得を実行することで、フォロワーの名前のリストを取得できます。ユーザーが名前を変更しても、モデルが壊れることはありません。

于 2012-08-23T13:42:54.290 に答える
0

わかりました、より効率的に行う方法を見つけたと思います。アプリケーション側でもう少し作業が必要ですが、ソースに加えられた変更に関係なく機能し、削除できます。

問題をもう一度定義するだけです。

  1. 相互に参照する 2 つのエンティティがあります。例 - ユーザーとその他のユーザー。ユーザーは他のユーザーをフォローし、他のユーザーはユーザーがフォローします。
  2. 関連するエンティティを水平に格納したいと考えています。そのため、各行にユーザーのすべてのフォロワーを格納する CF UserFollowers があります。
  3. このユーザーがフォローしているすべてのユーザーを格納する逆 CF UserFollowing もあります。
  4. 実際に保存するのは、名前が firstname:lastname:uuid で構成されるキーであり、値がユーザーのコンパクトな json である、フォローまたはフォローしている各ユーザーの列です。
  5. フォロワーを取得したり、ユーザーをフォローしたりするのは、名前の範囲クエリで十分簡単です。
  6. ただし、リストのいずれかからユーザーを削除するのは、保存されていた元のキーを使用して削除メッセージを送信する必要があるため、より注意が必要です。

例: sam:jones:safg8sdfg が abe:maxwell:fh2497h9 の後に続いた場合、次のようになります -

in UserFollowers: fh2497h9 | sam:jones:safg8sdfg<json for sam>
and in UserFollowing: safg8sdfg | abe:maxwell:fh2497h9<json for abe>

sam が自分の名前を sammy に変更して abe のフォローを解除しようとすると、実際に格納されている列が sam:jones:safg8sdfg である場合に、削除メッセージが sammy:jones:safg8sdfg という名前の UserFollowers の列を削除しようとするため、機能しません。

したがって、これに対する私の解決策は、保存されたjsonを含むreverseKeyを両側に保存して、実際に反対側に保存されているキーを各側が認識し、それを使用してそこから自分自身を削除できるようにすることでした。

次のようになります。

in UserFollowers: fh2497h9 | sam:jones:safg8sdfg<json for sam.. reversKey:abe:maxwell:fh2497h9>
and in UserFollowing: safg8sdfg | abe:maxwell:fh2497h9<json for abe..reverseKey:sam:jones:safg8sdfg>

サムがフォローから abe を削除したい場合、reverseKey:sam:jones:safg8sdfg を使用して abes フォロワー リストから自分自身を削除できます。

そして誰もが幸せです。

于 2012-08-23T13:55:40.417 に答える