Как бы вы смоделировали приложение электронной почты в MongoDB?

#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 МБ (должно быть разумно).