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

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

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

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

Мысль 3. И ведь не закешируешь страницу из-за этих лайков )) Ну либо запретить лайкать старые посты и закешировать?
  • Вопрос задан
  • 1623 просмотра
Пригласить эксперта
Ответы на вопрос 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. Тюнинг мускуя
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы