Database design Cassandra:表式映射的模式是什么?

Database design Cassandra:表式映射的模式是什么?,database-design,cassandra,schema,Database Design,Cassandra,Schema,我尝试了不同的方法,但找不到解决问题的方法: 我的数据类似于表格,这意味着对于一组字符串的输入的每个组合,我都有一个数据点(浮点): (a mapping of S × S → ℝ ) 我想对模式进行建模,以便进行以下查找: 值在特定范围内的所有字符串对 对于给定的输入字符串,映射值在特定范围内的所有字符串 对于给定的输入字符串组合,映射值 由于映射是对称的(m(x,y)==m(y,x)),如果我只需要存储 n*(n+1)/2唯一值,而不是n^2总映射 到目前为止,我所尝试的: S1+“”

我尝试了不同的方法,但找不到解决问题的方法: 我的数据类似于表格,这意味着对于一组字符串的输入的每个组合,我都有一个数据点(浮点):

(a mapping of S × S → ℝ )
我想对模式进行建模,以便进行以下查找:

  • 值在特定范围内的所有字符串对
  • 对于给定的输入字符串,映射值在特定范围内的所有字符串
  • 对于给定的输入字符串组合,映射值
由于映射是对称的(
m(x,y)==m(y,x)
),如果我只需要存储
n*(n+1)/2
唯一值,而不是
n^2
总映射

到目前为止,我所尝试的:

  • S1+“”+S2作为行键,值作为列名
  • S1作为行键,复合键[S2:value]作为列名
  • S1作为行键,S2作为列名,值作为列值
  • 但不幸的是,所有这些方法都不能让我完成所有需要的查询。
    这在Cassandra中是可能的吗?

    Cassandra不支持您的第一个查询——所有具有某个范围内值的字符串对——因为目前,Cassandra只允许在
    WHERE
    子句上使用至少一个
    EQ
    进行范围查询。但是,您的第二个和第三个查询是可行的:)


    示例

    考虑以下示例:

    cqlsh:so> desc table string_mappings;
    CREATE TABLE string_mappings (
      s1 ascii,
      s2 ascii,
      value float,
      PRIMARY KEY (s1, s2, value)
    ) 
    
    我们有以下元组:

    cqlsh:so> select * from string_mappings;
    
     s1    | s2    | value
    -------+-------+-------
     hello | hello |     1
     hello | world |   0.2
     stack | hello |     0
     stack | stack |     1
     stack | world |     0
     world | world |     1
    
    您的第一个查询不起作用,因为Cassandra目前不支持在
    WHERE
    子句上没有
    EQ
    的范围查询:

    cqlsh:so> select * from string_mappings where value>0.5;
    Bad Request: PRIMARY KEY part value cannot be restricted (preceding part s2 is either not restricted or by a non-EQ relation)
    
    但是,以下范围查询(您的第二个查询)没有问题,因为它有一个
    EQ

    cqlsh:so> select * from string_mappings where value > 0.5 and s2='hello' allow filtering;
    
     s1    | s2    | value
    -------+-------+-------
     hello | hello |     1
    
    请记住输入
    允许过滤
    关键字,否则会出现以下错误:

    cqlsh:so> select * from string_mappings where value > 0.5 and s2='hello';
    Bad Request: Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING
    
    最后,您的第三个查询也不是问题:)


    这台电视机有多大?还有多少期望的唯一值?S目前约为10000项,但我想稍后添加具有更大集合(30k-100k)的columnfamilies。对于唯一值:它们都在[0,1]范围内,但其中的每个值都可能出现。非常感谢您的解释!当cql抽象出底层的cassandra数据模型时,我尝试了您的模式,结果发现cassandra创建了一个列族,与我的第二次尝试完全相同:)
    cqlsh:so> select * from string_mappings where S1='hello' and S2='world';
    
     s1    | s2    | value
    -------+-------+-------
     hello | world |   0.2