Как хранить комментарии: mysql — Как более разумно хранить комментарии в БД?

mysql — Как более разумно хранить комментарии в БД?

Подскажите пожалуйста, как более разумно хранить комментарии в БД? Такая ситуация: нужно реализовать комментирование в «блоге» и в «Фотоальбоме». Вот какие у меня самой мысли, либо сделать одну таблицу с полями

id-ключ
text-текст коммента
page_id-id страницы на которой сам коммент
name-имя пользователя
type-тип, "Блог", либо "Фотоальбом"

Либо же создать две таблицы без поля «type» — одну на фото, другую на блог. Как будет правильнее? Хотелось бы услышать совет профессионалов, но вот вдруг мне придет в голову ещё что нибудь закомментировать…каждый раз создавать таблицу? Или первый вариант подойдет, и сразу наводка, как доставать эти комментарии, чтобы скорость не оставляла желать лучшего, может есть какой нить

SELECT

У которого можно передать сразу несколько параметров

WHERE
  • mysql
  • php
  • комментарии

Однозначного решения тут нет. Можно держать одну таблицу на все комментарии, можно на каждый вид держать свою.

Решение зависит от вас.

  • Если комментарии рассматриваются как отдельная сущность, т.е., например, есть поиск по комментариям (вне зависимости от того, к какому контенту они были добавлены), удобнее, конечно, чтоб это была одна таблица. Тут надо позаботиться об индексах. Использование несколько таблиц не противоречит возможности поиска union’ом из select’ов.
  • Если родительские структуры обособлены (на блог и фотоальбом свои таблицы), вполне логично разделять и комментарии. И объединенная таблица не противоречит этой логике, разделение по типу, даст тот же эффект.

ЗЫ Конечно, если речь не идет о гигантской базе с миллиардами комментариев. Там подход не с точки зрения «что будет если я захочу еще что-нить комментировать», а «как обеспечить скорость» и «как бы партицировать данные»…

1

Я бы сделал с type. А выводить можно так:

SELECT * FROM `comments` WHERE `type` = 'blog' AND `page_id` = '1'

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Комментарии к материалу Когда можно выкапывать картошку и как хранить ее в квартире и погребе, август-сентябрь 2022 года | 74.

ru
  • Советская кулинария — всё
  • Нейросеть лечит зубы
  • Блокировали карту
  • Бизнес в объективе
  • Изнанка колоний
  • ПМЭФ-2023
  • Что за взрывы?
  • Дикие счета за ОДН
  • Аллея ZOV на кладбище
  • Учитель унизил ребенка
Все новости

Танцовщик, татуированный изображениями Путина, выступил с шоу «Распутин» в Челябинске. Фото и видео

Мобилизованным дали по три года колонии за отказ участвовать в спецоперации: новости СВО за 6 апреля

В Челябинской области четверо рыбаков погибли, провалившись под лед

«Подумал, что хороший карп попался»: под Челябинском рыбак выловил из реки Миасс красноухую черепаху

Челябинские полицейские нашли подростка, стрелявшего по окнам на Пионерской

На челябинскую школу завели дело по контрактам с «Уральским комбинатом питания»

Главу района, обвиняемого в мошенничестве на 4 миллиона, отправили под домашний арест

Благородно звучат! Как называли своих детей дворяне и аристократы — 12 красивых имен

В России резко выросла заболеваемость ВИЧ. Рассказываем о ситуации на Южном Урале

Снести — и точка. В Росимуществе ответили на претензии врачей, которых выживают из дома на Кисегаче

Завод «ОМК Трубодеталь» стал лауреатом конкурса «Человек года Советского района — 2022»

Лыжероллерную трассу сократят, чтобы построить межвузовский кампус в Челябинске

Отнял квартиру, избивал и окунал ребенка в унитаз. Мать двоих детей обвиняет бывшего мужа-военного в мошенничестве и издевательствах

Челябинцев встревожило обмеление Шершневского водохранилища после зимы

Ждем арктический циклон: в Челябинской области резко похолодает

Справится даже пятиклассник: попробуйте решить эти 10 математических задач без калькулятора

«Вы умерли. Ну умерли, и всё»: как чиновники похоронили 64-летнего художника, лишив пенсии

Сотрудники ГИБДД нашли водителя трала, врезавшегося в мост на Победы

Первоклассное дзюдо: уроки физкультуры заменят тренировками по единоборствам — в каких школах

Увидели в газете и встали в очередь: что за чудо-эликсиры от всех болезней продают старикам по всей стране

«Просим не беспокоиться»: в МЧС предупредили жителей Челябинска о звуках, похожих на взрывы

Полиция приехала во двор на Северо-Западе Челябинска на вызов о стрельбе по окнам

Вас от этого раздует: 8 продуктов, из-за которых растет живот

Выжить на 16 000 и не возненавидеть мир. Как журналистка жила на МРОТ и почему не смогла довести эксперимент до конца

В город пришел современный продуктовый дискаунтер. Почему товары в нем стоят дешевле

«Дом может рухнуть в любой момент»: жители многоэтажки обвинили экс-омбудсмена Севастьянова в опасном ремонте подвала

Коммунальным должникам хотят дать денег на оплату долга. Кто заплатит за идею депутатов?

«Год жена ко мне ездила, потом — всё. Я не обижаюсь»: кто и за что сидит в единственной на Южном Урале тюрьме

«Придется закрываться»: альтернативные доставщики пенсий в Челябинске потеряют работу

Трал с бульдозером протаранил мост в Челябинске

Комики спародировали теракт в Петербурге — СК начал проверку: новости СВО за 5 апреля

В Москве горит одно из зданий Минобороны

Знак, запрещающий въезд на парковку у ЖК «Манхэттен», убрали

Аж в носу свербит: 3 популярных ноты в духах, которые отпугивают всех — проверьте свой парфюм

«В клубах в обнимку с моделями»: от футболиста Павла Погребняка ушла жена из-за многочисленных измен — у пары трое детей

«Когда втиснулась, чуть не раздавили»: жители пригорода не могут уехать в Челябинск из-за нехватки маршруток

«У меня был шок»: врачи обнаружили у мамы аллергию на собственного сына — такое случается с одной из 50 000 беременных

За что будут штрафовать самокатчиков и где им больше нельзя ездить: видеоразбор новых правил

«Да какая депрессия, он же улыбается». Врач развенчивает мифы о самом популярном психическом расстройстве

Все новости

mysql — Реализация комментариев и лайков в базе данных

Я разработчик программного обеспечения. Я люблю программировать, но ненавижу базы данных… В настоящее время я создаю веб-сайт, на котором пользователю будет разрешено отмечать объект как понравившийся (как в FB), отметить и прокомментировать .

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

Я нашел здесь несколько похожих вопросов, но ни на один из них нет удовлетворительного ответа, поэтому я задаю этот вопрос снова.

Вопрос в том, как правильно эффективно и эластично спроектировать базу данных, чтобы она могла хранить комментарии для разных таблиц , лайки для разных таблиц и теги для них. Какой-нибудь шаблон дизайна в качестве ответа будет лучшим;)

Подробное описание : у меня таблица Пользователь с некоторыми пользовательскими данными и еще 3 таблицы : Фото с фотографиями , Статьи

с статьи , Места с 90 местами . Я хочу разрешить любому зарегистрированному пользователю:

  • комментировать любую из этих трех таблиц

  • отметить любой из них как понравившийся

  • пометить любой из них каким-либо тегом

  • Я также хочу подсчитать количество отметок «Нравится» для каждого элемента и количество использований этого конкретного тега.

1 ST Подход :

A) Для Tags , я создам Таблица Tag [Tagd, Tagname, Tagcounter] , тогда я создаю Много-Ман. таблицы для: Photo_has_tags , Place_has_tag

, Article_has_tag .

b) То же самое относится и к комментариям.

c) Я создам таблицу LikedPhotos [idUser, idPhoto] , ПонравившиесяСтатьи[idUser, idArticle] , ПонравившеесяМесто [idUser, idPlace] . Количество лайков будет рассчитано по запросам (что, я полагаю, плохо). И…

Мне очень не нравится этот дизайн для последней части, он для меня плохо пахнет 😉


2 nd подход :

Я создам таблицу ElementType [idType, TypeName == какое-то имя таблицы]

, которое будет заполнено администратором (я) именами таблицы которые могут быть понравились , прокомментировали или пометили . Затем я создам таблицы :

а) LikedElement [idLike, idUser, idElementType, idLikedElement] и то же самое для комментариев и тегов с соответствующими столбцами для каждого. Теперь, когда я хочу сделать понравившееся фото, я вставлю:

 typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (идентификатор пользователя, typeId, photoId)
 

и мест:

 typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (идентификатор пользователя, typeId, placeId)
 

и так далее. .. Я думаю, что второй подход лучше, но я также чувствую, что чего-то не хватает в этом дизайне…

Наконец, я также задаюсь вопросом, где лучше всего хранить счетчик для много раз элемент понравился. Я могу придумать только два способа:

  1. в элементе ( Фото/Статья/Место ) таблица
  2. по выбору count().

Я надеюсь, что мое объяснение проблемы теперь более подробно.

Моделирование данных — Разработка «комментариев» в стиле Facebook с помощью SQL | by Neha Jirafe

Согласитесь, все мы пользовались разделом «комментарии» той или иной социальной сети.

Теперь давайте посмотрим, как мы можем смоделировать это в базе данных SQL.

Возьмем пример Facebook. Проще говоря, пользователь «комментирует» сообщение. Самая простая форма комментариев — это комментарии уровня 1

  • Пользователь создает сообщение .
  • A пользователь комментарий к посту .

Довольно прямолинейно, не так ли, теперь давайте добавим немного сложности

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

А пользователь создает сообщение .

A пользователь комментарий к посту .

  • A пользователь комментарии (подкомментарий) к комментарию

    9 0.

Теперь давайте посмотрим, как мы можем запрашивать комментарии к сообщению «1111» по каждому уровню

 SELECT 
post_id,
parent.comment as level1_comment,
child.comment as level2_comment
FROM
Comment parent , Comment child
WHERE
post_id = '1111' and
child. parent_comment_id = parent.comment_id

Все хорошо, пока у нас не будет всего 2 уровня

Давайте представим, что если мы имел «n» уровней вложенных комментариев, как в «whatsapp». Как будет выглядеть запрос? Чтобы запросить комментарий 6-го уровня, нам нужно самостоятельно объединить данные 6 раз.

Подход 1 — Повторяющиеся самосоединения :

Повторяющиеся самосоединения могут быть довольно сложными, это также один из самых неэффективных запросов для выполнения, что снижает производительность

 ВЫБЕРИТЕ 
post_id,
p1.comment as level1_comment,
p2.comment as level2_comment,
p3.comment as level3_comment,
p4.comment as level4_comment,
p5.comment as level5_comment,
p111ROM Comment as level6
LEFT JOIN
Комментарий p2 к p2.parent_comment_id = p1.comment_id
LEFT JOIN
Комментарий p3 к p3.parent_comment_id = p2.comment_id
LEFT JOIN
Комментарий p4 к p4.parent_comment_id = p3.comment_id
LEFT JOIN
Комментарий p5 к p5. parent_comment_id = p4.comment_id
LEFT JOIN
Комментарий p6 к p6.parent_comment_id = p5.comment_id
WHERE
post_id = '1111' and

Эта модель может быстро выйти из-под контроля начинает масштабироваться.

Подход 2 — Рекурсивный CTE :

Поддержка MySQL Рекурсивный CTE

(Common Table Expression) , рекурсивный CTE можно использовать для создания идентификаторов стиля пути , для запроса к базе данных. Однако это просто упрощает синтаксис запросов и представление данных, но никоим образом не снижает сложность базового механизма запросов.

 WITH RECURSIVE cte AS 
( SELECT
comment,
comment_id AS path,
user_id,
post_id
FROM
Comment
WHERE parent_comment_id IS NULL
UNION ALL
SELECT
1, CON'PARENT. child.name)comment_id AS comment_id,
user_id,
post_id
FROM
Родительский комментарий , дочерний комментарий
ГДЕ
child.
parent_comment_id = parent.comment_id )SELECT * FROM cte;

Теперь данные могут выглядеть как денормализованные и сглаженные.

 путь | комментарий | идентификатор_пользователя | post_id 
------------------------------------------------ ------------------
1 | Я комментарий 1 | .... | 1111
1/7 | Я комментарий 7 | .... | 1111
2 | Я комментарий 2 | .... | 1111
2/3 | Я комментарий 3 | .... | 1111
2/3/4 | Я комментарий 4 | .... | 1111
2/3/4/5 | Я комментарий 5 | .... | 1111
2/3/4/5/6 | Я комментарий 6 | .... | 1111

Что, если мы создадим модель данных для хранения данных в идентификаторе пути? Здесь мы удаляем ссылку на себя в таблице «комментариев» (кроличье ухо) и добавляем новый столбец «путь»

. Теперь вы можете запрашивать родительские комментарии, сравнивая путь текущей строки с шаблоном, сформированным из пути другой строки. Например, чтобы найти предков комментария № 5, путь которого равен 2/3/4/5 , выполните следующее:

 SELECT * 
FROM
Комментарий КАК c
ГДЕ (ВЫБРАТЬ
путь
ИЗ
Комментарий
ГДЕ
comment_id = 5) НРАВИТСЯ c. path || '%';

Соответствует шаблонам, сформированным из путей предка 2/3/4/%

, 2/3/% и 2/%

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

Следует также отметить, что столбец VARCHAR имеет ограничение, и глубина вашего пути будет ограничена этим ограничением. В большинстве случаев это не будет проблемой.

Решение Closure Table представляет собой простой и элегантный способ хранения иерархий. Он включает в себя сохранение всех путей. дерево, а не только те, у которых есть прямые отношения родитель-потомок.

Вместо использования таблицы «Комментарий» для хранения информации об отношениях родитель-потомок давайте создадим таблицу поиска «parent_child_comment».

 parent_comment_id | child_comment_id 
------------------------------------------------ -----
1 | 1
1 | 7
2 | 2
2 | 3
2 | 4
2 | 5
2 | 6
3 | 3
3 | 4
3 | 5
3 | 6
4 | 4
4 | 5
4 | 6
5 | 5
5 | 6
6 | 6

Запросы

Запрос для получения всех дочерних комментариев для комментария №3 будет выглядеть следующим образом:

 SELECT * 
FROM
Comment AS c
JOIN parent_child_comment p ON c.

Следующая запись

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *