订购Cassandra No Sql Db

时间:2015-02-09 21:53:41

标签: cassandra cql nosql

我开始使用Cassandra,但我在“订购”或“选择”方面遇到了一些问题。

CREATE TABLE functions (
id_function int,
sort int,
id_subfunction int,
php_class varchar,
php_function varchar,
PRIMARY KEY (id_function, sort, id_subfunction)
);

这是我的桌子。

如果我执行此查询

SELECT * FROM functions WHERE id_subfunction = 0 ORDER BY sort;

这就是我得到的。

Bad Request: ORDER BY is only supported when the partition key is restricted by an EQ or an IN.

我做错了什么?

由于

1 个答案:

答案 0 :(得分:2)

PRIMARY KEY (id_function, sort, id_subfunction)

在Cassandra CQL中,复合PRIMARY KEY中的列是分区键或 clustering 键。在您的情况下,id_function(列出的第一个键)是分区键。这是哈希值的关键值,以便您的数据可以均匀地分布在群集上。

其余列(sortid_subfunction)称为群集列,用于确定分区中数据的排序顺序。这实际上意味着,只有在WHERE子句中首次指定分区键时,您的数据才会按集群键进行排序。

您有两种选择:

1)通过id_function查询此表:

SELECT * FROM functions WHERE id_function= 0 ORDER BY sort;

这在技术上会起作用,虽然我猜测它不会给你提供你想要的结果。

2)更好的选择是创建一个"查询表。"这是一个专门用于id_subfunction处理您的查询的表格。它仅与原始functions表的不同之处在于,PRIMARY KEY定义为id_subfunction作为分区键:

CREATE TABLE functionsbysubfunction (
id_function int,
sort int,
id_subfunction int,
php_class varchar,
php_function varchar,
PRIMARY KEY (id_subfunction, sort, id_function)
);

此查询表将允许此查询按预期运行:

SELECT * FROM functionsbysubfunction WHERE id_subfunction = 0;

除非您想指定ASCending或DESCending订单,否则您不需要指明ORDER BY

请记住,使用Cassandra,根据您想要查询数据的方式设计数据模型非常重要。这可能不一定是最初存储它的方式。