Concevoir une architecture de base de données dans un environnement multi-locataires exige une réflexion attentive sur l’isolation des données, la scalabilité et la charge de maintenance. Le diagramme Entité-Relation (ERD) sert de plan directeur pour ces décisions, déterminant la manière dont les données sont structurées entre les locataires. Le choix de la bonne approche influence les performances, la sécurité et la capacité à évoluer le système au fil du temps. Ce guide explore les principaux modèles architecturaux, leurs implications sur l’ERD et les compromis inhérents à chaque stratégie.

🔍 Comprendre le multi-locataire dans la modélisation des données
Le multi-locataire permet à une seule instance de logiciel de servir plusieurs clients, souvent appelés locataires. Dans le cadre de la conception de bases de données, le défi principal consiste à déterminer comment séparer les données des locataires tout en maintenant une efficacité optimale. L’ERD doit refléter clairement ces limites de séparation.
- Locataire : Un client individuel ou une organisation utilisant le système.
- Système partagé : La logique de l’application et éventuellement l’infrastructure sous-jacente.
- Isolation des données : Assurer qu’un locataire ne puisse pas accéder aux données d’un autre.
Les choix de conception portent principalement sur l’emplacement de la frontière d’isolation. Existe-t-elle au niveau de la base de données, au niveau du schéma ou au niveau des lignes ? Chaque choix exige une structure d’ERD spécifique.
🏗️ Stratégie 1 : Base de données par locataire
Dans ce modèle, chaque locataire reçoit une instance de base de données dédiée. Cela assure le plus haut niveau d’isolation et de sécurité. Du point de vue de l’ERD, le schéma reste identique dans toutes les bases de données, mais la séparation physique est absolue.
📊 Structure de l’ERD
Le diagramme ERD pour une base de données à un seul locataire est identique à une conception standard à un seul locataire. Il n’est pas nécessaire d’avoir une colonne tenant_id car la frontière de la base de données agit elle-même comme filtre.
- Structure des tables : Les tables contiennent uniquement les données pertinentes pour le locataire spécifique.
- Clés étrangères : L’intégrité référentielle standard s’applique sans prise en compte du locataire.
- Index : Optimisés pour le volume spécifique de données de ce locataire.
✅ Avantages
- Isolation complète : Une faille dans une base de données n’affecte pas les autres.
- Personnalisation : Les modifications de schéma peuvent être appliquées à des locataires spécifiques sans affecter les autres.
- Performance : Aucune contention provenant d’autres locataires sur le même pool de connexions ou sur les E/S disque.
❌ Inconvénients
- Coût : Coût élevé de l’infrastructure en raison de plusieurs instances.
- Maintenance : Les mises à jour du schéma nécessitent un déploiement sur chaque instance de base de données.
- Complexité : La gestion des connexions et de l’orchestration devient difficile à grande échelle.
🏗️ Stratégie 2 : Schéma par locataire
Cette approche se situe entre les deux précédentes. Chaque locataire reçoit un schéma dédié au sein du même serveur de base de données. Cela réduit la charge liée à la gestion de plusieurs connexions à la base de données tout en maintenant une séparation logique.
📊 Structure du schéma ERD
Le schéma ERD reste cohérent avec un modèle mono-locataire, mais l’espace de noms change. Les tables existent dans un espace de noms de schéma spécifique plutôt que dans l’espace de noms public.
- Noms des tables : Conventions de nommage standard (par exemple,
utilisateurs,commandes). - Noms des schémas : Identifiants uniques (par exemple,
schéma_locataire_a,schéma_locataire_b). - Connectivité : L’application se connecte au schéma spécifique du locataire actif.
✅ Avantages
- Isolation : Une isolation plus forte que les modèles de schéma partagé.
- Gestion : Plus facile à gérer que des instances de base de données séparées.
- Sauvegarde : Peut restaurer ou sauvegarder des schémas individuels de manière indépendante.
❌ Inconvénients
- Utilisation des ressources : Consomme encore plus de ressources qu’un modèle entièrement partagé.
- Complexité des requêtes : L’agrégation des données entre les locataires nécessite un changement dynamique de schéma.
- Décalage de schéma : Maintenir les schémas synchronisés sur de nombreux locataires est une tâche fastidieuse.
🏗️ Stratégie 3 : base de données partagée, schéma partagé
C’est l’approche la plus courante pour les applications SaaS. Tous les locataires partagent la même base de données et les mêmes tables. La séparation des données est réalisée logiquement grâce à une colonne d’identifiant unique.
📊 Structure du schéma ERD
Le schéma ERD doit inclure explicitement une tenant_id colonne dans chaque table qui stocke des données spécifiques au locataire. Cette colonne agit comme clé de partition.
- Tables principales :
utilisateurs,commandes,produitstoutes contiennent unetenant_id. - Tables partagées : Des tables telles que
rôlesouautorisationspourraient être partagées par tous les locataires. - Contraintes : Les clés étrangères peuvent nécessiter un encadrement pour garantir que l’intégrité référentielle soit maintenue dans le contexte du locataire.
✅ Avantages
- Efficacité des coûts : Coût d’infrastructure le plus faible.
- Maintenance : Les modifications du schéma s’appliquent instantanément à tous les locataires.
- Analytiques : Plus facile d’agréger les données pour des rapports à l’échelle du système.
❌ Inconvénients
- Requêtes complexes : Chaque requête nécessite un filtrage par
tenant_id. - Performance : Risques élevés de contention si un locataire consomme des ressources excessives.
- Sécurité : Risque accru d’erreurs logiques entraînant une fuite de données.
🏗️ Stratégie 4 : Modèle hybride
Une approche hybride combine des éléments des stratégies ci-dessus. Par exemple, un schéma partagé pour les données standard, mais un schéma dédié pour les niveaux premium ou des locataires spécifiques à forte valeur.
📊 Structure du schéma ERD
Le schéma ERD devient plus complexe, en distinguant les tables partagées des tables spécifiques au locataire.
- Tables globales : Stocker la configuration ou les métadonnées partagées.
- Tables de locataires : Stocker les données utilisateur avec un
tenant_idou dans des schémas séparés. - Liens : Les opérations de jointure doivent tenir compte de la portée des données.
🛡️ Isolation des données et considérations sur la sécurité
Quelle que soit la stratégie choisie, l’isolation des données est primordiale. Le modèle conceptuel des données doit supporter des mécanismes qui empêchent l’accès accidentel aux données.
🔒 Sécurité au niveau des lignes
Dans un modèle de schéma partagé, des politiques de sécurité au niveau des lignes (RLS) peuvent être définies. Le moteur de base de données restreint l’accès aux lignes où le identifiant_locataire correspond au contexte authentifié.
- Mise en œuvre :Les politiques imposent des vérifications à chaque
SÉLECTIONNER,METTRE À JOUR, etSUPPRIMERopération. - Avantage : Empêche les erreurs au niveau de l’application de provoquer des fuites de données.
- Impact sur le modèle conceptuel des données : Exige des colonnes explicites
identifiant_locatairesur toutes les tables pertinentes.
🔒 Contraintes de clé étrangère
Assurer l’intégrité référentielle entre les locataires peut être délicat dans les modèles partagés. Une clé étrangère ne devrait idéalement pas pointer vers une table qui s’étend sur plusieurs locataires, sauf si la relation est explicitement globale.
- Référence récursive : Si une table se réfère à elle-même (par exemple,
identifiant_parent), leidentifiant_locatairedoit correspondre des deux côtés. - Références globales : Tables telles que
catégoriespeut être global, ce qui permet de le référencer par tout locataire.
⚡ Stratégies de performance et de mise à l’échelle
À mesure que le nombre de locataires augmente, la performance devient une préoccupation majeure. La conception du schéma ER influence directement la capacité du système à évoluer.
📈 Stratégies d’indexation
Les index sont essentiels pour les performances des requêtes. Dans un schéma partagé, la colonnetenant_iddoit faire partie de la clé primaire composite ou être fortement indexée.
- Index composés :
(tenant_id, created_at)permet un filtrage efficace par locataire et par date. - Index partiels :Les index peuvent être créés uniquement pour des conditions spécifiques, ce qui réduit leur taille.
- Éviter :Indexer des colonnes qui n’aident pas au filtrage par locataire.
📦 Partitionnement
Le partitionnement de table peut aider à gérer de grandes quantités de données. Les données peuvent être partitionnées partenant_idou par des plages de dates au sein d’un locataire.
- Partitionnement par plage :Sépare les données en fonction des plages de dates.
- Partitionnement par liste :Sépare les données en fonction d’identifiants de locataires spécifiques.
- Gestion :Les partitions peuvent être détachées ou archivées pour améliorer les performances.
🔧 Maintenance et évolution du schéma
Le logiciel évolue. Des tables doivent être ajoutées, des colonnes modifiées ou des types changés. L’architecture choisie détermine l’effort requis pour ces modifications.
🔄 Mises à jour du schéma
- Schéma partagé :Un seul script de migration met à jour le schéma pour tous les locataires. C’est le chemin le plus simple.
- Base de données par locataire : Le script de migration doit être exécuté sur chaque instance de base de données. Une automatisation est requise.
- Schémas par locataire : Similaire à la base de données par locataire, mais géré au sein de la même instance.
📝Compatibilité descendante
Lors de la modification du MCD, assurez-vous de la compatibilité descendante afin d’éviter les temps d’arrêt.
- Ajouter des colonnes : Utilisez d’abord des colonnes acceptant les valeurs nulles, puis remplissez les données, puis rendez-les non nulles.
- Supprimer des colonnes : Renommez les colonnes avant de les supprimer afin d’éviter les modifications qui cassent les fonctionnalités.
- Versioning : Pensez au versioning du schéma lui-même si les locataires peuvent opter pour ne pas recevoir les mises à jour.
📋 Comparaison des approches architecturales
| Fonctionnalité | Base de données par locataire | Schéma par locataire | Schéma partagé |
|---|---|---|---|
| Isolation | Élevé | Moyen | Faible |
| Coût | Élevé | Moyen | Faible |
| Maintenance | Complexe | Moyen | Simple |
| Performance des requêtes | Élevé (sans filtrage) | Moyen | Variable (filtrage requis) |
| Complexité du schéma ERD | Simple (par base de données) | Simple (par schéma) | Complexe (tenant_id requis) |
| Évolutivité | Horizontal | Vertical | Vertical/Horizontal |
✅ Liste de contrôle des meilleures pratiques
Avant de finaliser le schéma ERD pour un système multi-locataire, assurez-vous que les critères suivants sont respectés.
- Définir la portée du locataire : Identifiez clairement quelles données appartiennent à un locataire et lesquelles sont globales.
- Normaliser les noms : Utilisez des conventions de nommage cohérentes pour
tenant_idles colonnes dans toutes les tables. - Imposer des contraintes : Utilisez des contraintes de base de données pour empêcher l’accès croisé aux données des locataires lorsque cela est possible.
- Prévoir le départ des locataires : Concevez pour l’inscription et le départ des locataires (suppression ou archivage des données).
- Tester l’isolation : Testez régulièrement pour vous assurer qu’un locataire ne peut pas interroger les données d’un autre locataire.
- Documenter les relations : Documentez clairement les relations de clés étrangères dans la documentation du schéma ERD.
- Surveiller les performances : Configurez des alertes pour les requêtes lentes qui pourraient indiquer des goulets d’étranglement spécifiques aux locataires.
🧩 Gestion des cas limites
Les scénarios du monde réel introduisent souvent des complexités que les modèles ER standard ne couvrent pas immédiatement.
🔄 Fusion de locataires
Parfois, deux locataires se fusionnent en un seul. Dans un schéma partagé, cela nécessite de déplacer les lignes d’un tenant_id à un autre. Dans un modèle base de données par locataire, cela implique la fusion de deux bases de données entières.
- Consistance des données : Assurez-vous qu’aucune donnée n’est perdue lors de la fusion.
- Déduplication : Gérez les enregistrements en double qui pourraient surgir de la fusion.
📉 Churn des locataires
Les locataires partent. Le choix de supprimer les données ou de les archiver affecte le modèle ER.
- Suppressions douces : Ajoutez un
is_deletedindicateur pour préserver les données aux fins de conformité. - Suppressions rigides : Supprimez les lignes entièrement. Assurez-vous que les suppressions en cascade sont correctement configurées pour éviter les enregistrements orphelins.
- Archivage : Déplacez les anciennes données des locataires vers des tables de stockage froid tout en maintenant le schéma intact.
🔗 Intégration avec la logique de l’application
Le modèle ER n’est pas une île. Il doit s’intégrer sans heurt au niveau de l’application.
- Middlewares : Utilisez des middlewares au niveau de l’application pour injecter
tenant_iddans chaque requête automatiquement. - Configuration de l’ORM : Configurez les outils de mappage objet-relationnel pour gérer le filtrage par locataire.
- Conception d’API : Assurez-vous que les points de terminaison d’API valident le contexte du locataire avant de retourner les données.
🎯 Réflexions finales sur la conception
Choisir la conception de base de données appropriée pour un environnement multi-locataire est un équilibre entre l’isolation et l’efficacité. Le schéma ERD agit comme un contrat qui définit ces limites. Il n’existe pas de solution parfaite unique ; le choix dépend des exigences spécifiques en matière de sécurité, de coût et d’échelle. En comprenant les implications de chaque stratégie, les architectes peuvent concevoir des systèmes robustes, évolutifs et sécurisés.
Se concentrer sur des pratiques claires de modélisation des données garantit que le système reste maintenable à mesure que le nombre de locataires augmente. Des revues régulières du schéma ERD par rapport aux modèles d’utilisation du monde réel aident à identifier les goulets d’étranglement ou les failles de sécurité avant qu’elles ne deviennent des problèmes critiques.
En fin de compte, l’objectif est une conception qui soutient l’activité sans compromettre l’intégrité des données. Une planification soigneuse à l’étape du schéma ERD évite des refacturations coûteuses ultérieurement.




