J'ai le même problème à résoudre et je considère également des variantes. Comme j'ai des années d'expérience dans la création d'applications SaaS multi-locataires, j'allais également sélectionner la deuxième option en fonction de mon expérience précédente avec les bases de données relationnelles.
En faisant mes recherches, j'ai trouvé cet article sur le site de support de mongodb (il y a eu un retour depuis qu'il est parti):
https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi -tenant.html
Les gars ont déclaré éviter à tout prix les 2e options, ce qui, d'après ce que je comprends, n'est pas particulièrement spécifique à mongodb. J'ai l'impression que cela s'applique à la plupart des bases de données NoSQL que j'ai recherchées (CoachDB, Cassandra, CouchBase Server, etc.) en raison des spécificités de la conception de la base de données.
Les collections (ou buckets ou comment ils l'appellent dans différentes bases de données) ne sont pas la même chose que les schémas de sécurité dans le SGBDR bien qu'ils se comportent comme des conteneurs pour des documents, ils sont inutiles pour appliquer une bonne séparation des locataires. Je n'ai pas trouvé de base de données NoSQL pouvant appliquer des restrictions de sécurité basées sur des collections.
Bien sûr, vous pouvez utiliser la sécurité basée sur les rôles mongodb pour restreindre l'accès au niveau de la base de données / serveur. ( http://docs.mongodb.org/manual/core/authorization/ )
Je recommanderais la 1ère option lorsque:
- Vous disposez de suffisamment de temps et de ressources pour gérer la complexité de la conception, de la mise en œuvre et des tests de ce scénario.
- Si vous n'allez pas avoir beaucoup de différences de structure et de fonctionnalité dans la base de données pour différents locataires.
- La conception de votre application permettra aux locataires de n'effectuer que des personnalisations minimales au moment de l'exécution.
- Si vous souhaitez optimiser l'espace et minimiser l'utilisation des ressources matérielles.
- Si vous comptez avoir des milliers de locataires.
- Si vous souhaitez évoluer rapidement et à bon prix.
- Si vous n'allez PAS sauvegarder les données en fonction des locataires (conservez des sauvegardes distinctes pour chaque locataire). Il est possible de le faire même dans ce scénario, mais l'effort sera énorme.
J'irais pour la variante 3 si:
- Vous allez avoir une petite liste de locataires (plusieurs centaines).
- Les spécificités de l'entreprise vous obligent à être en mesure de supporter de grandes différences dans la structure de la base de données pour différents locataires (par exemple intégration avec des systèmes tiers, import-export de données).
- La conception de votre application permettra aux clients (locataires) d'apporter des modifications significatives au runtime de l'application (ajout de modules, personnalisation des champs, etc.).
- Si vous disposez de suffisamment de ressources pour évoluer rapidement avec de nouveaux nœuds matériels.
- Si vous devez conserver des versions / sauvegardes des données par locataire. La restauration sera également facile.
- Il existe des restrictions légales / réglementaires qui vous obligent à conserver différents locataires dans différentes bases de données (même des centres de données).
- Si vous souhaitez utiliser pleinement les fonctionnalités de sécurité prêtes à l'emploi de mongodb telles que les rôles.
- Il existe de grandes différences de taille entre les locataires (vous avez beaucoup de petits locataires et peu de très gros locataires).
Si vous publiez des détails supplémentaires sur votre candidature, je pourrais peut-être vous donner des conseils plus détaillés.