在 cassandra 中,最有效的查询是针对单个分区,然后是使用列键的列。主键中的第一个键是您的分区键,所有后续键都是列键。列键的顺序很重要。您可以从“左到右”指定列键...即你可以只指定分区键,或者分区键+第一列键,或者分区键+第一列键+第二列键....但是你不能指定分区键+第二列键(不是没有辅助键索引,但我暂时不考虑)。因此,cassandra 中的模式很大程度上取决于您的查询需求。如果您知道您将始终按类型进行查询(如温度读数、压力读数或其他一些读数或类型的组合),那么以下模式可以工作:
CREATE TABLE readings (weatherstation_id text,
event_type text,
event_time timestamp,
reading_value text,
PRIMARY KEY (weatherstation_id, event_type, event_time)
);
然后你可以使用类似的东西:
SELECT * FROM readings where weatherstation_id = '12' and event_type='temperature'....
每个读数创建一行。
另一种选择是每行有多个读数。在这种情况下,架构可能如下所示:
CREATE TABLE readings (weatherstation_id text,
event_time timestamp,
readings map<string, string>,
PRIMARY KEY (weatherstation_id, event_time)
);
然后您可以在一行中获取时间戳的所有读数。这确实意味着您不能简单地过滤到特定类型的读数(即,您可以获得一行的所有读数),尽管您可以在地图的键上添加一个索引来让您过滤。查看http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/create_index_r.html?scroll=reference_ds_eqm_nmd_xj__CreatIdxCollKey 了解更多详情。请注意,键索引是 Cassandra 2.1 的一项新功能。
希望对您有所帮助。