2012-01-05 5 views
1

ランダムな時間にn個の信号を与えることができるデバイスを想定します。私たちはこのデータをm個のデバイスからある期間にわたって収集します。だから、私たちの「メタ・スキーマは、」私はさまざまな方法を理解しようとしているカサンドラとイムにこのデータを入れたいカサンドラ:モデリングタイムデータ

DeviceId : int 
SignalId : int 
SignalDateTime : DateTime (with mSec as YY-MM-DD HHMMSS.mm) 
ExtraData : String 

です。私は、3つの値(DeviceId、SignalId、SignalDateTime)の任意の組み合わせでデータを取得できるようにしたいと思います。

DeviceIdを行キーとして使用し、SignalDateTime:SignalIdをペアリングすると想像することができます。しかし、私はExtraDataで何をしますか?多分それをスーパーカラムにするのでしょうか?同様に、DeviceIdとSignalDateTimeで独自の行キーを作成することもできましたが、これはCassandraを使用するうえで妥当な方法ですか?

+0

3つの値の任意の組み合わせでデータを取得する必要があると言うときは、正確に何を意味しますか。日付はありますが、デバイス/シグナルIDはなく、その特定の日付のすべてのデータを取得する必要があります。あるいは、シグナルIDを持っていて、そのシグナルIDとそのシグナルIDのすべてのデータを持つすべてのデバイスを取得する必要がありますか? – nickmbailey

+0

@nickmbailey - >正確に。 – ethrbunny

答えて

3

Cassandraを使用すると、実際にはデータを作成しようとするさまざまなクエリから始め、そこから適切な列ファミリ定義に戻ることができます。理想的には、すべてのクエリは1つの行からのデータのみを選択します。異なるフィールドで依然としてクエリを実行できるようにするには、複数の列ファミリのデータを非正規化する必要があります。

次の列の家族に始めることができ:

CF1 
RowKey: DeviceID 
ColumnNames: SignalDateTime 
Value: Serialized [SignalID + ExtraData] 

CF2 
RowKey: SignalID 
ColumnName: SignalDateTime 
Value: Serialized [DeviceID + ExtraData] 

値が(JSON、ProtocolBuffersなどを使用して)*のID + ExtraDataのいくつかのシリアル化された形になります。このスキーマを使用すると、時刻t0からt1までのDevice1からのすべてのデータ、またはt0からt1までのSignal1のすべてのデータを照会することができます。

また、DeviceIDとSignalIDをt0からt1に問い合わせることもできます。あなたの時間の範囲内でSignalIDと時間のためにデバイスIDとスライスの列に基づいて行をフェッチします。このコラムの家族を照会するには

CF3 
RowKey: DeviceID 
ColumnName: CompositeColumn[SignalID:SignalDateTime] 
Value: ExtraData 

:これは、複合列を使用するために理にかなってケースです。 pycassaのドキュメントはbasics of composite columnsのいくつかを説明しています。

+0

私は、TimeUUIDの列スライシングは、注文したパーティショナーを使用しない限りうまくいかないと思っていました。 – ethrbunny

+0

列スライスと行スライスを混同しないでください。行をスライスするには、順序付けられたパーティショニングが必要です。しかし、ある行内の列はソート順に格納されているため、列をスライスすると効率的です。 – psanford