После дополнительных исследований я нашел следующее решение: Выбор правильной модели данных - самая сложная часть использования Cassandra, и вот решение, которое мы нашли для таблиц лайков в Cassandra, прежде всего, я должен сказать read и write путь удивительно быстрый, и вам не нужно беспокоиться о записи в таблицах вашей Cassandra, вам нужно моделировать вокруг ваши запросы и помните, дублирование данных - это нормально. Многие из ваших таблиц могут повторять одни и те же данные. и не забудьте равномерно распределить данные по кластеру и минимизировать количество считываемых разделов
Поскольку мы используем Cassandra, которая является NoSQL, мы знаем, что одно из правил в NoSQL - денормализация, и мы должны денормализовать данные и просто думать о запросах, которые вы хотите иметь; Здесь для моделирования данных подобных таблиц у нас будет две таблицы, эти таблицы в основном ориентированы на легкое чтение или, проще говоря, мы сосредоточились на запросах, которые нам нужны:
CREATE TABLE IF NOT EXISTS post_likes(
post_id timeuuid,
liker_id uuid, //liker user_id
like_time timestamp,
PRIMARY KEY ((post_id) ,liker_id)
);
CREATE TABLE IF NOT EXISTS post_likes_by_time(
post_id timeuuid,
liker_id uuid, //liker user_id
like_time timestamp,
PRIMARY KEY ((post_id), like_time, liker_id)
) WITH CLUSTERING ORDER BY (like_time DESC);
Когда пользователю нравится сообщение, мы просто вставляем его в обе указанные выше таблицы.
почему у нас post_likes_by_time
таблица?
В социальной сети вы должны показывать список пользователей, которым понравился пост, обычно вам нужно сортировать лайки по like_time DESC
, а поскольку вы собираетесь сортировать лайки по like_time
, вам нужно иметь like_time
в качестве ключа кластеризации, чтобы иметь возможность сортировать лайки по времени.
Тогда почему у нас тоже post_likes
таблица?
В post_likes_by_time
наш ключ кластеризации - like_time
, нам также нужно удалить такой же! Мы не можем этого сделать при сортировке данных в нашей таблице, когда ключ кластеризации равен like_time. По этой причине у нас также есть post_likes
таблица
Почему у вас может быть не только одна таблица, но и выполнение с ней обоих действий, сортировки и удаления?
Чтобы удалить один лайк из таблицы post_likes
, нам нужно предоставить user_id
(здесь liker_id) и post_id
(вместе), а в post_likes_by_time
у нас есть like_time
в качестве ключа кластеризации, и нам нужно отсортировать таблицу по like_time
, тогда это должен быть первый ключ кластеризации, а второй ключ кластеризации может быть liker_id
, и вот в чем суть! like_time
- это первый ключ кластеризации, тогда для выбора или удаления с помощью liker_id
вам также необходимо указать like_time
, но в большинстве случаев like_time
у вас его нет.
person
Mohammad Kermani
schedule
14.06.2016