Я пытаюсь придумать схему для приложения для социальной сети.
Пользователи могут публиковать сообщений , а внутри них есть Фотографии . И посты, и фотографии могут иметь лайков и комментариев . У сообщений может быть несколько соавторов / владельцев, поэтому я добавил таблицу «Участники сообщений».
Пользователи могут искать сообщения либо путем поиска по ключевым словам в текстах сообщений, либо по хештегам сообщений. Вот почему я использовал тип tsvector для обоих из них, индексированный по типу индекса GiN.
До сих пор я придумал следующую схему:
Мои основные проблемы с этим дизайном:
Хэштеги в посте - это нормально, что я сделал, то есть - хранение хэштеговсообщение в одном столбце tsvector внутри таблицы сообщений?
две дополнительные идеи, которые я имел в виду:
a. иметь отдельную таблицу для хэштегов, например: id|post_id|tag_name
, и каждая запись будет представлять каждый отдельный хэштег. Звучит немного неэффективно, но это приведет к слишком большому количеству записей.
b. такой же как a, но «tag_name» будет представлять собой tsvector, представляющий все хэштеги постов. Это приведет к гораздо меньшему количеству записей в таблице, чем опция «а».
Сохраненные сообщения - что делать, если у меня есть 10 000 сообщений, и каждый из них будет понравиться 1 000 человек. Это приведет к 10 миллионам записей! это звучит неэффективно.
Нормализация - мне кажется, что существует слишком много таблиц, для которых потребуется много СОЕДИНЕНИЙ для получения целого объекта Post для клиентов (наряду скомментарии, лайки, фотографии и их комментарии / лайки и т. д.), а также быть очень сложными для записи. Будут ли запросы на извлечение / запись различных сообщений слишком медленными / громоздкими?
- Комментарии - следует ли разделять комментарии для сообщений и комментарии к фотографиям, как это было сделано в схеме выше? или объединить их в один стол?
- Я хочу, чтобы внутри комментариев были ответы уровня 1. Должен ли я просто добавить столбец "parent_comment_id" в таблице комментариев?