J'ai le même problème à résoudre et j'envisage également des variantes. Comme j'ai des années d'expérience dans la création d'applications SaaS multi-tenant, j'allais également choisir la deuxième option sur la base de mon expérience antérieure avec les bases de données relationnelles.
En faisant mes recherches, j'ai trouvé cet article sur le site de support de mongodb (il a été ajouté il y a longtemps car il a disparu) : https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi-tenant.html
Les gars ont déclaré qu'il fallait éviter à tout prix la deuxième option, ce qui, d'après ce que j'ai compris, n'est pas particulièrement spécifique à mongodb. J'ai l'impression que cela s'applique à la plupart des bases de données NoSQL sur lesquelles j'ai fait des recherches (CoachDB, Cassandra, CouchBase Server, etc.) en raison des spécificités de leur conception.
Les collections (ou les seaux ou tout autre nom utilisé dans les différentes bases de données) ne sont pas la même chose que les schémas de sécurité dans les SGBDR. Bien qu'elles se comportent comme des conteneurs pour les documents, elles sont inutiles pour appliquer une bonne séparation des locataires. Je n'ai pas trouvé de base de données NoSQL qui puisse appliquer des restrictions de sécurité basées sur les collections.
Bien sûr, vous pouvez utiliser la sécurité basée sur les rôles de mongodb pour restreindre l'accès au niveau de la base de données ou du serveur. ( http://docs.mongodb.org/manual/core/authorization/ )
Je recommande la première option quand :
- Vous disposez de suffisamment de temps et de ressources pour faire face à 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 dans la structure et la fonctionnalités de la base de données pour les différents locataires.
- La conception de votre application doit permettre aux locataires de n'effectuer que des personnalisations minimales au moment de l'exécution.
- Si vous voulez optimiser l'espace et minimiser l'utilisation du matériel ressources matérielles.
- Si vous avez des milliers de locataires.
- Si vous voulez changer d'échelle rapidement et à bon prix.
- Si vous n'avez PAS l'intention de sauvegarder les données en fonction des locataires (gardez des données séparées sauvegardes distinctes pour chaque locataire). Il est possible de le faire même dans ce scénario mais l'effort sera énorme.
Je choisirais la variante 3 si :
- Vous allez avoir une petite liste de locataires (plusieurs centaines).
- Les spécificités de l'entreprise exigent que vous puissiez prendre en charge de grandes différences dans la structure de la base de données pour différents locataires (par exemple, l'intégration avec des systèmes tiers, l'import-export de données).
- La conception de votre application permettra aux clients (locataires) d'apporter des modifications importantes au cours de son exécution (ajout de modules, personnalisation des champs, etc.).
- Si vous disposez de suffisamment de ressources pour évoluer rapidement vers de nouveaux nœuds matériels.
- Si vous êtes tenu de 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 des locataires différents dans des bases de données différentes (voire des centres de données).
- Si vous souhaitez utiliser pleinement les fonctions de sécurité prêtes à l'emploi de mongodb, telles que les rôles.
- Il existe de grandes différences en termes de taille entre les locataires (vous avez beaucoup de petits locataires et peu de très grands locataires).
Si vous postez des détails supplémentaires sur votre demande, je pourrai peut-être vous donner des conseils plus détaillés.
0 votes
Cher @Braintapper, nous sommes actuellement dans la même situation avec notre application qui doit être multi-tenant. Avez-vous des expériences à partager ? Ce serait formidable, merci.
3 votes
Pour mon application, j'ai fini par choisir Postgresql (nous bénéficions d'une base de données relationnelle avec des fonctionnalités de type NoSQL via l'extension hstore) au lieu de MongoDB et de gérer la multi-location dans Rails avec le scoping. Nous utilisons une approche similaire à celle utilisée dans ce Railscast : railscasts.com/episodes/388-multitenancy-with-scopes
2 votes
Je sais qu'une réponse a déjà été choisie pour cette question mais toute autre personne devrait se référer à ce document officiel sur le site mongohq : support.mongohq.com/use-cases/multi-tenant.html . Il se prononce clairement contre la solution de @Braintapper ci-dessous
1 votes
Réponse mise à jour. Les informations contenues dans votre lien n'étaient pas facilement disponibles en mai 2010.
0 votes
@Braintapper utilisez-vous la solution postgresql (basée sur railscasts.com) en ce moment ? Je veux l'utiliser mais je ne suis pas sûr qu'elle ajoute de la sécurité et combien de locataires elle peut supporter ! s'il vous plaît j'ai besoin de votre retour sur cette expérience. merci
0 votes
@medBo Oui, nous utilisons notre propre version personnalisée de la solution Postgresql. Vous pouvez avoir autant de locataires que vous le souhaitez, vous devez simplement vous assurer que la conception de votre base de données est adaptée à vos besoins. En termes de sécurité, vous devrez faire un peu de travail. Il existe quelques gemmes et bibliothèques en boîte que vous pouvez trouver pour vous aider à gérer cela.
0 votes
@Braintapper merci pour la réponse, je pensais à la séparation des schémas postgres, mais il semble qu'elle ait ses limites, et peut-être est-il préférable de faire la "solution scopes", pouvez-vous me donner une idée du type de travail que je dois faire dans le cadre de la question de la sécurité ?
0 votes
@medBo Vous devez vous assurer que vos contrôleurs et modèles font ce qu'ils doivent faire pour récupérer l'identifiant du locataire actuel afin de garantir que toutes les requêtes sont filtrées en fonction de cet identifiant. Une fois encore, l'utilisation d'une gemme en conserve pourrait probablement le faire pour vous. Tout ce que je vous dirai sur la façon dont je l'ai fait est probablement dépassé.