Cassandra数据建模可以查询许多列

时间:2016-07-18 10:23:11

标签: cassandra database nosql

我有一种具有动态属性的对象(记录)(多达数百个属性)。事实上我不知道该对象会有什么属性,因为它是由最终用户决定的,我想我应该使用地图类型来存储Cassandra的属性及其值。

我现在想要2种查询模式:

  1. 查找给定last
  2. 的一些attribute<X>=<value>条记录
  3. 查找按attribute<x>=<value>分组的给定attribute<y>的所有记录,记录时间介于time range
  4. 之间

    <x><y>在设计时未确定。它随着最终用户的定义而变化。

    因为集合类型不能用作主键的一部分,所以我想知道是否有任何好的方法来建模,或者我需要依赖二级索引。我不愿意使用二级索引,因为它需要查询所有Cassandra节点。

    所以,我的问题是,如何根据我的要求为Cassandra建模关键空间?

    进一步讨论:

    1. 我正在考虑为每个属性名称创建单独的密钥空间(当用户定义一个密钥空间时,我必须创建一个密钥空间),我是否滥用密钥空间?我想我是。
    2. 我是否需要依赖二级索引?
    3. P / s:我是Cassandra的新手,如果我滥用任何条款,请原谅我。

1 个答案:

答案 0 :(得分:1)

如果我了解您的需求,您可以创建一个表格AnchorPane homePage = (AnchorPane) loader.load();,用于存储常见属性,例如records作为静态列,以及两个字段timename来存储键值对属性。

value

按原样提供,此表只能按CREATE TABLE record ( record_id uuid, time date static, name string, value string, PRIMARY KEY (record_id) );进行查询。要添加更多查询复杂性,您可以使用record_id

MATERIALIZED VIEW

使用此结构,您可以为第一个查询模式运行查询:

CREATE MATERIALIZED VIEW record_by_attribute AS SELECT * FROM record WHERE record_id IS NOT NULL AND name IS NOT NULL PRIMARY KEY ((name, record_id);

对于你的第二个需求,我认为你必须创建第二个表来存储所有属性组合的聚合结果(cassandra不支持GROUP BY子句)并像我上面所说的那样查询它。

希望它可以帮到你。