何を照会する必要があるかを知ることは、Cassandra スキーマを計画する際の最も重要な考慮事項の 1 つです。Cassandra は、大量の書き込みを処理するように設計されています。
実装する他の機能に応じて、追加の列ファミリーを作成するか、これらを完全に置き換えて、cassandra がクエリを実行するために最も最適化された方法でデータを格納する必要がある場合があります。
さらに、できるだけ多くのデータを cassandra にネイティブに保存することをお勧めします。JSON オブジェクトを太い文字列列にロードすることはありません。少なくとも、いいねの値など、適切なデータを cassandra に直接保存します。
User と Song という 2 つのドメイン モデルと、保存する 3 つのクラスのデータがあります。
- コメント
- 好き/嫌い/お気に入り
- ビュー/ダウンロード
そして、更新アルゴリズムに必要ないくつかの機能クエリについて詳しく説明します。
- ユーザーがすでにそのアイテムを気に入っているかどうかを確認する
- ユーザーが以前にそのアイテムを気に入らなかったかどうかを確認する
- 彼が気に入らなかった場合は、そのエントリを削除します
- 現在のいいねを取得する
- そして今、アイテム自体を更新し、新しいいいね数を設定します
- Cassandraカウンターを使用すると、これらの両方のステップを一度に実行できます
- そのアイテムを気に入ったすべてのユーザーを含む更新 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}];