2

論理的には次のように見える Cassandra 1.1 の列ファミリーをモデル化しようとしています。

Entp: //CF
 //rowkey->  entp_name_xyz: 
                   {entp_full_name: "full_name_xyz",
                    some_value: 1,
                    policy: {policy_name: "default policy",
                             type: "type 1",
                             prop_1: "prop 1",
                             ...
                             },
                    rules: {rule_1:, rule_2:,rule_3:}
                   }

モデル化しようとしているクエリは次のとおりです: entp 名を指定してすべてのポリシーを取得、entp を指定してすべてのルールを取得、entp_name を指定してすべての列を取得こんな風に見える:

RowKey:- entp_name_xyz,
column_name:- policy:p1
Value:-{JSON object - {policy_name: "default policy", type: "type 1",                 prop_1: "prop 1", ...}}
column_name:- policy:p2
Value:-{JSON object - {policy_name: "default policy2", type: "type 1",                 prop_1: "prop 1", ...}}
column_name: rule:r1 where r1 is a rowkey of a Rules column family
Value: Null

私の質問は cqlsh または cassandra-cli にあります。

  1. policy:p1 などの複合列名を挿入するにはどうすればよいですか?
  2. このスキームでは、select * from entp where column_name like "policy:*" および entp_name= xyz のようなクエリを使用して、すべてのポリシー列を読み取ることは可能ですか?
  3. 列に null 値を設定するにはどうすればよいですか。いくつかのフォーラムで、値を持たないことと同等であるため、null を設定する必要がないことを読みました。しかし、col1、col2、および col3 を含む静的スキーマがあり、col3 =null の行を挿入したいが、col1 と col2 にはいくつかの値がある場合を考えてみましょう。次のエラーが発生するため、そのようなデータを挿入するための cqlsh 構文は何ですか (ドキュメントには見つかりませんでした)。

    entp (col1,col2,col3) 値 ("abc","xyz", null) に挿入します

ありがとう!

4

2 に答える 2

4
  1. コンポジットは、cassandra 1.1 で利用できる CQL3 での作業がはるかに簡単なので、それを回答で使用します。CQL3 の複数コンポーネントの主キーを持つテーブルは、ストレージ エンジン (Cassandra) レイヤーの幅の広い行に相当します。

    ポリシーとルールのデータがどのように見えるかを解釈した場合、これが可能な答えです。

    CREATE TABLE entp_policies (
        entp_name text,
        policy_name text,
        policy_value text,
        PRIMARY KEY (entp_name, policy_name)
    );
    CREATE TABLE entp_rules (
        entp_name text,
        rule_name text,
        rule_value text,
        PRIMARY KEY (entp_name, rule_name)
    );
    

    次のように使用します。

    INSERT INTO entp_policies (entp_name, policy_name, policy_value)
         VALUES ('entp_name_xyz', 'p1',
                 '{policy_name: "default policy", type: "type 1", ...}');
    
    INSERT INTO entp_policies (entp_name, policy_name, policy_value)
         VALUES ('entp_name_xyz', 'p2',
                 '{policy_name: "default policy2", type: "type 1", ...}');
    
    INSERT INTO entp_rules (entp_name, rule_name) VALUES ('entp_name_xyz', 'r1');
    
    -- Get all policies given an entp name
    SELECT * FROM entp_policies WHERE entp_name = 'entp_name_xyz';
    
    -- Get all rules given an entp
    SELECT * FROM entp_rules WHERE entp_name = 'entp_name_xyz';
    
    -- Get all columns given an entp_name (both of the above)
    
  2. あなたのスキームでは、はい、そのようなクエリを作成することは可能ですが、私のバージョンよりも少し面倒です.CQL2は非推奨です.

  3. そうです、値の挿入を避けるだけです。NULLcqlには明示的なものはありません(まだ) が、次のようにすることができます。

    insert into entp (col1,col2) values ('abc','xyz');
    

それが役立つことを願っています!

于 2012-09-02T04:30:38.413 に答える
0

コンポジットで別の列を定義すると、ルールとポリシーの両方を 1 つのテーブルで使用できます。

create table entp_details(
    entp_name text,
    type text,
    name text,
    value text,
    primary key (entp_name, type, name));

ここでは、タイプは (ポリシーまたはルール) のいずれかです。

INSERT INTO entp_details (entp_name, type, name, value)
     VALUES ('entp_name_xyz', 'Policy', 'p1',
             '{policy_name: "default policy", type: "type 1", ...}');

INSERT INTO entp_details (entp_name,  type, name, value)
     VALUES ('entp_name_xyz', 'Policy', 'p2',
             '{policy_name: "default policy2", type: "type 1", ...}');

INSERT INTO entp_details (entp_name, type, name, value) VALUES ('entp_name_xyz', 'Rule', 'r1', null);

そして、クエリは次のようになります

select * from entp_details WHERE entp_name = 'entp_name_xyz' and type = 'Policy';
select * from entp_details WHERE entp_name = 'entp_name_xyz' and type = 'Rule';
于 2013-09-24T01:10:05.277 に答える