用 Cassandra 订购 No Sql Db

Order by with Cassandra No Sql Db

我开始使用 Cassandra,但在 "ordering" 或 "selecting" 上遇到了一些问题。

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

这是我的table。

如果我执行这个查询

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.

我哪里做错了?

谢谢

PRIMARY KEY (id_function, sort, id_subfunction)

在 Cassandra CQL 中,复合 PRIMARY KEY 中的列是 partitioning 键或 clustering 键。在您的例子中,id_function(列出的第一个键)是分区键。这是经过哈希处理的键值,以便该键的数据可以均匀分布在集群上。

其余列(sortid_subfunction)被称为聚类列,它们决定了分区数据在分区中的排序顺序。这实质上意味着,当您的 WHERE 子句中首次指定分区键时,您的数据将仅按您的集群键排序。

你有两个选择:

1) 改为 id_function 查询此 table:

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

这在技术上是可行的,尽管我猜它不会给您想要的结果。

2) 更好的选择是创建一个 "query table." 这是一个 table 旨在专门处理 id_subfunction 的查询。与原来的functionstable的区别仅在于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)
);

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

SELECT * FROM functionsbysubfunction WHERE id_subfunction = 0;

而且您不需要指明ORDER BY,除非您想指定 ASCending 或 DESCending 顺序。

请记住,使用 Cassandra 时,根据您希望如何查询数据来设计数据模型非常重要。这可能不一定是它最初有意义的存储方式。