Предположим, у нас есть популярный сайт. Нам нужно реализовать почтовый обмен сообщениями между пользователями.
Типичное решение - использовать 2 таблицы:
Пользователи (user_id)
Сообщения (message_id, sender_id (указывает на user_id), receive_id (ссылается на user_id), тему, тело).
Этот метод имеет 2 существенных ограничения
- Все сообщения всех пользователей хранятся в одной таблице, что приводит к высокой загрузке и снижению общей производительности базы данных.
- Когда кому-то нужно отправить сообщение нескольким пользователям одновременно, сообщение копируется (receients_count) раз.
В другом решении используются 3 таблицы:
Пользователи (user_id)
Sent_messages (sent_id, sender_id (ссылки user_id), тема, тело)
Received_messages (sent_id, receive_id (ссылки на user_id), тема, тело)
тема и текст полученного сообщения копируются из соответствующих полей sent_messages.
Этот метод приводит к
- Денормализация базы данных путем копирования информации из одной таблицы в другую
- Пользователи могут фактически удалять отправленные / полученные сообщения, не удаляя их из получателей / отправителей.
- Сообщения занимают примерно в 2 раза больше места
- Каждая таблица загружается примерно в 2 раза меньше.
Итак, вот вопросы:
- Какой из рассмотренных проектов лучше подходит для высокой нагрузки и масштабируемости? (Я думаю это второй)
- Есть ли другой дизайн базы данных, который может справиться с высокой нагрузкой? Что это? Каковы ограничения?
Спасибо!
P.S. Я понимаю, что прежде чем приступить к решению проблем масштабируемости, сайт должен быть очень успешным, но я хочу знать, что делать, если мне нужно.
UPDATE
В настоящее время для первых версий я буду использовать дизайн, предложенный Даниэлем Вассалло. Но если в будущем все будет хорошо, дизайн изменится на второй. Спасибо Эверту за то, что он успокоил меня.