私は Cassandra を試しており、そこでデータをモデル化する方法を検討しています。Cassandra でモデル化する方法についての私の考えとともに、データ ストアの要件について説明しました。これが理にかなっているかどうかを教えてください。変更を提案してください。
Web でかなりの検索を行いましたが、多値列の要件をモデル化してインデックスを作成する方法について明確なアイデアが得られませんでした。これは非常に一般的な要件です。
どんな助けでも大歓迎です。
各レコードの現在のデータ:
{
‘id’ : <some uuid>,
‘title’ : text,
‘description’ text,
‘images’ : [{id : id1, ‘caption’: cap1}, {id : id2, ‘caption’: cap2}, ... ],
‘videos’ : [‘video id1’, video id2’, …],
‘keywords’ [‘keyword1’, ‘keyword2’,...]
updated_at: <timestamp>
}
必要なクエリ
- IDによるルックアップ
- images.id によるルックアップ
- キーワードによる検索
- updated_at > のすべてのレコード
現在のモデル
列ファミリー: 記事 ID: uuid タイトル: varchar 説明: varchar 画像: ビデオ: キーワード: updated_at: updated_date: [例: '2013-05-06:02']
列ファミリー: 画像記事インデックス
{ ‘id’ : <image id>, ‘article1 uuid’ : null, ‘article2 uuid’ : null, ... }
列ファミリー: キーワード記事インデックス
{ ‘id’ : <keyword>, ‘article1 uuid’ : null, ‘article2 uuid’ : null, ... }
サンプルクエリ:
IDによるルックアップ=>簡単
images.id によるルックアップ =>
ids = select * from ‘Image-Article Index’ where id=<image id> select * from Article where id in (ids)
キーワードによる検索 =>
ids = select * from ‘Keyword-Article Index’ where id=<image id> select * from Article where id in (ids)
すべてのレコード
updated_at > <some timestamp>
インデックス付き列の 1 つに 1 つの等価条件がない限り、Cassandra は範囲クエリをサポートしません。
指定されたタイムスタンプから日付と時間を抽出します。
for each date:hour in start to current time ids = select * from Article where update_date=date:hour and timestamp > <some timestamp> select * from Article where id in (ids)