Мне нужно решить ту же проблему и тоже рассмотреть варианты. Поскольку у меня есть многолетний опыт создания мультитенантных приложений 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, такие как роли.
- Между арендаторами существуют большие различия в размере (у вас много мелких арендаторов и мало очень крупных).
Если вы опубликуете дополнительную информацию о своем приложении, возможно, я дам вам более подробный совет.