7

我想通过 CQL3 中的行键以外的复合键查询数据过滤。这些是我的疑问:

CREATE TABLE grades (id int,
  date timestamp,
  subject text,
  status text,
  PRIMARY KEY (id, subject, status, date)
);

当我尝试访问数据时,

SELECT * FROM grades where id = 1098; //works fine
SELECT * FROM grades where subject = 'English' ALLOW FILTERING; //works fine
SELECT * FROM grades where status = 'Active' ALLOW FILTERING; //gives an error

错误请求:PRIMARY KEY 部分状态不能被限制(前面的部分主题要么不受限制,要么受非 EQ 关系限制)

只是为了试验,我改变了保持“id”作为我的主行键的键。考虑到上面的示例,我始终只能使用主行键或第二个键进行查询,如果我在主键列表中交换主题和状态,我可以使用状态进行查询,但如果我尝试这样做,我会遇到类似的错误主题或时间。

难道我做错了什么?我可以不使用 CQL3 中的任何其他复合键查询数据吗?我正在使用 Cassandra 1.2.6 和 CQL3。

4

1 回答 1

13

根据 Cassandra 复合键模型(http://www.datastax.com/docs/1.2/cql_cli/cql/SELECT),这看起来都是正常的行为。Cassandra 数据模型旨在(这是一种通用的 NoSQL 思维方式)授予查询是高性能的,这以“限制”为代价存储和索引数据的方式,以及查询它的方式,即你主键上的“总是需要限制主题的前面部分”。

您不能在查询的主键列表上交换元素(这更像是一种 SQL 思维方式)。如果要使用复合键的多个元素,则始终需要“约束”/“限制”主键的前一个元素。这意味着如果您有复合键 = (id, subject, status, date) 并且想要查询“status”,则需要限制“id”和/或“subject”(如果您使用“or”是可能的“允许过滤”,即可以只限制“主题”,不需要限制“id”)。因此,如果您想查询“状态”,您将能够以两种不同的方式进行查询:

从 id = '1093' 和 subject = 'English' 和 status = 'Active' 的成绩中选择 *;

或者

select * from grades where subject = 'English' and status = 'Active' 允许过滤;

第一个是针对特定的“学生”,第二个是针对status =“Active”的主题的所有“学生”。

于 2013-07-19T07:36:30.210 回答