Задать вопрос

Как организовать хранение лайков и решить вопрос с производительностью в реляционной БД (mysql)?

Есть сущность слово - таблица words.
Некоторые слова могут быть связаны друг с другом (связь - многие ко многим) - таблица connections.
И, наконец, есть таблица likes - в нее я планирую записывать лайки/дизлайки пользователей (без регистрации(скорей всего, по IP адресу)).
Получается, что в таблице likes будет храниться ссылка на id связи из таблицы connections.

Но есть момент, который не укладывается в голове:
Встает проблема с производительностью, если мы храним каждый лайк/дислайк отдельной записью, таблица разрастется до нескольких десятков, а то и сотен, миллионов записей.
С учетом того, что каждое слово может иметь до 50 коннектов на одной странице, каким образом считать лайки по каждой из связей? Будет ли это критической проблемой производительности?
  • Вопрос задан
  • 4514 просмотров
Подписаться 5 Простой 2 комментария
Решения вопроса 3
Не хранить каждый лайк индивидуально, а держать два поля счётчиков лайков и дислайков в таблице connections. По поступлению лайка инкрементировать поле.

Можно и так, как вы изначально описали. Всё равно скоро придёте к регистрации пользователей, и лайки станут связывать пользователя и лайкнутую связь – придётся их хранить индивидуально.

Проблемы производительности решайте по мере их поступления или чуть заранее, но не так заранее, как сейчас )

Можно установить правило, что лайк можно отменить только в течение, допустим, недели. Тогда нужно хранить индивидуальные записи каждого лайка только неделю, по прошествии которой заменять устаревшие лайки на посчитанную сумму лайков у записи «связи». Так таблица лайков будет держать только свежие лайки, и не разрастётся до миллиардов.
Ответ написан
@I_Pavlov
Разработчик
Можно денормализовать: хранить и лайки и их количество.
В connections добавить likes_count, dislikes_count
Создать таблицу connections_likes (connection_id, user_id, like_type)
Вместо user_id может быть IP или что угодно.
При создании лайка/дизлайка увеличивать счетчик, при удалении - уменьшать.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Частичная денормализация базы - кроме таблицы лайков (`user_id`, `object_id`) поле `likeCount` хранится ещё в основной таблице и изменяется по триггерам при добавлении/удалении записи в таблице лайков.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы