Простая таблица моделирования данных в Cassandra не работает

Мне нужно создать веб-страницу, на которой лидер группы может приглашать людей присоединиться к его/ее группе. Мои требования очень просты.

  1. Нет отправки дубликатов электронных писем, если с человеком уже связались.

  2. Покажите лидеру группы список приглашений, отсортированных по дате приглашения в порядке возрастания.

Кажется легким. Я создал эту таблицу.

CREATE TABLE invites (
email_address text,
invite_date timeuuid,
PRIMARY KEY (email_address, invite_date)
) WITH CLUSTERING ORDER BY (invite_date ASC);

Проблема 1: LWT бесполезен, если в качестве столбца Cluster используется полеvite_date.

Я решил использовать LWT, чтобы убедиться, что email_address уникален, только чтобы узнать, ЕСЛИ НЕ СУЩЕСТВУЕТ, похоже, работает только с целым ПЕРВИЧНЫМ КЛЮЧОМ, поэтому LWT в C * не работает для меня.

Проблема 2: я не могу получить упорядоченный список приглашений, чтобы спасти мне жизнь, даже если в качестве столбца Cluster используется параметрinvite_date.

Если я уберу приглашение_дату, я не смогу оформить «заказ» в CQL. Тем не менее, имея приглашение_date вне ПК, я могу использовать LWT...

Я даже не могу получить таблицу из 2 столбцов, чтобы выполнить 2 простых требования! Любая помощь в разработке моделирования данных для этой проблемы очень ценится.

Новинка от 4 декабря 2015 г.:

В дополнение к бизнес-требованиям у меня есть еще одно техническое требование: я хочу убедиться, что правильно смоделировал это в Cassandra, чтобы это позволило мне использовать возможности CQL LIMIT и pagingState в драйвере Java. Это означает, что я не могу просто прочитать все строки, отсортировать на стороне Java и вернуть результаты.


person Jason    schedule 03.12.2015    source источник


Ответы (2)


Проблема 1: Я думаю, что самый простой способ справиться с этим — иметь две отдельные таблицы: одну для emails_in_group и одну для инвайтов_по_группе. Это позволит выполнять каждый запрос независимо. Таблица emails_in_group будет выглядеть примерно так:

CREATE TABLE emails_in_group ( 
 email_address text,  
 group_id text,
 PRIMARY KEY (email_address , group_id));  

Затем это, в сочетании с таблицей, как определено в Задаче 2 ниже, может быть обновлено с помощью условного пакетного оператора, как показано здесь: http://docs.datastax.com/en/cql/3.1/cql/cql_using/use-batch-static.html

Проблема 2: Таким образом, основная проблема здесь заключается в том, что, поскольку ваши данные в настоящее время смоделированы, каждое значение email_address будет находиться в своем собственном разделе, а затем в этом разделе будет упорядочено приглашение_дата. @bydsky прав, когда сказал, что вам нужно добавить что-то вроде group_id в свою таблицу и сделать его частью ключа раздела вашего первичного ключа. Если вы сделаете это, а затем добавите приглашение_дату в качестве столбца кластера к ключу раздела, тогда все записи для этого идентификатора группы будут храниться в одном разделе, и порядок по будет работать. Order By работает только в пределах одного и того же раздела, а не между разделами, о чем вы просили.

CREATE TABLE invites_by_group ( 
 group_id text,  
 email_address text,  
 invite_date timestamp,  
 PRIMARY KEY (group_id, invite_date));   
person bechbd    schedule 04.12.2015

Я думаю, вы должны использовать group_id и адрес электронной почты в качестве первичного ключа.

Для заказа, возможно, вы могли бы сделать это в своем приложении.

CREATE TABLE invites ( group_id text,  
email_address text,  
invite_date timestamp,  
PRIMARY KEY (group_id, email_address) );   

Для моделирования данных cassandra неплохо начать с просмотра DS220.

person bydsky    schedule 04.12.2015
comment
Я попробовал это. Я не могу ЗАКАЗАТЬ по приглашению_дате, если это не столбец кластера. Итак, это синтаксическая ошибка CQL: выберите * из инвайтов, где group_id = 1 заказ по инвайту_дате; - person Jason; 04.12.2015
comment
@Jason Тогда, возможно, вы могли бы получить данные и упорядочить их в своем приложении. - person bydsky; 04.12.2015
comment
Сейчас прохожу курс, спасибо. Книга Packt: Learning Apache Cassandra прочитана на 100 % и лежит передо мной. Тем не менее, я не хочу сортировать на стороне сервера, потому что это может означать чтение ПУТИ для многих строк, просто для сортировки по «invite_date» и возврата подмножества обратно в браузер. Определенно ищу способ смоделировать это в Cassandra, который позволит мне использовать его возможности LIMIT и pagingState. Добавлю в топ, пожалуй... - person Jason; 04.12.2015