Подтвердить что ты не робот

Номер основного ключа 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 знать, где искать данные. Затем остальные части - КЛАСТЕРИНГ КЛЮЧ для сортировки данных.

Но я все еще не понимаю, почему мой первый запрос работает, а не второй?

Если кто-то может помочь, это будет большим удовольствием.

4b9b3361

Ответ 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), чтобы иметь возможность запускать ваш запрос.