2016-05-04 13 views
0

Cassandraのデータモデルを構築しようとしています。古典的なテーブル/列ビューではなく、パスビューでデータを保存するオプションがあります。例Cassandra "path"データモデル

CREATE TABLE data1 (
    user uuid, 
    timestamp timeuuid, 
    column1 int, 
    column2 int 
    primary key (user, timestamp) 
) 
CREATE TABLE `data2` (
    user uuid, 
    timestamp timeuuid, 
    column1 int, 
    column2 int 
    primary key (user, timestamp) 
) 

については

はなりつのテーブルのように:私たちはそれはグラファイトがにstatsdメトリックと引数を収集する方法と少し似てい

insert into all_data (user, timestamp, path, value) values (1,0,'data1.column1',1) 
insert into all_data (user, timestamp, path, value) values (1,0,'data1.column2',2) 
insert into all_data (user, timestamp, path, value) values (1,9,'data2.column1',7) 
insert into all_data (user, timestamp, path, value) values (1,9,'data2.column1',8) 

などのデータを挿入

create table all_data (
    user uuid, 
    timestamp timeuuid, 
    path text, 
    value blob 
    primary key (user, timestamp, path) 
) 

そのようなモデルは、列ベースの記憶域を持ち、行全体を取得する必要はほとんどありませんが、時間範囲内ではユーザーあたり1つの列になります。

誰もそのようなデータモデルの経験はありますか、それは本当に古典的なものより優れたパフォーマンスを持っていますか?あなたはこれに関するアドバイスをしてもらえますか?

+1

モデル化しようとしているデータが記述されていない場合、データモデリングについての回答はどうすればよいでしょうか? – OrangeDog

答えて

0

あなたが後になっているデータによって異なります。
[user、timestamp]のすべての列を取得する場合は、最初のモデルを使用します。 1つのクエリ(WHERE user = 1 AND timestamp = 0)は、1つのノードを調べてすべての列を取得します。
2番目のモデルを使用するには、可能なすべてのuser/timestamp/pathの組み合わせに対してクエリを実行する必要があります。 WHERE user = 1 AND timestamp = 0 AND path = 'data1.column2(WHERE user = 1 AND timestamp = 0 AND path =' data1.column1 ')を取得するには、 ')。すべての行は、潜在的に別のノードに存在する可能性があります。
2番目のモデルはパフォーマンスが低下します。