J'ai un client qui veut que je construis un SaaS Application avec une architecture multi-locataires, où différents clients iront dans un schéma séparé sur le même serveur DB. J'ai déjà vu cette architecture avant, Mais jamais vraiment l'a utilisé, alors je suis assez nouveau au concept.
Je suis fortement contre cela, car je pense que cela ajouterait un niveau de complexité à l'application. Leur plus grande préoccupation est la sécurité.
La seule amélioration de la sécurité que je peux voir de l'utiliser est de protéger les utilisateurs des erreurs de développeur:
Ces deux préoccupations sont assez bien gérées par des cadres de développement modernes (je prévois d'utiliser Django). En plus de cela, je ne peux vraiment en voir aucun avantage.
"Je pense que cela ajouterait un niveau de complexité à l'application"
... opposé à quoi - en utilisant un seul schéma pour tous les locataires?
Ensuite, généralement l'inverse est vrai. La mise en œuvre multi-localisée dans un schéma ajoute la complexité à chaque table où les données peuvent appartenir à différents locataires, ce qui signifie que ce type de complexité ira également dans votre application. Surtout quand il y a beaucoup de tables, avoir des schémas séparés réellement réduit la complexité de votre application. Faites le schéma un paramètre configurable de temps d'exécution, vous pouvez développer votre application presque comme s'il n'y avait qu'un seul locataire.
De plus, il rend les tâches administratives individuelles telles que la sauvegarde/la restauration individuelle par locataire un enfer plus facile. Vous pouvez même permettre à différents locataires ayant différentes versions du schéma dans la production en même temps.
Avoir un schéma pour tous les locataires n'est bénéfique que si une grande partie des données du schéma est la même pour tous les locataires et que les données ne sont pas gérées individuellement par les locataires.
Bien sûr, ce que vous devriez éviter dans une approche de schéma multiple est une personnalisation de schéma différente pour les locataires individuels - cela ajouterait en effet une sorte de complexité que vous souhaitez éviter. Assurez-vous que les changements de schéma sont toujours mis en œuvre par des scripts versionnés (et non sur la mouche "). Vous pouvez donc exécuter automatiquement ces scripts contre tous les schemas (vous avez besoin de ceux, même lorsque vous utilisez un seul schéma, car vous avez généralement au moins une Datube de base de données, une base de données de test et une base de données de production à gérer).
Selon le SGBD, vous pouvez également envisager d'utiliser différentes instances de base de données, ce qui pourrait vous donner une meilleure expérience d'échelle. Pour un système comme Oracle, différents schémas pourraient être la meilleure option en raison des frais généraux administratifs de la gestion des différentes instances de DB. Pour un système tel que MySQL, différentes instances de base de données pourraient être une approche valide, peut-être une meilleure approche (dépend de votre cas).
Une architecture mutualisée a l'avantage de l'évolutivité ainsi que la sécurité. Lorsque vous avez toutes les données client dans une table, tous les clients ont accès à toutes les données des clients, ne pas calculer le code que vous écrivez pour limiter cet accès. Dans une architecture mutualisée, vous pouvez configurer des utilisateurs différents dans la db et ont une conception beaucoup plus simple du processus d'authentification.
Du point de vue de scalabiliy vous ne avez plus besoin index énormes pour la recherche par le biais qui ralentira vos requêtes. Les données n'a aucune relation, au moins d'un pov client, parce qu'ils appartiennent à des clients différents. Il est logique de séparer les données pour cette raison.
Si vous configurez l'architecture dans différentes instances aussi bien, vous pouvez ensuite affecter les ressources là où il est nécessaire, ainsi qu'un niveau de sécurité supplémentaire.
En utilisant différentes instances peut être très bon, ainsi que compliquer les choses en fonction des caractéristiques de l'application.
Je ne suis pas d'accord que cette architecture ajoutera la complexité de l'application. Si quoi que ce soit, il devrait simplifier.