我有一种具有动态属性的对象(记录)(多达数百个属性) . 事实上我不知道该对象会有什么属性,因为它是由最终用户决定的,我想我应该使用map类型来存储Cassandra的属性及其值 .
我现在想要2种查询模式:
-
查找给定
attribute<X>=<value>
的一些last
条记录 -
查找给定
attribute<x>=<value>
按attribute<y>
分组的所有记录,记录时间介于time range
之间
<x>
和 <y>
在设计时未确定 . 它随最终用户定义而变化 .
因为集合类型不能用作主键的一部分,所以我想知道是否有任何好的方法对此进行建模,或者我需要依赖二级索引 . 我不愿意使用二级索引,因为它需要查询所有Cassandra节点 .
所以,我的问题是,如何根据我的要求为Cassandra建模关键空间?
进一步讨论:
-
我正在考虑为每个属性名称创建单独的密钥空间(当用户定义一个时,我必须创建一个密钥空间),我是否滥用密钥空间?我觉得我是 .
-
我需要依赖二级索引吗?
P / s:我是Cassandra的新手,如果我滥用任何条款,请原谅我 .
1 回答
如果我了解您的需要,您可以创建一个表
records
,它将常用属性(如time
)存储为静态列,并将两个字段name
和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);
使用此结构,您可以为第一个查询模式运行查询:
SELECT * FROM record_by_attribute WHERE name = 'an attribute' LIMIT 10;
对于您的第二个需求,我认为您必须创建第二个表来存储所有属性组合的聚合结果(cassandra不支持GROUP BY子句)并像上面所述查询它 .
希望它可以帮到你 .