2015-12-03 3 views
0

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

  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 не использовать с приглашением в качестве столбца кластера.

я решил использовать LWT для обеспечения email_address является уникальным, только чтобы узнать, ЕСЛИ НЕ СУЩЕСТВУЕТ только кажется работать на PRIMARY KEY весь, так LWT в C * не работает для меня.

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

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

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

Новый 4 декабря 2015:

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

ответ

1

Проблема 1: Я думаю, что самый простой способ справиться с этим может быть иметь две отдельные таблицы, одна для emails_in_group и один для invites_by_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 будет находиться в собственном разделе, а затем внутри этого раздела будет присваиваться приглашение[email protected] прав, когда он сказал, что вам нужно добавить что-то вроде group_id к вашей таблице и сделать его частью ключа раздела вашего основного ключа. Если вы это сделаете, а затем добавьте приглашение_каталог в качестве столбца кластера в ключ раздела, то все записи для этого group_id будут сохранены в том же разделе, и Order By будет работать. Заказ. Работает только внутри той же части, а не через разделы, которые вы просите.

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

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

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

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

Для моделирования данных Cassandra, это хорошее начало смотреть DS220

+0

Я пробовал это. Я не могу ORDER BY invite_date, если это не кластерная колонка. Таким образом, это синтаксическая ошибка CQL: «выберите * из приглашений, где group_id = 1 order by invite_date;» – Jason

+0

@Jason Тогда, возможно, вы можете получить данные и заказать их в своем приложении. – bydsky

+0

Теперь я пройду курс, спасибо. Получил ** Пакет: Изучение Apache Cassandra ** книга 100% читать и передо мной. Тем не менее, я не хочу сортировать на стороне сервера, потому что это может означать чтение WAY для многих строк, просто для сортировки по 'invite_date' и возврата подмножества обратно в браузер. Определенно ищут способ моделировать это в Cassandra, что позволяет мне использовать возможности LIMIT и pagingState. Я добавлю, что наверху, я думаю ... – Jason

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