2017-01-07 13 views
0

私はCassandraでいくつかの列ファミリを設計しようとしていますが、プライマリ/パーティションキーに関する疑問があります。
私がしたいことは以下の通りです:Cassandra、パーティション/プライマリキー:パーティション化と制約

  • スプレッドデータを均等にクラスタ
  • 周りのパーティションの数を最小限に抑えるには、私はこれらの目標は、適切なパーティション/主を選択することによって達成可能であることを知っている

を読みますしかし、パーティション/プライマリキーを選択すると、あなたの列ファミリの無効なデータが許可されているとします。あなたは何をしていますか?

は、私は、次のcolum、家族を持っていることとします

CREATE TABLE group (
    groupname text, 
    username text, 
    PRIMARY KEY (groupname, username)) 

ユーザ名のみに私は(いくつかの仮定で)前の目標を達成することができ、この主キーを持つ一つのグループを、所属している必要がありますと仮定しますしかし、ユーザー名が複数のグループに置かれるのを避ける方法はありません。

列ファミリの内容を仮定するか、無効なデータの挿入を回避する方法がありますか? lightweight transactions

CREATE TABLE group (username text, groupname text, PRIMARY KEY (username)); 

を使用すると、ユーザーのグループへの更新を防ぐことができます:

INSERT INTO group (username, groupname) VALUES ('joe', 'wheel') IF NOT EXISTS; 

主キーとしてユーザー名を持つテーブルを宣言

+0

c Cassandraの「制約」と同等のRDBMSを再考してください。無効なデータが書き込まれないようにする必要がある場合は、アプリケーションレベルでそのデータをチェックする必要があります。 – Aaron

答えて

2

は1つのユーザ名とグループの関係が存在することを確認しますグループ別に照会する場合は、マテリアライズド・ビューを作成してください。

CREATE MATERIALIZED VIEW usersbygroup AS 
    SELECT groupname, username FROM group 
PRIMARY KEY (groupname, username); 
+0

この日、私はあなたが私に言ったことを試してみました。それは良い解決策ですね、ありがとう! – LolloFake

関連する問題