2017-03-22 4 views
0

次の従業員の列ファミリを作成カサンドラカサンドラ - シンプル/ベーシックデータモデリングすべての従業員を取得するために

ケース1:私は、すべての従業員を取得したい場合

CREATE TABLE employee (
    name text, 
    designation text, 
    gender text, 
    created_by text, 
    created_date timestamp, 
    modified_by text, 
    modified_date timestamp, 
    PRIMARY KEY (name) 
); 

UIからは、そうではありません可能なのは です。それは本当ですか?

select * from employee; //名前でパーティション化されているため不可能

ケース2: 私はすべての従業員を取得するためにこの方法を実行するように言われました。 すべての従業員を取得するには、これを静的キーで設計する必要があります。

CREATE TABLE employee (
    static_name text, 
    name text, 
    designation text, 
    gender text, 
    created_by text, 
    created_date timestamp, 
    modified_by text, 
    modified_date timestamp, 
    PRIMARY KEY (static_name,name) 
); 

static_nameすなわち)「従業員は、」パーティション・キーと名前意志クラスタリング・キーになります。主キー、両方static_nameと名前

static_nameの組み合わせは - >たびに、あなたは何

「全従業員のクエリを選択する」ことができるようになり、今で静的な値ie)EMPLOYEE

を挿入し、従業員を追加します

//これはすべての従業員を返します select * from employee where static_name = 'EMPLOYEE';

これは本当ですか?ケース1を使用してすべての従業員を返すことはできませんか?

答えて

1

どちらのアプローチもo.kです。いくつかのキャッチと

アプローチ1:

あなたはUIは、私はあなたが使用することを意味推測と言うときの単純な選択* ...それはあなたが一つ一つを取得したい場合、これは本当に箱から出して動作しないことが正しいのですそのうちの1人。特にデータセットが大きい場合。ドライバーでページネーションを使うことができます(私はそれを使用するためにしばらくの間、ケースを持っていなかったので100%確信していません)が、私がトークン関数を使用するすべてのパーティションを飛び越える必要があるとき:

select token(name), name from employee limit 1; 

system.token(name) | name 
----------------------+------ 
-8839064797231613815 | a 

トークンの結果を使用して、次のクエリに入れます。これはあなたのプログラムによって行われなければなりません。それ以上の要素をすべて取得したら、-8839064797231613815よりも低いすべての要素を開始する必要があります。

select token(name), name from employee where token(name) > -8839064797231613815 limit 1; 

system.token(name) | name 
----------------------+------ 
-8198557465434950441 | c 

そして、私はすべての要素をフェッチするまでこれをループに包み込みます。 (これは、クラスタから幅の広い行を取り出すときに、これがどのようにスパークするかと思います)。

このモデルの欠点は、クラスタ全体に行き渡らなくてはならず、分析作業負荷で多かれ少なかれ使用されるためです。 UIについて言及して以来、結果を得るにはユーザーが長くかかりすぎるので、UI関連のものではアプローチ1を使用しないことをお勧めします。第1の

アプローチ2.

欠点は、ホット行と呼ばれるものであろうということです。つまり、すべての更新が単一のパーティションに移動することを意味し、これはほとんどの場合悪いモデルです。

利点は、1つのパーティションにページを分けて、ドライバに組み込まれたページ機能によってデータを取り出せることです。

これは、適度な負荷(1秒間に数十回または数百回の更新)と比較的少数のユーザーがいればうまく動作しますが、これはうまく動作します。あなたの数値が大きい場合は、何らかの形で複数のパーティションに分割して、「負荷」を均等に分散させる必要があります。

「EMPLOYE」に「EMPLOYE_A」、「EMPLOYEE_B」などのアルファベットを含む可能性があります。これは比較的うまくいくでしょう。辞書的分布のために理想的ではない。また、一部の区画は、理想的でないものも比較的多く得ることがある。

一つのアプローチは、いくつかの人工的な列を作成し、あなたがそこに10個のバケットがあり、あなたは「EMPLOYEE」に挿入する際に、パーティションあなただけのように「EMPLOYEE_1」と(静的プレフィックスにランダムバケット)を追加すると言う設計で言わせてことであろう...しかし、あなたが結果を使い果たすまで、検索すると特定のパーティションに行きます。

+0

詳細な説明をありがとうございます。はい、アプローチ2では、EMPLOYEE_1、EMPLOYEE_2 ...などを使用する方がよいでしょう。その結果、リング内の1つのノードではなく、カスケードラリング全体にデータが分散されます。 – Raghu

関連する問題