Dès que votre logiciel SaaS dépasse quelques clients, une question technique devient stratégique : comment stocker et isoler les données de chaque client sans multiplier les serveurs, ni exposer un client aux données d'un autre ? C'est le cœur de l'architecture multi-tenant (multi-locataire), et un mauvais choix initial se paie cher en refonte deux ou trois ans plus tard.

Pourquoi ce choix d'architecture engage votre SaaS sur le long terme

Un SaaS multi-tenant fait tourner une seule application pour plusieurs clients (les « tenants »), chacun ne devant voir que ses propres données. C'est ce qui permet de mutualiser les coûts d'infrastructure et de déployer une mise à jour pour tout le monde en une seule fois. Mais cette mutualisation crée un risque permanent : une erreur de filtrage dans une requête, et les données d'un client se retrouvent affichées chez un autre. Ce type d'incident est l'un des plus redoutés en développement SaaS, car il touche à la confiance des clients et à la conformité RGPD.

Les trois stratégies d'isolation possibles

1. Une base de données par client

C'est l'isolation la plus stricte : chaque client a sa propre base. Aucun risque de fuite croisée, sauvegardes et suppressions simples à cibler. Revers de la médaille : à 50 ou 200 clients, vous gérez autant de bases à faire évoluer, sauvegarder et surveiller. Les migrations de schéma deviennent un chantier récurrent, et les coûts d'infrastructure grimpent vite.

2. Un schéma par client, dans une base partagée

Compromis intermédiaire : une seule base PostgreSQL, mais un schéma dédié par client. On garde une bonne isolation logique tout en réduisant le nombre de connexions et de sauvegardes à gérer. C'est une option pertinente pour un SaaS avec quelques dizaines de clients aux besoins hétérogènes.

3. Une table partagée avec colonne tenant_id et Row-Level Security

C'est l'approche la plus répandue pour un SaaS qui vise la croissance : toutes les données cohabitent dans les mêmes tables, avec une colonne tenant_id et des règles de sécurité au niveau des lignes (Row-Level Security, disponible nativement sous PostgreSQL) qui empêchent une requête de sortir du périmètre d'un client, même en cas d'erreur applicative. C'est plus économique à grande échelle, mais cela exige une discipline stricte : chaque requête, chaque index, chaque job en arrière-plan doit intégrer ce filtre par défaut.

La dette technique la plus fréquente : filtrer côté code plutôt que côté base

Beaucoup d'équipes commencent par filtrer les données « à la main » dans le code applicatif (un WHERE tenant_id = ... ajouté à chaque requête). Cela fonctionne… jusqu'à l'oubli. Un développeur presse, une nouvelle route API, un script de migration exécuté sans le bon contexte : le filtre manque une fois, et l'incident est ouvert. Déplacer cette logique au niveau de la base de données (RLS) ou dans une couche d'accès aux données centralisée réduit drastiquement ce risque, car l'isolation devient impossible à contourner par erreur.

Ce qu'il faut anticiper avant de coder

  • Le modèle de facturation : certains clients auront besoin de quotas différents (volume de stockage, nombre d'utilisateurs), ce qui doit être pensé dans le schéma de données dès le départ.
  • Les exports et suppressions de données : un client qui résilie doit pouvoir récupérer ou faire supprimer ses données sans impacter les autres tenants, ce qui est plus simple à garantir avec une isolation claire.
  • Les migrations de schéma : chaque évolution de structure doit s'appliquer de façon fiable sur tous les tenants, idéalement via des scripts automatisés plutôt que des interventions manuelles répétées.
  • La montée en charge : un tenant très actif ne doit pas dégrader les performances des autres. Cela implique souvent une réflexion sur l'indexation et, à terme, sur la répartition de charge.

Ces scripts de migration et de contrôle de cohérence entre tenants gagnent à être industrialisés plutôt que lancés à la main : c'est typiquement le rôle de l'automatisation des tâches récurrentes, pour fiabiliser les déploiements sans mobiliser un développeur à chaque mise à jour.

Multi-tenant et RGPD : une isolation technique qui facilite la conformité

Une architecture multi-tenant bien conçue simplifie certaines obligations RGPD : traçabilité des accès par client, capacité à exporter ou effacer les données d'un tenant précis, et démonstration que les données d'un client ne sont jamais mélangées à celles d'un autre. À l'inverse, une isolation bâclée complique fortement ces réponses en cas de demande d'un client ou d'un contrôle.

Quand faire appel à un accompagnement extérieur

Le choix entre ces trois modèles dépend de votre nombre de clients actuel, de votre trajectoire de croissance et de la sensibilité des données traitées. Une PME qui lance un SaaS métier n'a pas les mêmes contraintes qu'un éditeur visant plusieurs centaines de comptes. Se faire accompagner sur ce choix structurant, avant d'écrire la première ligne de code de production, évite une réécriture douloureuse plus tard. C'est un sujet que nous traitons systématiquement dans nos missions de développement de logiciel SaaS, en lien avec nos autres expertises en développement web et applicatif.

En pratique

Si votre SaaS grandit et que vous n'êtes plus sûr que votre isolation des données tiendra la charge, mieux vaut auditer l'architecture maintenant plutôt qu'après un incident client. Contactez-nous pour évaluer ensemble le modèle multi-tenant le plus adapté à votre trajectoire, sans sur-ingénierie ni promesse de solution miracle.

Questions fréquentes

En multi-instance, chaque client dispose de sa propre installation complète de l'application (parfois sur son propre serveur). En multi-tenant, une seule application sert tous les clients, avec une isolation logique des données. Le multi-tenant est généralement plus économique à grande échelle, le multi-instance plus simple à isoler mais plus coûteux à maintenir.

C'est possible mais rarement simple : il faut ajouter une notion de tenant à chaque table, revoir les requêtes et sécuriser l'accès aux données. Une migration progressive, table par table, avec des tests de non-régression ciblés sur l'isolation, est plus réaliste qu'une réécriture complète.

Le RLS réduit fortement le risque d'erreur humaine dans le filtrage des données, mais il doit être complété par des tests automatisés, une gestion rigoureuse des accès et une surveillance des requêtes. Ce n'est pas un dispositif isolé, mais une brique parmi d'autres dans la sécurité applicative.