用 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
(列出的第一个键)是分区键。这是经过哈希处理的键值,以便该键的数据可以均匀分布在集群上。
其余列(sort
和 id_subfunction
)被称为聚类列,它们决定了分区数据在分区中的排序顺序。这实质上意味着,当您的 WHERE
子句中首次指定分区键时,您的数据将仅按您的集群键排序。
你有两个选择:
1) 改为 id_function
查询此 table:
SELECT * FROM functions WHERE id_function= 0 ORDER BY sort;
这在技术上是可行的,尽管我猜它不会给您想要的结果。
2) 更好的选择是创建一个 "query table." 这是一个 table 旨在专门处理 id_subfunction
的查询。与原来的functions
table的区别仅在于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 时,根据您希望如何查询数据来设计数据模型非常重要。这可能不一定是它最初有意义的存储方式。
我开始使用 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
(列出的第一个键)是分区键。这是经过哈希处理的键值,以便该键的数据可以均匀分布在集群上。
其余列(sort
和 id_subfunction
)被称为聚类列,它们决定了分区数据在分区中的排序顺序。这实质上意味着,当您的 WHERE
子句中首次指定分区键时,您的数据将仅按您的集群键排序。
你有两个选择:
1) 改为 id_function
查询此 table:
SELECT * FROM functions WHERE id_function= 0 ORDER BY sort;
这在技术上是可行的,尽管我猜它不会给您想要的结果。
2) 更好的选择是创建一个 "query table." 这是一个 table 旨在专门处理 id_subfunction
的查询。与原来的functions
table的区别仅在于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 时,根据您希望如何查询数据来设计数据模型非常重要。这可能不一定是它最初有意义的存储方式。