これは効率的にモデル化するのが非常に難しいことです。
私はCassandraのセカンダリインデックス(残念ながら現時点ではまだ必要なダミーのインデックス値)を使用することをお勧めします。少なくとも3つの列、 '開始'、 '終了'、および 'ダミー'でイベントごとに1つの行を使用する必要があります。これらのそれぞれにセカンダリインデックスを作成します。最初の2つはLongTypeで、最後の2つはBytesTypeです。詳細については、this post on using secondary indexesを参照してください。あなたがセカンダリインデックスクエリ(私が言及した不幸な要件)のための少なくとも1つの列でEQ式を使用する必要があるので、EQは常に「0」に設定できる「ダミー」になります。つまり、EQインデックス式本質的にノーオペレーションとなります)。残りのイベントデータは、開始、終了、およびダミーとともに行に格納できます。 pycassaで
、Pythonのカサンドラクライアント、クエリは次のようになります。他のクライアントで似たような
from pycassa.index import *
start_time = 12312312000
end_time = 12312312300
start_exp = create_index_expression('start', start_time, GT)
end_exp = create_index_expression('end', end_time, LT)
dummy_exp = create_index_expression('dummy', 0, EQ)
clause = create_index_clause([start_exp, end_exp, dummy_exp], count=1000)
for result in entries.get_indexed_slices(clause):
# do stuff with result
があるはずです。
私が最初に考えた選択肢は、ほとんど常にバッドシングのOrderPreservingPartitionerでした。索引の場合は、開始時刻を行キーとして、終了時刻を列名として使用します。その後、start_key = start_timeおよびcolumn_finish = finish_timeで範囲スライスを実行できます。これにより、開始時刻以降のすべての行が検索され、finish_timeより前の列のもののみが返されます。非常に効率的ではなく、大規模なマルチゲットなどを行う必要があります。ノードはローカルデータのみを索引付けし、大部分の定型索引コードが処理されるため、組み込みセカンダリ索引アプローチが優れています。