Номер основного ключа cassandra не может быть ограничен.
Я использую Cassandra в первый раз в веб-приложении, и у меня возникла проблема с запросом.
Вот моя вкладка:
CREATE TABLE vote (
doodle_id uuid,
user_id uuid,
schedule_id uuid,
vote int,
PRIMARY KEY ((doodle_id), user_id, schedule_id)
);
При каждом запросе я указываю свой ключ раздела, doodle_id.
Например, я могу сделать без проблем:
select * from vote where doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7 and user_id = 97a7378a-e1bb-4586-ada1-177016405142;
Но по последней просьбе я сделал:
select * from vote where doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7 and schedule_id = c37df0ad-f61d-463e-bdcc-a97586bea633;
Я получил следующую ошибку:
Bad Request: PRIMARY KEY column "schedule_id" cannot be restricted (preceding column "user_id" is either not restricted or by a non-EQ relation)
Я новичок в Cassandra, но исправьте меня, если я ошибаюсь, в составном первичном ключе, первая часть - это ключ PARTITION KEY, который является обязательным, чтобы позволить Cassandra знать, где искать данные.
Затем остальные части - КЛАСТЕРИНГ КЛЮЧ для сортировки данных.
Но я все еще не понимаю, почему мой первый запрос работает, а не второй?
Если кто-то может помочь, это будет большим удовольствием.
Ответы
Ответ 1
В Кассандре вы должны спроектировать свою модель данных в соответствии с вашими запросами. Поэтому правильный способ поддержки вашего второго запроса (запросы doodle_id
и schedule_id
, но не обязательно с помощью user_id
), - это создать новую таблицу для обработки этого конкретного запроса. Эта таблица будет практически такой же, за исключением того, что PRIMARY KEY будет немного отличаться:
CREATE TABLE votebydoodleandschedule (
doodle_id uuid,
user_id uuid,
schedule_id uuid,
vote int,
PRIMARY KEY ((doodle_id), schedule_id, user_id)
);
Теперь этот запрос будет работать:
SELECT * FROM votebydoodleandschedule
WHERE doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7
AND schedule_id = c37df0ad-f61d-463e-bdcc-a97586bea633;
Это поможет вам указать ALLOW FILTERING
. Опираясь на ALLOW FILTERING
никогда не бывает хорошей идеей и, конечно же, не то, что вы должны делать в производственном кластере.
Ответ 2
Клавиша кластеризации также используется для поиска столбцов в заданном разделе. С вашей моделью вы сможете запросить:
- doodle_id
- doodle_id/user_id
- doodle_id/user_id/schedule_id
- user_id с помощью
ALLOW FILTERING
- user_id/schedule_id с помощью
ALLOW FILTERING
Вы можете видеть свой первичный ключ как путь к файлу doodle_id # 123/user_id # 456/schedule_id # 789, где все данные хранятся в самой глубокой папке (например, schedule_id # 789). Когда вы запрашиваете, вы должны указать подпапку/поддерево, откуда вы начинаете поиск.
Второй запрос не работает из-за того, как столбцы организованы в разделе. Cassandra не может получить непрерывный срез столбцов в разделе, потому что они чередуются.
Вы должны инвертировать порядок первичного ключа (doodle_id, schedule_id, user_id), чтобы иметь возможность запускать ваш запрос.