Лайки как на тостере в БД?

Хранятся в БД лайки к ответам в виде:
otvet_id | user_id

Дальше понятно юзер лайкает проверяем если есть соотношение - убираем лайк, если нет - ставим лайк.
Мыль 1: размер таблицы соответствий. Вот картинка с одного форума:
59dc6179da3e40f8893ce02ad61bdffa.png
Всего в разделе 500 тыс. сообщений, пусть по 2 лайка в среднем к каждому - уже миллион строк соответствий. Это только один раздел, а разделов там много.

Мысль 2: Вот эта надпись "Вам нравится" т.е. мы уже проверили что лайк юзера тут стоит. Но одно дело дергать миллионную таблицу когда нажали на кнопку лайка, а второе просто при каждом отображении страницы зарегистрированному юзеру. БД не сойдёт с ума?

Мысль 3. И ведь не закешируешь страницу из-за этих лайков )) Ну либо запретить лайкать старые посты и закешировать?
  • Вопрос задан
  • 1888 просмотров
Пригласить эксперта
Ответы на вопрос 6
@Komly
Решается довольно просто у каждого ответа есть счетчик лайков который апдейтится либо при каждом новом лайке, либо в фоне каким-нибудь кроном.
Получается не сильно консистентно, но ждя форума это и не очень критично.
Ответ написан
@VisualIdeas
Незнаю, я бы просто хранил в таблице с лайками ещё и дату лайка и через месяц скидывал старые лайки а к записи просто счетчик для быстрого вывода. Если надо выводить список лайкнувших то выводите "Лайкнул Алекс, Макс и Федор и ещё 100500 человек"
Ответ написан
Denormalization
@Denormalization
В чем проблема? Бд УЖЕ тормазит? Запросы выполняется дольше 1сек?
2-3-4, да даже 10 миллионов записей - ничто, если выборка по индексам идет.

Сделайте, проверьте, посмотрите что конкретно тормазит. Там больше будет PHP тормазит, чем БД с выборкой по индексам.
Ответ написан
@lega
Всего в разделе 500 тыс. сообщений, пусть по 2 лайка в среднем к каждому

1 и 2) Если лайков мало (10, 100), то можно список пользователей кто лайкнул хранить в самом сообщении. Таким образом не будет доп. таблицы и доп запросов.

3) Кешируется, а состояние (кнопка и число) обновляется на клиенте либо на сервере перед отправкой (кеширований вообще может быть несколько и на разных уровнях, одни кеши опираются на другие...)
Ответ написан
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Возьмите postgresql
У каждого сообщения храните поле с массивом id всех лайкнувших
www.postgresql.org/docs/9.1/static/arrays.html
и поле со счетчиком лайков.

Чтобы не дать лайкнуть несколько раз проверяйте нахождение id пользователя в том массиве.
https://stackoverflow.com/questions/11231544/check...
Добавлять пользователей в массив тоже просто stackoverflow.com/a/11008296
Ответ написан
gephaest
@gephaest
PHP, Yii2, Laravel
1. Кеширование на стороне PHP
2. Грамотные индексы
3. Партиционирование
4. Тюнинг мускуя
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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