Laravel 5.5 какие таблицы и отношения создать по моей ситуации

227
24 октября 2017, 03:16

Делаю форум, есть несколько видов контента: топик, пост, галерея, фото галереи. Не уверен как правильно сделать систему рейтинга(лайк и дизлайк) для каждого вида контента, при этом на главной странице нужно выводить лучшее по контенту за день, за месяц и за все время(у кого набранный рейтинг за эти периоды лучший) Например, лучшие топики за день - это когда у поста значение лайки минус дизлайки за день больше остальных топиков.

Думаю сделать так: для каждого контента сделать таблицу содержащая историю изменения рейтинга, с полями: имя_контента_id(например, topic_id, photo_id), value(как изменился рейтинг: 1 как лайк или -1 как дизлайк)

Получатся такие таблицы: rating_topic(topic_id, value), rating_post(post_id, value), rating_galery(galery_id, value), rating_photo(photo_id, value) И связать с таблицами топиков, постов и т.д. через hasMany. Получать лучшее за сегодня или месяц в зависимости от created_at.

Мне кажется можно сделать проще, не создавая так много таблиц, но запутался в отношениях. Буду очень благодарен за помощь!

Answer 1

Необязательно делать так много таблиц. Можно обойтись и одной. Например rating_content. И связывать ваши сущности (топик, пост, галерея и т.д) через MorphTo отношения.

В таблице будет например два поля - content_id и content_type. Как раз в content_type и будет задаваться тип контента.

Почитайте про полиморфные отношения и сразу поймете.

Answer 2

Тут ваш подход зависит от масштаба. Если закладывать голоса заранее на биг дата, то лучше много таблиц. Не имеет смысл хранить терабайты пустых голосов вместе с основной таблицей(кучу false или none, которые приедут к тормозам при голосовании). С той же точки зрения если объединить в одну таблицу может быть ситуация(кучу false или none,пару миллионов). Так что с точки зрения производительности маленькие сущности лучше и запрашиваются они там где нужны.

Я так понял вы просто путаетесь, однако есть инструменты для работы с базой например можете использовать это https://erdplus.com/, в mysql workbench есть схемы тоже. Советую подкачать скилл MySql тут https://ru.coursera.org/learn/analytics-mysql

READ ALSO
Не работает форма обратной связи

Не работает форма обратной связи

Здравствуйте! Есть лендинг пока на тестовом домене http://elenadvabeget

272
Ошибка php Uncaught Error

Ошибка php Uncaught Error

Использую функцию xmlrpc_encode()Вот код:

246
Слияние подстрок в PHP

Слияние подстрок в PHP

Имеется массив с ключами идущими по порядкуМне необходимо создать новый массив в каждой строке которого будет по несколько значений предыдущего...

218
Пагинатор на классах

Пагинатор на классах

В общем нужно добавить пагинаторЕсть вывод таблицы из базы

253