Обзор
В MongoDB существует три основных архитектурных подхода к управлению данными в мультитенантной среде, каждый с особыми компромиссами между изоляцией, производительностью и операционной сложностью.
Подход 1: База данных на тенанта
- Самая сильная изоляция данных
- Каждый тенант имеет полностью отдельную базу данных MongoDB
- Компромисс: Высокие затраты на управление — резервные копии, масштабирование и обслуживание умножаются с каждым тенантом
Подход 2: Коллекция на тенанта
- Средний уровень изоляции
- Данные тенанта разделены в одной базе данных с помощью отдельных коллекций
- Компромисс: Проще, чем отдельные базы данных, но изменения схемы нужно применять ко всем коллекциям
Подход 3: Общая коллекция с Tenant ID
- Самый распространённый подход в production
- Все тенанты используют одну коллекцию; каждый документ включает поле
tenantId
- Компромисс: Наиболее ресурсоэффективен, но требует строгой защиты на уровне приложения, чтобы предотвратить утечки данных
Рекомендуемая реализация
Подход с общей коллекцией обычно предпочтителен для масштабируемости. Ключевые практики:
- Создавай составные индексы с
tenantId в качестве первого поля для изоляции запросов и высокой производительности:
db.collection.createIndex({ tenantId: 1, createdAt: -1 })
- Всегда включай
tenantId в каждый запрос, чтобы исключить доступ к данным других тенантов
- Обеспечивай ограничение по тенанту на уровне приложения или middleware
Ключевые факторы выбора
- Нормативные требования — строгий комплаенс может требовать изоляции на уровне базы данных
- Количество тенантов — чем их больше, тем выгоднее модель с общей коллекцией
- Требования к производительности — общие коллекции масштабируются эффективнее
- Операционная сложность — отдельные базы данных существенно увеличивают нагрузку на управление инфраструктурой