Мне нужно решить ту же проблему, а также рассмотреть варианты.
Поскольку у меня есть многолетний опыт создания мультитенантных приложений SaaS, я также собирался выбрать второй вариант, основываясь на моем предыдущем опыте работы с реляционными базами данных.
Во время моего исследования я нашел эту статью на сайте поддержки mongodb (путь назад был добавлен, поскольку он пропал):
https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi-tenant.html
Ребята заявили, что избегают 2-х вариантов любой ценой, что, как я понимаю, не особенно характерно для mongodb. У меня сложилось впечатление, что это применимо к большинству исследованных мной баз данных NoSQL (CoachDB, Cassandra, CouchBase Server и т. Д.) Из-за особенностей дизайна базы данных.
Коллекции (или группы, или как они их называют в разных БД) - это не то же самое, что схемы безопасности в СУБД, несмотря на то, что они ведут себя как контейнер для документов, которые бесполезны для применения правильного разделения клиентов. Я не смог найти базу данных NoSQL, которая может применять ограничения безопасности на основе коллекций.
Конечно, вы можете использовать безопасность на основе ролей mongodb для ограничения доступа на уровне базы данных / сервера. (http://docs.mongodb.org/manual/core/authorization/)
Я бы порекомендовал 1-й вариант, когда:
- У вас достаточно времени и ресурсов, чтобы справиться со сложностью
разработка, реализация и тестирование этого сценария.
- Если вы не собираетесь иметь много различий в структуре и
функциональность в базе данных для разных арендаторов.
- Дизайн вашего приложения позволит арендаторам сделать только минимальные
настройки во время выполнения.
- Если вы хотите оптимизировать пространство и минимизировать использование оборудования
ресурсы.
- Если у вас будут тысячи арендаторов.
- Если вы хотите быстро и с хорошей стоимостью.
- Если вы НЕ собираетесь создавать резервные копии данных на основе арендаторов (держите отдельно
резервные копии для каждого арендатора). Это можно сделать даже в этом
сценарий, но усилия будут огромны.
Я бы пошел на вариант 3, если:
- У вас будет небольшой список арендаторов (несколько сотен).
- Специфика бизнеса требует от вас поддержки больших различий в структуре базы данных для разных арендаторов (например, интеграция со сторонними системами, импорт-экспорт данных).
- Дизайн вашего приложения позволит клиентам (арендаторам) вносить существенные изменения во время выполнения приложения (добавление модулей, настройка полей и т. Д.).
- Если у вас достаточно ресурсов для быстрого масштабирования с новыми аппаратными узлами.
- Если вам необходимо хранить версии / резервные копии данных для каждого клиента. Также восстановление будет легким.
- Существуют законодательные / нормативные ограничения, которые заставляют вас держать разных арендаторов в разных базах данных (даже в центрах обработки данных).
- Если вы хотите полностью использовать готовые функции безопасности mongodb, такие как роли.
- Существуют большие различия в размере между арендаторами (у вас много маленьких арендаторов и мало очень крупных арендаторов).
Если вы опубликуете дополнительные сведения о вашем заявлении, возможно, я смогу дать вам более подробный совет.