2012-01-16 12 views
0

я хочу сделать запрос для двух семейств столбцов сразу ... Я использую Кассандру CQL камень для рельсов и моя семья столбцов:Cassandra CQL вида MultiGet

пользователи
следующих
последователи
user_count
MESSAGE_COUNT
сообщения

Теперь я хочу, чтобы получить все сообщения от людей, пользователь следующих. Есть ли какой-то мультигете с cassandra-cql или есть ли другая возможность, изменяя datamodel для получения таких данных?

ответ

2

Я бы назвал вашу текущую модель данных традиционным сущностью/реляционным дизайном. Это имеет смысл использовать с базой данных SQL. Когда у вас есть реляционная база данных, вы полагаетесь на объединения для создания своих представлений, охватывающих несколько объектов.

Cassandra не имеет возможности выполнять соединения. Поэтому вместо моделирования ваших данных на основе ваших сущностей и отношений вы должны моделировать его на основе того, как вы собираетесь его запрашивать. Для вашего примера «всех сообщений от людей, которых пользователь следит» у вас может быть семейство столбцов, где rowkey является идентификатором пользователя, а столбцы - это все сообщения от людей, которых следует за пользователем (где имя столбца - это метка времени + идентификатор пользователя) и значение сообщения):

RowKey        Columns 
------------------------------------------------------------------- 
|  | TimeStamp0:UserA | TimeStamp1:UserB | TimeStamp2:UserA | 
| UserID |------------------|------------------|------------------| 
|  | Message   | Message   | Message   | 
------------------------------------------------------------------- 

Вы, вероятно, также хотят семью колонки со всеми сообщениями конкретного пользователя написал (я предполагаю, что сообщение передается всем пользователям вместо того, чтобы быть адресованы один конкретный пользователь):

RowKey     Columns 
-------------------------------------------------------- 
|  | TimeStamp0 | TimeStamp1 | TimeStamp2  | 
| UserID |------------|------------|-------------------| 
|  | Message | Message | Message   | 
-------------------------------------------------------- 

Теперь, когда вы создаете новое сообщение, вам нужно будет вставить его в несколько мест. Но когда вам нужно перечислить все сообщения от людей, за которыми следит пользователь, вам нужно только извлечь из одной строки (что быстро).

Очевидно, что если вы поддерживаете обновление или удаление сообщений, вам нужно будет делать это везде, где есть копия сообщения. Вам также нужно будет подумать о том, что должно произойти, когда пользователь следует или отказывается от кого-то. Существует несколько решений этой проблемы, и ваше решение будет зависеть от того, как вы хотите, чтобы ваше приложение вел себя.

+0

Спасибо за ваш ответ, я попробую это, но как я могу сделать такой ключ (TimeStamp: User) в cassandra-cql? или вы думали о какой-то операции с рубиновой строкой для привязки этого ключевого имени? У меня там какой-то составной ключ для использования cql? – user934801

+2

У Cassandra есть поддержка составных имен столбцов, но она еще не открыта через CQL ([в настоящее время предназначен для версии 1.1] (https://issues.apache.org/jira/browse/CASSANDRA-2474)). Таким образом, вы можете использовать интерфейс бережливости, или вы могли бы просто использовать временные метки для имен столбцов, а затем сериализовать user_id + сообщение в теле, используя ваш любимый формат (json, protocolbuffers и т. Д.). – psanford