Какая оптимальная структура для таблицы «лайков»?

Есть посты, есть юзеры. Нужно сделать чтобы они могли ставить лайки постам.
На ум мне сразу пришла такая структура:
create table `likes` (
  `post_id` int, 
  `user_id` int,   
  foreign key (`post_id`) references `users`(`id`) on delete cascade,
  foreign key (`user_id`) references `posts`(`id`) on delete cascade, 
)  engine=InnoDB, default character set = utf8;

1) Если, чисто теоретически представить, что пользователей миллионы, а постов десятки миллионов, является ли такая структура оптимальной?
2) нужно ли тут поле id, или PK сделать составной (post_id, user_id) или PK вообще не нужен? Это влияет на селект?
  • Вопрос задан
  • 340 просмотров
Решения вопроса 2
@orbit070
Если, чисто теоретически представить, что пользователей миллионы, а постов десятки миллионов, является ли такая структура оптимальной?

Почти. Нужно применить дублирование и прокинуть в эту таблицу сразу все те поля, которые вам могут пригодиться для отображения, иначе каждый раз придется делать join, чего бы не хотелось при highload. То есть нужно добавить в таблицу сразу поля вроде user_name, post_title, post_body, и т.д(в общем все то, что вы планировали доставать с помощью join).

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

нужно ли тут поле id, или PK сделать составной (post_id, user_id) или PK вообще не нужен? Это влияет на селект?


Зависит от сценариев использования(подумайте, в каком случае вам нужно будет поле id), но в большинстве случаев оно не нужно и такие поля вводят для душевного спокойствия и гармонии. На селект это не влияет, ведь все равно вы будете делать выборку либо по user_id либо по post_id(опять же, это в большинстве распространенных сценариев, если у вас есть какая-то логика, где нужно будет выбирать из таблицы likes записи по какому-то намеренно введенному идентификтаору, то вводите).
Ответ написан
VicTHOR
@VicTHOR
(╮°-°)╮┳━━┳ ( ╯°□°)╯ ┻━━┻
Нормально, индекс не забудь, записей будет за миллиард
1 лайк - 1 запись (такой-то пользователь - такой-то пост)
Выборка агрегатная, группируешь по постам (для отображения на посте количества лайков) или по пользователям (что лайкнул пользователь).

id не нужен, составной PK будет индексом.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
alex-1917
@alex-1917
Если ответ помог, отметь решением
Всплывала похожая проблема, именно с лайками.
Тормоза были из-за корявого кода.
Так как кол-во юзеров было уже под 2млн, постов у каждого от 1к до 30к,лайки соотвественно у каждого поста.
Надо было показывать выборку юзеров с накопленными лайками.
Решили сделать на клиенте)))
Посетитель выбирает массив юзеров, ему быстро отдаем основные данные, а ВЕСЬ МУСОР (лайки,шмайки, баллы) подгружаем отдельным (практически плоским мгновенным запросом) в фоне аяксом.
Нафига тащить сразу ВСЁ?...
Ответ написан
Ваш ответ на вопрос

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

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