Добрый день. Интересует вот такой вопрос, как правильно спроектировать БД по примеру реддита или пикабу.
Смысл в следующем- есть ПОСТ, у поста есть РЕЙТИНГ. Пользователи оставляют КОММЕНТАРИИ, у которых тоже есть РЕЙТИНГ. Рейтинг -это каждый пользователь плюсанул\заминусил, соответственно он может только 1 раз проголосать (либо убрать голос\поставить противоположный).
Есть несколько мыслей:
1. Создается таблица рейтинга - ID_user, ID_post, type, vote. Не ляжет ли сервер от нагрузки? Посчитать рейтинг поста, выбрать все комментарии, и к каждому комментарию опять посчитать рейтинг.
2. У таблице постов и комментариев добавляем поля с рейтингом и так же создаем отдельную таблицу где записываем какой пользователь за что отдал голос. Так вроде как должна быть нагрузка меньше, при получении- сразу есть рейтинг, правда при изменении надо будет писать сразу в два места, что вроде как тоже не сильно хорошо...
Таблица Рейтинг постов вида (post_id, user_id).
Таблица Рейтинг комментов вида (comment_id, user_id).
Таблица комментов вида (post_id, comment_id).
Для того чтобы при каждом обращении не считать с нуля рейтинг делается элементарная штука: в таблице Постов заводите дополнительное поле Рейтинг. И каждой раз когда кто-то ставит плюс(ну или минус) помимо добавления(или удаления) записи в таблицу Рейтинг постов вы так же увеличиваете(или уменьшаете) поле Рейтинг в таблице постов. Аналогично заводите такое же поле Рейтинг в таблице комментариев и при каждом плюсе/минусе комментария помимо добавления в таблице Рейтинг комментариев увеличиваете(уменьшаете) счетчик-поле рейтинг в самой таблице Комментарии
Т.е. второй вариант? Только разносим рейтинг постов\комментов?
Table POSTS (id, rating)
Table COMMENTS (id, post_id, rating)
Table POSTS_RATING (post_id, user_id, vote)
Table COMMENTS_RATING (comment_id, user_id, vote)
При получении сразу имеет рейтинги, при необходимости можем посмотреть все поста, за которые проголосовал юзер.
При лайке поста - делаем +1 к посту, и в таблицу POSTS_RATING добавляем что юзер проголосовал?
Зачем тут поле Vote? Если голоса в виде плюс то Vote не нужно, присутствие пользователя в этой таблице уже означает плюс. Но если это оценка(например по 10ибальной шкале) тогда надо. И когда минусы есть тоже надо
При лайке поста - делаем +1 к посту, и в таблицу POSTS_RATING добавляем что юзер проголосовал?
Совершенно верно
правда при изменении надо будет писать сразу в два места, что вроде как тоже не сильно хорошо...
Очень даже хорошо, а точнее это оптимальное и стандартное решение. Запись в любом случае это асинхронная операция в любом мало мальски высоконагруженном проекте. В простеньких проектах можно и синхронно.
Да, планируется лайк\дизлайк.
Все остальное понятно. Я больше к этому варианту и склонялся, немного сомневался на счет того что надо в 2 таблицы писать. Спасибо за ответ.