首页 文章

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

提问于
浏览
1

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

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

  • 查找给定 attribute<X>=<value> 的一些 last 条记录

  • 查找给定 attribute<x>=<value>attribute<y> 分组的所有记录,记录时间介于 time range 之间

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

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

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

进一步讨论:

  • 我正在考虑为每个属性名称创建单独的密钥空间(当用户定义一个时,我必须创建一个密钥空间),我是否滥用密钥空间?我觉得我是 .

  • 我需要依赖二级索引吗?

P / s:我是Cassandra的新手,如果我滥用任何条款,请原谅我 .

1 回答

  • 1

    如果我了解您的需要,您可以创建一个表 records ,它将常用属性(如 time )存储为静态列,并将两个字段 namevalue 存储为存储键值对属性 .

    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);

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

    SELECT * FROM record_by_attribute WHERE name = 'an attribute' LIMIT 10;

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

    希望它可以帮到你 .

相关问题