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