Я бы назвал вашу текущую модель данных традиционным сущностью/реляционным дизайном. Это имеет смысл использовать с базой данных SQL. Когда у вас есть реляционная база данных, вы полагаетесь на объединения для создания своих представлений, охватывающих несколько объектов.
Cassandra не имеет возможности выполнять соединения. Поэтому вместо моделирования ваших данных на основе ваших сущностей и отношений вы должны моделировать его на основе того, как вы собираетесь его запрашивать. Для вашего примера «всех сообщений от людей, которых пользователь следит» у вас может быть семейство столбцов, где rowkey является идентификатором пользователя, а столбцы - это все сообщения от людей, которых следует за пользователем (где имя столбца - это метка времени + идентификатор пользователя) и значение сообщения):
RowKey Columns
-------------------------------------------------------------------
| | TimeStamp0:UserA | TimeStamp1:UserB | TimeStamp2:UserA |
| UserID |------------------|------------------|------------------|
| | Message | Message | Message |
-------------------------------------------------------------------
Вы, вероятно, также хотят семью колонки со всеми сообщениями конкретного пользователя написал (я предполагаю, что сообщение передается всем пользователям вместо того, чтобы быть адресованы один конкретный пользователь):
RowKey Columns
--------------------------------------------------------
| | TimeStamp0 | TimeStamp1 | TimeStamp2 |
| UserID |------------|------------|-------------------|
| | Message | Message | Message |
--------------------------------------------------------
Теперь, когда вы создаете новое сообщение, вам нужно будет вставить его в несколько мест. Но когда вам нужно перечислить все сообщения от людей, за которыми следит пользователь, вам нужно только извлечь из одной строки (что быстро).
Очевидно, что если вы поддерживаете обновление или удаление сообщений, вам нужно будет делать это везде, где есть копия сообщения. Вам также нужно будет подумать о том, что должно произойти, когда пользователь следует или отказывается от кого-то. Существует несколько решений этой проблемы, и ваше решение будет зависеть от того, как вы хотите, чтобы ваше приложение вел себя.
Спасибо за ваш ответ, я попробую это, но как я могу сделать такой ключ (TimeStamp: User) в cassandra-cql? или вы думали о какой-то операции с рубиновой строкой для привязки этого ключевого имени? У меня там какой-то составной ключ для использования cql? – user934801
У Cassandra есть поддержка составных имен столбцов, но она еще не открыта через CQL ([в настоящее время предназначен для версии 1.1] (https://issues.apache.org/jira/browse/CASSANDRA-2474)). Таким образом, вы можете использовать интерфейс бережливости, или вы могли бы просто использовать временные метки для имен столбцов, а затем сериализовать user_id + сообщение в теле, используя ваш любимый формат (json, protocolbuffers и т. Д.). – psanford