2015-01-12 2 views
1

Я новичок в Кассандре и пытаюсь перенести мое приложение из MongoDB КассандраКак смоделировать коллекции mongodb для базы данных Cassandra (миграция)?

У меня есть следующие коллекции в MongoDB

PhotoAlbums 
[ 
    {id: oid1, title:t1, auth: author1, tags: ['bob', 'fun'], photos: [pid1, pid2], views:200 } 
    {id: oid2, title:t2, auth: author2, tags: ['job', 'fun'], photos: [pid3, pid4], views: 300 } 
    {id: oid3, title:t3, auth: author3, tags: ['rob', 'fun'], photos: [pid2, pid4], views: 400 } 
    .... 
] 

Photos 
[ 
{id: pid1, cap:t1, auth: author1, path:p1, tags: ['bob','fun'], comments:40, views:2000, likes:0 } 
{id: pid2, cap:t2, auth: author2, path:p2, tags: ['job','fun'], comments:50, views:50, likes:1, liker:[bob] } 
{id: pid3, cap:t3, auth: author3, path:p3, tags: ['rob','fun'], comments:60, views: 6000, likes: 0 } 
... 
] 

Comments 
[ 
    {id: oid1, photo_id: pid1, commenter: bob, text: photo is cool, likes: 1, likers: [john], replies: [{rep1}, {rep2}]} 
    {id: oid2, photo_id: pid1, commenter: bob, text: photo is nice, likes: 1, likers: [john], replies: [{rep1}, {rep2}]} 
    {id: oid3, photo_id: pid2, commenter: bob, text: photo is ok, likes: 2, likers: [john, bob], replies: [{rep1}]} 
] 

запросы:

  • Запрос 1: Покажите список популярных альбомов (по количеству понравившихся)

  • Запрос 2: Показать список наиболее обсуждаемых альбомов (в зависимости от количества комментариев)

  • Query 3: Показать список всех альбомов данного автора на странице пользователя

  • Запрос 4: Показать альбом со всеми фотографиями и все комментарии (выдвижные детали альбома, показать фото эскизы всех фотографий в альбоме, показать все комментарии выбранной фотографии

  • Query 5: показать список связанных альбомов на основе тегов текущего альбома

Учитывая приведенную выше схему и требования, как следует моделировать это в Кассандре?

ответ

1

Поскольку у меня есть опыт работы с Кассандрой и Монго, я сделаю снимок. Трудная часть здесь заключается в том, что MongoDB допускает очень свободные ограничения в отношении индексации и запросов. Кассандра имеет более сложную модель в этом отношении, но она должна выполняться быстро, в масштабе, если она создана правильно. Кроме того, аспект подсчета понравлений/просмотров/комментариев на фотографии или альбоме также может оказаться сложным, так как вы захотите использовать для этого тип Cassandra counter (который имеет свои собственные проблемы).

Отказ от ответственности: Другие могут решить эти проблемы по-разному. И я могу решить их по-другому, если моя первая попытка не выполнялась. Но это то, с чего я начну.

Чтобы удовлетворить Query 3 Я хотел бы создать таблицу запроса называется PhotoAlbumsByAuthor и запросить его так:

CREATE TABLE PhotoAlbumsByAuthor (
photoalbumid uuid, 
title text, 
author text, 
tags set<text>, 
photos set<uuid>, 
PRIMARY KEY(author,title,photoalbumid) 
); 

> SELECT * FROM photoalbumsbyauthor WHERE author='Malcolm Reynolds'; 

Это будет возвращать все альбомы, которые пользователь Malcolm Reynolds создал, отсортированные по title (как название является первым ключом кластеризации).

Для Query 4 Я хотел бы создать комментарии как user defined type (UDT):

CREATE TYPE yourkeyspacename.comment (
commenter text, 
commenttext text 
); 

Тогда я хотел бы создать таблицу запроса называется PhotosByAlbum и запросить его так:

CREATE TABLE PhotosByAlbum (
photoalbumid uuid, 
photoid uuid, 
cap text, 
auth text, 
path text, 
tags set<text>, 
comments map<uuid,frozen <comment>>, 
PRIMARY KEY(photoalbumid,photoid) 
); 

> SELECT * FROM PhotosByAlbum WHERE photoalbumid=a50aa80a-8714-44b4-9b97-43ec4b13daa6; 

When вы добавляете комментарий к этой таблице, ключ uuid - это комментарий.Таким образом, вы можете быстро захватить все ключи и/или значения на стороне вашего приложения. В любом случае, это вернет все фотографии для данного фотоальбома вместе с любыми комментариями.

Я бы решить Query 5 подобным образом, путем создания таблицы запроса (вы должны замечать шаблон по настоящее время) называется PhotoAlbumsByTag и запросить его так:

CREATE TABLE PhotoAlbumsByTag (
tag text, 
photoalbumid uuid, 
title text, 
author text, 
photos set<uuid>, 
PRIMARY KEY(tag,title,photoalbumid) 
) 

SELECT * FROM PhotoAlbumsByTag WHERE tag='family'; 

Это будет возвращать все фотоальбомы с тегом «family». Обратите внимание, что это денормализованная структура используемого выше tags set<text>, что означает, что в фотоальбоме будет одна запись в этой таблице для каждого содержащегося в ней тега. Я подумал о возможности повторного использования одной из предыдущих таблиц запросов со вторичным индексом на tags set<text> (поскольку Cassandra теперь позволяет индексы по коллекциям), но вторичные индексы обычно не работают хорошо. И все равно вам все равно придется выполнять запрос для каждого тега в текущем альбоме (использование SELECT с ключевым словом IN, как известно, тоже не очень хорошо работает).

Что касается первых два запросов, я хотел бы создать специальные таблицы для хранения нравится/мнение/комментарии отсчетов так:

CREATE TABLE PhotoCounters (
photoid uuid, 
views counter, 
comments counter, 
likes counter, 
PRIMARY KEY (photoid) 
); 

При использовании counter типа, Cassandra требует, чтобы первичный ключ и счетчики будут единственные столбцы в этой таблице (не могут смешивать счетчики с столбцами без учета). И я также обрабатывал запросы/отчеты в автономном режиме OLAP с использованием Hadoop или Spark. Надеюсь это поможет.

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