Проблемы моделирования Кассандры
Прежде всего, извините за такой длинный пост, пожалуйста, потерпите меня.
Я новичок в Кассандре и мне нужен кто-то, чтобы просмотреть мои модели данных. Моя цель - смоделировать базу данных для таблицы публикаций в социальных сетях. Я планирую иметь следующие две таблицы для эффективного хранения и извлечения сообщений.
- почтовый стол
- таблица posts_by_user
Все посты будут храниться в первой таблице я, е пост, вот структура
CREATE TABLE myapp_keyspace.posts (
id timeuuid,
createdat bigint,
city text,
topFourComments list<frozen<comment>>,
commentscount bigint,
content text,
contenttype text,
country text,
county text,
createdon bigint,
deletedon bigint,
iscreator boolean,
isdeleted boolean,
likescount bigint,
latitude double,
longitude double,
medias list<frozen<media>>,
mediatype text,
postcreatedby timeuuid,
posttype text,
postusername text,
postuserprofilepic text,
sharecount bigint,
state text,
status int,
tags list<frozen<tag>>,
timezone text,
title text,
updatedon bigint,
PRIMARY KEY (id, createdat))
Ниже приведена другая таблица, в которой данные дублируются для экрана временной шкалы. Экран временной шкалы также имеет следующие фильтры (Все, Изображение, Видео, Текст, Друзья, Группа), вот структура.
CREATE TABLE myapp_keyspace .posts_by_user (
postcreatedby timeuuid,
contenttype text,
mediatype text,
posttype text,
createdat bigint,
comments list<frozen<comment>>,
commentscount bigint,
content text,
createdon bigint,
deletedon bigint,
id timeuuid,
iscreator boolean,
isdeleted boolean,
likescount bigint,
medias list<frozen<media>>,
sharecount bigint,
status int,
tags list<frozen<tag>>,
title text,
updatedon bigint,
PRIMARY KEY (postcreatedby, contenttype, mediatype, posttype, createdat)
Ниже приведены два моих вопроса
1. Как говорит Кассандра, спланируйте отдельную таблицу для каждого запроса. Учитывая все фильтры на экране временной шкалы, хорошо ли писать один запрос для всех фильтров или я планирую написать отдельный для каждого фильтра. (Все, изображение, видео, текст, друзья, группа)
2. Что я должен планировать для хранения сообщений друзей. Я думаю о дублировании всех сообщений друга в таблице post_by_user. Пример: Если у меня есть 10 друзей, и я делаю пост. Таким образом, одно сообщение будет сохранено 10 раз, по одному на каждого друга в таблице posts_by_user.
Так как это мой первый проект на Кассандре, и я хочу быть очень осторожным при разработке базы данных, чтобы избежать каких-либо проблем в будущем.
Любые предложения приветствуются.
1 ответ
Моделирование данных в Кассандре очень сложно. Не расстраивайтесь из- за борьбы с этим, особенно поначалу. Одна вещь, которая хорошо работает для меня и сильно отличается от других баз данных (особенно SQL), - это сначала писать запросы, а не таблицы. С Кассандрой select
заявления, где проблема будет.
Я бы предложил вам написать select
вам нужно будет иметь в виду, какую информацию вы будете иметь для выполнения запроса. Это очень важно, потому что он будет определять, как вы формируете свои первичные ключи. Дополнительной и важной функцией являются составные ключи. Это полезно для сортировки результатов и может иметь отношение к вашей ситуации.
Для первого стола вы уверены, что хотите id
а также createdat
? Время создания может быть получено из timeuuid
тип. Или, может быть, вам нужно более мелкое время? Подумайте об этом, потому что вам понадобится оба для запроса таблицы.
Ваш posts_by_user
Стол, как вы уже догадались, - вот где реальные проблемы. Подумайте о ваших ключах слева направо. Так что для вашего posts_by_user
, если вы хотите уйти createdat
Подстановочный знак, вы должны ограничить все предыдущие столбцы. Я сомневаюсь, что это то, что вы хотели бы сделать. Вы не можете ограничить только mediatype
, например.
Произвольную фильтрацию, подобную этой, может быть сложно сделать в Кассандре. Подумайте, что нужно вашему пользовательскому интерфейсу / приложению. Вот почему моделирование ваших запросов сначала, а не таблиц, так полезно.
Надеюсь, это полезно - и удачи!