#mongodb #data-modeling #nosql
#mongodb #моделирование данных #nosql
Вопрос:
Как бы вы смоделировали приложение электронной почты (например, gmail) в MongoDB? Смоделировали бы вы Conversation
? Inbox
/ OutBox
? или mail
?
Спасибо
Комментарии:
1. нашел это, и они моделируют электронную почту slideshare.net/ibwhite/mongodb-in-production-at-sailthru
Ответ №1:
В Gmail используется концепция меток (например, тегов в stackoverflow). Это означает, что входящие, отправить почту, помеченный звездочкой и т.д. Обычный объект электронной почты, просто помеченный указанным ярлыком. Итак, есть только Email
и Labels
.
Вы можете просмотреть его с помощью поиска в gmail, например, label:inbox
или label:Starred
.
Я хотел бы предложить довольно простой дизайн, подобный этому:
Email
{
_id
Title,
Body,
Status {read, unread},
Labels { name, type(system, custom) },
Replies {...},
..
}
Labels
{
_id,
name,
settings {
ShowInLabelsList (show, hide, showIfUnread),
ShowInMessageList (show, hide),
..
}
}
Конечно, я что-то пропустил, но я думаю, что можно начать с приведенной выше схемы и добавить дополнительные функции в будущем, если потребуется.
Обновить:
Для «Просмотра беседы», я думаю, все ответы отображаются во вложенной коллекции Replies
(я обновил свою схему). Логика следующая:
Как только вы получили новое сообщение, вам нужно проверить, существует ли уже электронное письмо с тем же именем (наверняка нужно удалить ‘Re’ и т.д.). Также необходимо проверить, что пользователь, отправивший электронное письмо, находится в списке получателей. Если вышеуказанные условия верны, то просто добавьте новое электронное письмо во вложенную коллекцию Replies
в противном случае добавьте в коллекцию электронных писем.
Комментарии:
1. @Bugai13: нет, Генри говорит о «потоках электронной почты», то есть группировании писем по темам (это, вероятно, немного сложнее, чем просто «группировать по темам»).
2. спасибо, что бы вы поместили в ответы? Фактическая почта или… _id фактического почтового отправления?
3. @Henry: Это mongodb, внедрение, embedding… Итак, я бы поместил фактические письма в коллекцию ответов. Отвечает, что это набор тех же документов, что и родительское электронное письмо (за исключением МБ
Replies
).4. @Bugai О, тогда вы действительно моделируете разговор. Как насчет … встраивания всех разговоров в почтовые ящики? это слишком безумно?
5. @Henry Мне тоже трудно понять, что встраивать. Похоже, что предел, с которым мы работаем, — это размер документа. У него жесткий лимит в 16 мб, но я бы предположил, что почтовый ящик размером 15 Мб будет работать медленно, если вы загружаете все целиком. Я видел, как люди рекомендовали сбор данных за беседу. Я рассматриваю возможность создания коллекции разговоров, как описано выше, но тогда вам придется ограничить каждый разговор 16 МБ (должно быть разумно).