1

Javaでcassandraにアクセスするためにhectorを使用しています。users、comments、user_like、user_recommend の 4 つのテーブルがあります。user_like および user_recommend テーブルには、カウンター列が 1 つあります。今、ユーザー ID に基づいて 4 つのテーブルすべてのデータにアクセスしたいのですが、どうすればよいですか? 指定された userId データをすべてのテーブルから個別に取得する必要がありますか、それとも一度に取得する方法はありますか?

4

1 に答える 1

1

残念ながら、クエリは列ファミリーにバインドされています。したがって、列ファミリーごとに 1 つのクエリが必要になります。

1 回の読み取りですべてを読みたい場合は、すべてを 1 つの列ファミリーに入れることを検討してください。

これが私がそれを行う方法です:

今あなたは持っています:

CF "comments"
"user1" => //row
column "name1" = "value1" //column

CF "user_like" "user1" => //行 column "name2" = "value2" //column

CF "user_recommend"
"user1" => //行
column "name3" = "value3" //column

3 つの列ファミリーがあるため、これには 3 つのクエリが必要です。

1 つの列ファミリーのすべては次のようになります。

CF "users"
."user1_comments" => //row
...column "name1" = "value1" //column
."user1_likes" => //row
...column "name2" = "value2" //column
."user1_recommends" => //row
...column "name3" = "value3" //column

これははるかに優れていますが、それでも最適ではありません。multi_get クエリですべてを取得できます。これらのクエリは、クラスター内の多くのノードで返されるのを待つ必要があるため、遅くなります (キーが非常に似ている場合、異なるキーが異なるノード イベントに分類される可能性があります)。

最適 : すべてが一列に並んでいます。

CF "users"
."user1" => //row
...column "comments:name1" = "value1" //column
...column "likes:name2" = "value2" //column
...column " recommends:name3" = "value3" //列

1行の読み取りですべてを取得できます。コメント、いいね、または推奨のみを個別に取得したい場合は、範囲クエリを使用して実行できます。すべてが 1 つの行にあるため、クエリははるかに高速になる傾向があります。Cassandra は非常に幅の広い行をうまく処理できるので、それらについて心配する必要はありません。

cassy の良い哲学は、「一緒に (同時に) 読んだら、一緒に (同じ場所に) 保存する」です。

編集:カウンターなしでカウンターを行うためのトリック。

Cassandra は常に新しい値を書き込むのが得意です (実際、これはバックグラウンドで 100% 行われます)。さらに、行またはその行の範囲内の列を数えるのは非常に高速です。そこで、重複のカウントを防ぐために使用できる「カウンター」を行う方法を思いつきました。注:これは、単一の増分(+1 ...好き、賛成票など)に対してのみ機能します。

必要なのは、そのカウンターを表す行に新しい列を書き込むことだけです。重複を許可する場合は、列名を timeUuid またはタイム スタンプにします。それ以外の場合は、彼が気に入ったメッセージの ID にします (この方法では、いいね! を 2 回クリックしても、1 回のいいね! としてカウントされます)。

複数のクエリを起動して列をカウントするか、java.util.Collection.size() を使用して 1 回の読み取りとカウントですべてを読み取ります。

このソリューションは cassandra の長所を利用していますが、非常に幅の広い行を避けたい場合は特に、すべての人に適しているとは限りません。Cassandra は非常に広い行を処理できますが、アプリでカウントするために使用するコレクションでメモリの問題が発生する可能性があることに注意してください。

次のような結果になる可能性があります。

CF "users"
."user1" =>
...column "comment:name1" = "value1"
...column "comment:name2" = "value2"
...column "likes:43f54880-a0fb-11e2-aafa -f1dce92b7e5b" = "1" //time uuids ここに
...column "likes:43f54881-a0fb-11e2-aafa-f1dce92b7e5b" = "1"
...column "likes:43f54882-a0fb-11e2-aafa-f1dce92b7e5b" = "1"
...column "likes:43f54883-a0fb-11e2-aafa-f1dce92b7e5b" = "1"
...column "recommend:7ba30e15-2b76-4aaa-b2d0-f8419a80a769" = "1" // uuid のおすすめアイテム
...column "recomment:603879cc-d7b0-4767-ad27-e5dd4aa34f62" = "1"

于 2013-04-08T14:56:27.333 に答える