
Dans le paysage de l’architecture logicielle évolutif, le concept de multi-locataire est fondamental. Une seule instance d’application sert plusieurs clients, appelés locataires, tout en maintenant une séparation logique des données. Concevoir la structure de données sous-jacente exige une précision. Les diagrammes Entité-Relation (ERD) servent de plan directeur pour cette architecture. Ils visualisent les relations entre les tables, les clés et les contraintes qui garantissent l’intégrité des données à travers les locataires. 📐
Lors de la construction d’un ERD dans un environnement multi-locataire, le défi principal réside dans l’équilibre entre l’isolation, les performances et les coûts. Il n’existe pas de solution unique qui convienne à toutes les situations. Les architectes doivent plutôt choisir un modèle qui correspond aux exigences de sécurité et au budget opérationnel. Cet article explore les stratégies fondamentales pour modéliser ces schémas, en offrant une analyse approfondie des détails techniques d’implémentation sans dépendre d’outils spécifiques aux fournisseurs. 🛠️
Comprendre les modèles fondamentaux 🔍
La base de la modélisation multi-locataire réside dans la manière dont les données des locataires sont physiquement stockées et logiquement séparées. Trois modèles distincts dominent l’industrie. Chacun présente des compromis uniques en matière d’isolation des données et de complexité de maintenance.
1. Base de données dédiée par locataire 🏢
Dans cette approche, chaque client reçoit son propre instance de base de données isolée. La structure ERD reste identique pour toutes les instances, mais les frontières physiques sont strictes.
- Niveau d’isolation :Maximum. Une panne dans une base de données n’affecte pas les autres.
- Sécurité :Élevée. La séparation physique empêche les fuites accidentelles de données.
- Coût :Élevé en raison de la surcharge de ressources par instance.
- Migration :Complexe. Les modifications de schéma exigent l’exécution de scripts sur chaque instance.
Du point de vue d’un ERD, ce modèle ressemble à un diagramme standard à un seul locataire. Toutefois, la chaîne de déploiement doit gérer plusieurs connexions. Cela est souvent utilisé pour les clients entreprises ayant des exigences strictes en matière de conformité.
2. Base de données partagée, schéma séparé 📂
Ici, tous les locataires résident dans un seul système de base de données, mais chaque locataire dispose de son propre schéma distinct (espace de noms). Les tables sont dupliquées par schéma.
- Niveau d’isolation :Élevé. Séparation logique au sein du moteur de base de données.
- Sécurité :Forte. Les listes de contrôle d’accès (ACL) peuvent restreindre la visibilité des schémas.
- Coût :Modéré. Partage la surcharge du moteur de base de données.
- Maintenance :Plus facile que les bases de données dédiées, mais les mises à jour de schéma doivent être propagées à tous les schémas.
Dans l’ERD, cela est représenté en regroupant les tables sous des étiquettes d’espace de noms spécifiques. Les relations restent constantes, mais l’étendue du diagramme s’élargit pour montrer plusieurs conteneurs de schémas.
3. Base de données partagée, schéma partagé 🔗
C’est le modèle le plus courant pour les applications SaaS générales. Toutes les données résident dans le même ensemble de tables, distinguées par une colonne spécifique.
- Niveau d’isolation : Logique. Toutes les lignes existent dans la même table.
- Sécurité : Dépend de la logique de l’application et de la sécurité au niveau des lignes (RLS).
- Coût : Le plus bas. Maximise l’utilisation des ressources.
- Maintenance : Simple. Les modifications du schéma s’appliquent instantanément à tous les locataires.
Le MCD pour ce modèle introduit une colonne critique : id_locataire. Cette clé étrangère lie chaque enregistrement à un client spécifique. Elle est la pierre angulaire de la séparation des données dans ce modèle.
Visualisation des données du locataire dans les MCD 📊
Créer un MCD efficace pour le multi-locataire nécessite des notations spécifiques pour communiquer clairement la stratégie de partitionnement. Les parties prenantes doivent comprendre comment les données circulent et où se trouvent les frontières.
La colonne ID du locataire
Dans un schéma partagé, la id_locataire doit apparaître sur chaque table qui stocke des données spécifiques à l’utilisateur. Ce n’est pas facultatif. Omettre cette colonne dans une table transactionnelle peut entraîner une fuite de données grave.
- Clé primaire : Souvent, la combinaison de
id_locataireet d’un identifiant local forme une clé primaire composée. - Indexation : Essentielle pour les performances. Les requêtes filtrant par
id_locatairedoivent être rapides. - Contraintes : Les clés étrangères font souvent référence à une table centrale
locatairesprincipale.
Table principale des locataires
Une table dédiée existe généralement pour stocker les métadonnées relatives à chaque locataire. Cette table contient les détails de configuration, l’état d’abonnement et les informations de facturation.
- Attributs clés : ID locataire, Nom, Niveau de forfait, Date de création.
- Relations : Un à plusieurs avec toutes les autres tables de données.
Comparaison des stratégies de schéma 📋
Pour prendre une décision éclairée, comparez l’impact opérationnel de chaque stratégie à l’aide du tableau ci-dessous.
| Fonctionnalité | Base de données dédiée | Schéma partagé | Table partagée |
|---|---|---|---|
| Isolation des données | Physique | Logique | Logique |
| Complexité des requêtes | Simple | Complexe | Complexe |
| Coût des ressources | Élevé | Moyen | Faible |
| Migration du schéma | Difficile | Moyen | Facile |
| Stratégie de sauvegarde | Granulaire | Granulaire | Sauvegarde complète |
Sécurité et partitionnement des données 🔒
Modéliser le schéma n’est que la moitié de la bataille. Le niveau d’accès aux données doit faire respecter les limites définies sur le diagramme. L’isolement logique est l’objectif lors de l’utilisation de tables partagées.
Sécurité au niveau des lignes (RLS)
Les moteurs de bases de données modernes prennent en charge le RLS, qui applique les politiques d’accès au niveau des lignes. Cela permet à la base de données elle-même de filtrer les résultats en fonction du contexte utilisateur actuel.
- Définition de la politique :Une règle stipule qu’une ligne est visible uniquement si
tenant_idcorrespond à la session. - Mise en œuvre :Le MCD doit refléter la capacité à stocker le contexte de session.
- Avantage :Réduit le risque de fuites de données dues à des bogues au niveau de l’application.
Audit et journalisation
Tout changement apporté aux données spécifiques au locataire doit être journalisé. Une table d’audit est essentielle dans le MCD pour suivre qui a modifié quoi et quand. Cela est crucial pour la conformité et le débogage.
- Champs requis :ID du locataire, ID de l’utilisateur, Action, Horodatage, Valeur ancienne, Valeur nouvelle.
- Conservation :Les politiques doivent définir pendant combien de temps les journaux sont conservés.
Considérations sur les performances ⚡
Les tables partagées introduisent de la complexité dans les plans d’exécution des requêtes. À mesure que le volume de données augmente, le moteur de base de données doit séparer efficacement les données des locataires sans scanner toute la table.
Stratégies d’indexation
L’indexation standard est insuffisante. Vous avez besoin d’index composés qui priorisent l’identifiant du locataire.
- Index principal : Doit commencer par
tenant_idsuivi de la clé naturelle. - Optimisation des requêtes : Assurez-vous que toutes les requêtes incluent le filtre locataire dans la clause
WHEREclause. - Partitionnement : Certains systèmes permettent le partitionnement physique des tables par
tenant_idplage ou hachage.
Complexité des requêtes
Lors de la jointure de tables entre plusieurs schémas ou locataires, la condition de jointure doit inclure l’ID du locataire. Le fait de ne pas le faire peut entraîner un produit cartésien des données provenant de clients différents.
- Logique de jointure : Joindre toujours sur
tenant_idET la clé de relation. - Couche application :Le middleware doit injecter le filtre de locataire automatiquement.
Maintenance et migration 🔄
Les schémas ne sont pas statiques. Ils évoluent au fur et à mesure que les exigences changent. Le multi-locataire ajoute une couche de difficulté à ces modifications.
Évolution du schéma
Ajouter une colonne est simple dans une table partagée. Supprimer une colonne affecte tous les locataires. Dans un modèle de base de données dédiée, vous devez scripter le changement pour chaque instance.
- Gestion des versions : Suivre les versions du schéma pour gérer la compatibilité descendante.
- Retours en arrière : Avoir un plan pour annuler les modifications si une migration échoue sur un sous-ensemble de locataires.
Sauvegardes et récupération
Les stratégies de récupération varient selon le modèle. Une base de données dédiée vous permet de restaurer un seul locataire sans affecter les autres. Une base de données partagée nécessite la restauration de toute l’instance.
- Granularité : Les tables partagées rendent la récupération à un instant donné pour un seul locataire difficile.
- Tests : Testez régulièrement les procédures de restauration dans un environnement de préproduction.
Péchés courants à éviter ⚠️
Même avec un ERD bien conçu, des erreurs d’implémentation peuvent compromettre le système. Soyez vigilant face à ces problèmes courants.
- Logique de locataire codée en dur : Ne codez jamais les ID de locataire dans le code de l’application. Utilisez la configuration ou le contexte de session.
- Variables globales : Évitez de stocker le contexte du locataire dans des variables globales qui pourraient persister entre les requêtes.
- Contraintes manquantes : Si la base de données n’impose pas
tenant_idl’unicité, l’application doit la valider strictement. - Ignorer les analyses : Agréger des données provenant de plusieurs locataires pour des rapports nécessite une gestion soigneuse afin d’éviter le mélange d’informations sensibles.
Meilleures pratiques pour les conventions de nommage 🏷️
La cohérence dans les noms aide les développeurs à comprendre immédiatement la structure des données. Utilisez des préfixes ou des suffixes pour indiquer les tables spécifiques au locataire si elles existent dans un schéma partagé.
- Nomination des tables :
tenant_nom_commandesoucommandes_tenant_id. - Nomination des colonnes : Incluez toujours
tenant_idexplicitement dans chaque table d’enregistrements. - Index : Nommez les index clairement, par exemple
idx_commandes_tenant_id.
Conclusion sur les choix d’architecture 🎯
Le choix du bon schéma multi-locataire nécessite un équilibre entre faisabilité technique et besoins métiers. Le diagramme entité-association est l’outil qui communique ce choix à l’ensemble de l’équipe. Que vous choisissiez une isolation physique pour la sécurité ou des tables partagées pour l’efficacité, le schéma doit clairement montrer les frontières.
En respectant des normes de modélisation strictes, en mettant en œuvre un indexage robuste et en maintenant une logique de séparation claire, vous pouvez construire un système évolutif en toute sécurité. La complexité du multi-locataire est maîtrisable lorsque la fondation est solide. Concentrez-vous sur l’intégrité des données et les performances dès la première ligne du schéma. 🚀









