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:*" and entp_name= xyz 以便只读取所有策略列?
  3. 如何为列设置空值。我在一些论坛上读到,您不需要设置 null,因为它相当于没有值。但是考虑一下你有一个带有 col1、col2 和 col3 的静态模式的情况,我想插入一个 col3 =null 的行,但 col1 和 col2 有一些值。插入此类数据的 cqlsh 语法是什么(我在文档中找不到),因为以下给出了错误:

    插入 entp (col1,col2,col3) 值 ("abc","xyz", null)

谢谢!

4

2 回答 2

4
  1. 复合材料在 CQL3 中更容易使用,在 cassandra 1.1 中可供您使用,所以我将在我的回答中使用它。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

如果您在组合中定义另一列,则可以在一个表中同时使用规则和策略

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 回答