2013-07-18 2 views
7

Я хочу запросить фильтрацию данных с помощью составных клавиш, отличных от Row Key, на CQL3. Это мои запросы:Запрос с использованием составных клавиш, кроме Row Key в Cassandra

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 

Bad Request: статус PRIMARY KEY часть не может быть ограничено (предшествующая часть подлежат либо не ограничен или на не-EQ отношения)

Просто экспериментировать, я Шуфом бежали ключи вокруг, сохраняя 'id' всегда в качестве основного ключа. Я всегда могу запросить использование ключа Primary Row или второго ключа, рассмотрев вышеприведенный пример, если я заменю объекты и статус в списке первичных ключей, я могу запросить статус, но я получаю подобную ошибку, если попытаюсь сделать субъекта или по времени.

Я что-то не так? Могу ли я не запрашивать данные с использованием любого другого составного ключа на CQL3? Я использую Cassandra 1.2.6 и CQL3.

ответ

12

Это выглядит как нормальное поведение в соответствии с моделью Cassandra Composite Key (http://www.datastax.com/docs/1.2/cql_cli/cql/SELECT). Модель данных Cassandra нацелена (и это общий подход NoSQL к мышлению) при предоставлении запросов, которые выполняются, что происходит за счет «ограничений» на способ хранения и индексации ваших данных, а затем как вы запрашиваете его, а именно: «всегда нужно ограничивать предыдущую часть предмета» на первичном ключе.

Вы не можете поменять элементы в списке первичных ключей на запросах (это скорее способ мышления SQL). Вам всегда нужно «Constraint»/«Ограничить» предыдущий элемент первичного ключа, если вы хотите использовать несколько элементов составного ключа. Это означает, что если у вас есть составной ключ = (id, subject, status, date) и вы хотите запросить «статус», вам нужно будет ограничить «id» и/или «subject» («или» возможно, если вы используете «разрешить фильтрацию», т. е. вы можете ограничить только «субъект» и не нужно ограничивать «id»). Таким образом, если вы хотите запросить «статус», вы можете запросить два разных способа:

выберите * из оценок, где id = '1093' и subject = 'English' и status = 'Active' ;

Или

выберите * из классов, где предмет = 'Английский' и статус = 'Активный' позволяют фильтрацию;

Первый - для конкретного «ученика», второй для всех «учеников» по ​​предмету в статусе = «Активный».

+0

приятное объяснение! –

+0

Получил! Спасибо, теперь мне гораздо больше смысла. Думаю, я буду повторять итерацию по своим запросам и посмотреть, как я хочу их структурировать, поскольку мне не всегда нужно ограничивать возможность получения статуса. – user988544

+0

Помог мне много! Спасибо – kn0x