Twitt
@Twitt

Как работает функционал удаления сообщения в больших социальных сетях?

Берем в пример ВКонтакте, когда пользователь берет и удаляет несколько своих сообщений в диалоге с кем-либо, какой у них проходит SQL запрос? (Даже не сам ВК, а в высоконагруженных проектах как это лучше делать)?
DELETE FROM messages WHERE id = ?
или
UPDATE messages SET status = 'deleted' WHERE id = ?

Первый вариант может быть плох (как я думаю), скорее всего, потому что если сообщение удалится с таблицы, то те сообщения которые сверху от него, придется их опускать вниз, что может быть затратно по времени? Как такое делается в хайлоад проектах?
Хотя мне кажется у вк не происходит DELETE FROM т.к. у собеседника мои сообщения остаются, а удаляются только у меня. И где о такой теме лучше стоит почитать?

P.S. Правильно ли я понимаю, что таблица выглядит примерно таким образом у того же вк?
id | sender | receiver | message | status
33 | 1231 | 992123 | 'Привет' | delete_by_sender
Где значения sender, receiver - айдишники страниц
  • Вопрос задан
  • 231 просмотр
Решения вопроса 1
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Вариант 2 и тому две причины:
- фрагментация есть зло
- необратимых действий быть не должно в принципе

Что касаемо сообщений в двух ящиках то примерно так (в ваших терминах):
message_id, is_deleted, keeper_id, sender_id, receiver_id, message

Индекс по message строить беcполезно если у вас MySQL, у это СУБД нет FTS. Тут вам поможет elasticsearch или sphinx. Если же вы юзаете PostgreSQL то гуглите FTS и вперед)

Если сервис маленький то преждевременная оптимизация вам ни к чему. Однако помните что при создании внешних ключей должны быть индексы по полям на которые ссылаетесь и с которых ссылаетесь.
Я в таблице личных сообщений на достаточно крупном сервисе (более 500 млн сообщений) внешние ключи не ставил в принципе: сохранение консистентности данных не так важно. Если пользователей очень много можно пойти в сторону денормализации: отказаться от join и хранить имя отправителя/получателя в таблице сообщений.
На определенном этапе так же возникнет вопрос кластеризации и шардинга таблицы, но это уже при количестве записей ближе к 1 млрд

Если у вас будут объемы >1 млрд сообщений то я думаю тут уже будет разумен найм DBA, а пока YAGNI
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
gobananas
@gobananas
finishhim.ru
Они не удаляют сообщения на самом деле, они ставят пометку у сообщения что оно удалено. Это имеет определённые бонусы - не надо перестраивать индексы и т.п.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Искра Екатеринбург
от 80 000 до 100 000 ₽
Art gorka Санкт-Петербург
от 60 000 ₽
25 апр. 2024, в 11:20
1000 руб./за проект
25 апр. 2024, в 11:02
5000 руб./за проект
25 апр. 2024, в 10:42
150000 руб./за проект