@StynuBlizz

Как реализована лента событий в популярных сервисах?

Как реализовано хранение ленты событий (имееться в виду хранение информации о событиях людей на которых я подписан) в бд, в популярных сервисах (Insta,yotube,facebook,vk и т.д)?
Слышал про два способа реализации:

1.Хранение всех событий в одной таблице, что-то вроде:
AUTHOR_ID | POST
001 | ...
002 | ...
005 | ...

2.Хранение индивидуальной ленты для, каждого пользователя (все также храниться в одной таблице,но только каждое событие дублируется для каждого пользователя) что-то вроде:
USER_ID | AUTHOR_ID | POST
001 | 002 | ....
001 | 006 | ....
002 | 001 | ....

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

Вообщем как это все сделано в популярных сервисах?
  • Вопрос задан
  • 424 просмотра
Решения вопроса 1
@MadridianFox
Web-программист, многостаночник
Чем вас не устраивает первый вариант и в чём плюсы второго?
Логика подсказывает, что дублировать пост для каждого юзера, который на него подписан это абсурд.
Хотите сказать, что если я делаю пост в группу в которой 100к подписчиков, то я сразу создаю 100к записей в базе?
Количество постов в таблице постов будет больше чем в первом варианте на несколько порядков и это только замедлит выборку.

Однако, и первый способ гиганты вряд-ли используют прямо так. Постов в соцсетях и так миллиарды. Не могут они храниться в одной таблице так чтобы простой
select * from posts join subscribe sub on(...) where sub.user_id=123
выдавал результат за адекватное время.
Скорее всего там какие-то архисложные индексы строятся, какие-то умные кэши используются, база распределена так, чтобы сотня машин одновременно искала, но каждая машина в своём куске таблицы...

Не парьтесь. Делайте так как считаете нужным, но знайте, что при росте количества пользователей вам придётся ещё разок всё переписать, а при выходе на мировой уровень, скорее всего у вас уже будет команда спецов, и вы ещё пару раз всё перепишете с нуля на других технологиях.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@RidgeA
Поищите доклад Arsen Kostenko How Twitter Works, вот например https://www.youtube.com/watch?v=tlPkM0lxMKc

Если коротко - лента для каждого пользователя рассчитана заранее.
Но
Не парьтесь. Делайте так как считаете нужным, но знайте, что при росте количества пользователей вам придётся ещё разок всё переписать, а при выходе на мировой уровень, скорее всего у вас уже будет команда спецов, и вы ещё пару раз всё перепишете с нуля на других технологиях.
- 100%
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы