Предположите, что у нас есть популярный сайт. Мы должны реализовать подобный почте обмен сообщениями между пользователями. Стандартное решение состоит в том, чтобы использовать 2 таблицы:
Пользователи (user_id)
Сообщения (message_id, sender_id (ссылки user_id), receiver_id (ссылки user_id), предмет, тело).
Этот метод имеет 2 значительных ограничения
Другое решение использует 3 таблицы:
Пользователи (user_id)
Sent_messages (sent_id, sender_id (ссылки user_id), предмет, тело)
Received_messages (sent_id, receiver_id (ссылки user_id), предмет, тело)
предмет и тело received_messages копируются с соответствующих полей sent_messages.
Этот метод приводит к
Таким образом, здесь идут вопросы:
Спасибо!
P.S. Я понимаю, что прежде, чем добраться до этих масштабируемость выходит, сайт должен быть очень успешным, но я хочу знать, что сделать, если я должен.
ОБНОВЛЕНИЕ
В настоящее время для первых версий я буду использовать дизайн, предложенный Daniel Vassallo. Но если все будет в порядке в будущем, то дизайн будет изменен на второй. Благодаря Выворачивают для смягчения моего предчувствия об этом.
Вы можете захотеть избежать копирования тела сообщения несколько раз в случае, когда сообщение отправляется нескольким получателям. Вот еще один вариант, который вы можете рассмотреть:
users (user_id)
messages (message_id, sender_id, subject, body)
received_messages (message_id, user_id, address_mode, deleted)
Эта модель может быть больше похожа на twitter, чем на электронную почту, но она может иметь некоторые преимущества.
Правила таковы:
Вот некоторые из преимуществ:
Для большинства приложений, если вы используете оптимистичный уровень изоляции с приведенной выше моделью, у вас не должно быть проблем с производительностью, даже если вы ожидаете, что сообщения будут обмениваться со скоростью несколько в секунду. С другой стороны, если вы ожидаете сотни или тысячи сообщений в секунду, тогда действительно может возникнуть необходимость рассмотреть другие варианты.
В общем случае размер базы данных не будет иметь большого значения. Гораздо важнее скорость.
Поэтому я бы склонялся ко второму варианту. Как вы уже сказали, это значительно упрощает такие вещи, как удаление сообщений, и я уверен, что это очень распространенный способ сделать это.