0

アップロードされた曲としましょう:

  • ビュー
  • いいね
  • 嫌い
  • コメント
  • お気に入り
  • ダウンロード

そして、さらに多くの可能性があります。

曲自体に関する情報を保存するために、幅の広い行を使用しています。列名はタイムスタンプで、値はJSONその曲に関するすべての情報を含む文字列です。

数字だけを保存する必要がある場合はそれほど問題はありませんが、実際には、その曲を気に入ったと言っているユーザーに関する情報を保存する必要があります。

したがって、1000 人のユーザーが曲を気に入った場合、そのすべての情報を 1 つの列にまとめるのは、おそらく悪い考えです。

したがって、おそらくそれを行う唯一の方法は、その情報を別のCFに保存することです。

しかし、曲自体をさまざまな列に散らばっているすべての情報とどのように「接続」するのかわかりませんか?

だから私の質問は、私は正しい方向に向かっているのかということです.もしそうなら、どのようにこれらすべてのアクションを保存し、それらを結び付けますか.

編集

いいねシステムを構築しようとしていますが、ほとんど手に負えなくなっています。これらは、好き/嫌いのために実行する必要があるアクションです

  1. ユーザーがすでにそのアイテムを気に入っているかどうかを確認する
  2. ユーザーが以前にそのアイテムを気に入らなかったかどうかを確認する
  3. 彼が気に入らなかった場合は、そのエントリを削除します
  4. 現在のいいねを取得する
  5. そして今、アイテム自体を更新し、新しいいいね数を設定します
  6. CFそのアイテムを気に入ったすべてのユーザーを含む更新

そして、実際には実行する必要があるクエリがさらにいくつかあるため、合計でほぼ6つのクエリを取得するか、それ以上が正常ですか?

4

3 に答える 3

1

「User、Song、Song_Likes、User_Likes、Song_ Dislike、User_Dislike」の異なる列ファミリーを作成し、songId (UUID) と UserId (UUID) を使用して、列ファミリー間の類似を確立します。

CF
 User: KS {userId} -> {{user}, {JSON user Info}}
 Song: KS {songId} -> {{song}, {JSON song Info}}

 Song_Comments: {songId -> {(Reversed)timestamp, userUUID:UserName:comment}}
  Reveresed Time stamp can help you to get latest N comments quickly.

 Song_Likes: {songId -> {timeStamp, userUUID}}
   (or if time of event is not important.)
 Song_Likes: {songId -> {userUUID, column Data {....} }

 similarly for other Column Families.

以下のようなものがあなたに役立つかもしれません。http://www.rackspace.com/blog/cassandra-by-example/

于 2012-11-25T14:34:49.553 に答える
1

何を照会する必要があるかを知ることは、Cassandra スキーマを計画する際の最も重要な考慮事項の 1 つです。Cassandra は、大量の書き込みを処理するように設計されています。

実装する他の機能に応じて、追加の列ファミリーを作成するか、これらを完全に置き換えて、cassandra がクエリを実行するために最も最適化された方法でデータを格納する必要がある場合があります。

さらに、できるだけ多くのデータを cassandra にネイティブに保存することをお勧めします。JSON オブジェクトを太い文字列列にロードすることはありません。少なくとも、いいねの値など、適切なデータを cassandra に直接保存します。

User と Song という 2 つのドメイン モデルと、保存する 3 つのクラスのデータがあります。

  1. コメント
  2. 好き/嫌い/お気に入り
  3. ビュー/ダウンロード

そして、更新アルゴリズムに必要ないくつかの機能クエリについて詳しく説明します。

  1. ユーザーがすでにそのアイテムを気に入っているかどうかを確認する
  2. ユーザーが以前にそのアイテムを気に入らなかったかどうかを確認する
  3. 彼が気に入らなかった場合は、そのエントリを削除します
  4. 現在のいいねを取得する
  5. そして今、アイテム自体を更新し、新しいいいね数を設定します
    • Cassandraカウンターを使用すると、これらの両方のステップを一度に実行できます
  6. そのアイテムを気に入ったすべてのユーザーを含む更新 CF

これらのクエリ要件を満たすことができるスキーマは次のとおりです。

最初に、 User と Songの CF を定義します。どちらも UUID をキーとして使用します。

create column family users with comparator=UTF8Type
   and column_metadata=[{column_name: user_name, validation_class: UTF8Type, index_type: KEYS},
   {column_name: json_data, validation_class: UTF8Type}];

create column family songs with comparator=UTF8Type
   and column_metadata=[{column_name: user_name, validation_class: UTF8Type, index_type: KEYS},
      {column_name: json_data, validation_class: UTF8Type}];

セカンダリ インデックスは、ユーザー名でユーザー行を取得するのに役立ちます。パフォーマンスに関する考慮事項については、こちらを参照してください。


コメントは、次のように各コメントの UUID をキーとして使用してモデル化できます。

create column family comments with comparator = 'UTF8Type' 
   and column_metadata=[{column_name: user, validation_class: UUIDType, index_type: KEYS},
      {column_name: song, validation_class: UUIDType, index_type: KEYS},
      {column_name: timestamp, validation_class: DateType},
      {column_name: comment, validation_class: UTF8Type}];

ユーザーの好き嫌いは相互に排他的であるため、1 つの列ファミリーを使用して、ユーザーの曲の好き嫌いをすべて格納できます。Favorite に like を暗示するように制約すると、この 1 つだけで 3 つすべてを行うことができます。ユーザーの UUID を行キー、曲の UUID を列キーとして使用すると、列の値は 0 => 値なし、1 => 嫌い、2 => 好き、3 => お気に入り。

create column family user_likes with comparator = 'UUIDType'
   and default_validation_class = IntegerType;

あとは、曲ごとの高評価、低評価、お気に入り、ビュー、ダウンロードの合計を追跡するだけです。Cassandra のカウンター列タイプを使用して、1 つの CF でこれを実現できます。曲の UUID を CF キーとして使用します。

create column family song_data with default_validation_class=CounterColumnType
   and column_metadata=[{column_name: likes},
      {column_name: dislikes},
      {column_name: favorites},
      {column_name: views},
      {column_name: downloads}];
于 2012-12-02T04:24:10.683 に答える
1

Casandra では結合を実行できないため、代わりにデータを非正規化する必要があります。したがって、エンティティと関係を別々の列ファミリーに保持するという考え方です。また、cassandra にはスーパー カラムがあることも覚えておいてください。これは、1 レベル深く進みたい場合に非常に役立ちます。cassandra の制限もお見逃しなく - 使用するバージョンによって異なります。

于 2012-11-29T15:28:54.340 に答える