2015-02-09 3 views
1

Я начинаю использовать Cassandra, но у меня возникают проблемы с «заказом» или «выбором».Сортировать по: Cassandra No Sql Db

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. 

Где я ошибаюсь?

Благодаря

ответ

2
PRIMARY KEY (id_function, sort, id_subfunction) 

В Cassandra CQL столбцы в составного первичного ключа являются либо Partitioning ключи или кластеризацию ключей. В вашем случае id_function (первый указанный ключ) - это ключ разделения. Это ключевое значение, которое хешируется, так что ваши данные для этого ключа могут быть равномерно распределены на вашем кластере.

Остальные столбцы (sort и id_subfunction) известны как кластерные столбцов, которые определяют порядок сортировки данных в пределах раздела. Это по существу означает, что ваши данные будут отсортированы только по вашим ключам кластеризации, когда ключ разделения сначала будет указан в вашем предложении WHERE.

У вас есть два варианта:

1) запросить эту таблицу id_function вместо:

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

Это будет технически работать, хотя я предполагаю, что это не даст вам результаты, которые вы ищем.

2) Лучший вариант - создать «таблицу запросов». Это таблица, предназначенная специально для обработки вашего запроса по id_subfunction. Это только отличается от оригинала functions таблицы в том, что первичный ключ определен с 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; 

А ты не нужно указывать ORDER BY, если вы не хотите указывать порядок ASCending или DESCending.

Помните, что Cassandra важно спроектировать вашу модель данных в соответствии с тем, как вы хотите запросить свои данные. И это может быть не так, как изначально имеет смысл хранить его.

Смежные вопросы