Mandantenfähig ab Tag eins: die Entscheidungen ohne Rückweg
Datenisolation, Fremdschlüssel und Migrationen: warum nachträgliche Mandantenfähigkeit zehnmal teurer ist.
Geschrieben von KillaQ
Manche Architekturentscheidungen lassen sich an einem Nachmittag umdrehen. Andere prägen das Produkt über Jahre. In einem SaaS gehört das Mandantenmodell eindeutig zur zweiten Gruppe.
Der Fehler, der vernünftig klingt
„Wir starten mit einem Kunden und ergänzen Mandantenfähigkeit später." Das klingt umsichtig, bedeutet aber: Jede Tabelle entsteht ohne Mandantenspalte, jede Abfrage ohne Filter, jeder Fremdschlüssel ohne Zugehörigkeitsbedingung. Wenn der zweite Kunde kommt, ist die Migration nicht das Hinzufügen einer Spalte — sie ist ein Audit jeder Abfrage im System mit dem Nachweis, dass keine die Grenze überschreitet.
Isolation: drei Modelle
- Gemeinsame Zeilen mit Diskriminator. Eine
tenantId-Spalte in jeder Tabelle. Am einfachsten zu betreiben und am günstigsten zu skalieren. Verlangt absolute Disziplin: Keine Abfrage darf ungefiltert laufen. - Schema pro Mandant. Stärkere Isolation und getrennte Backups — dafür Migrationen, die N-mal ausgeführt werden müssen.
- Datenbank pro Mandant. Maximale Isolation. Nur sinnvoll bei wenigen großen Kunden oder wenn Regulierung es verlangt.
Für die meisten Produkte sind gemeinsame Zeilen die richtige Antwort — vorausgesetzt, der Filter hängt nicht davon ab, dass jemand daran denkt.
Der Filter darf nicht optional sein
Der Unterschied zwischen einem sicheren System und einem, das irgendwann Daten zwischen Kunden preisgibt, liegt darin, wo der Filter lebt. Liegt er in jedem einzelnen Service, schreibt irgendwann jemand die Abfrage, die ihn umgeht.
Platzieren Sie ihn dort, wo er nicht vergessen werden kann: in der Datenzugriffsschicht, im Request-Kontext oder direkt in der Datenbank per Row-Level Security. Und ergänzen Sie einen Test, der fehlschlägt, sobald eine Abfrage ohne Mandantenbedingung auftaucht.
Auch Fremdschlüssel haben Mandanten
Ein leicht übersehenes Detail: Wenn Rechnung zu Kunde gehört und beide eine tenantId tragen, muss der Fremdschlüssel garantieren, dass beide zum selben Mandanten gehören. Ohne diese zusammengesetzte Bedingung genügt eine schlecht validierte ID in einem Formular, um einen Datensatz des einen Mandanten an einen anderen zu hängen.
Was warten kann
Nicht alles muss am ersten Tag existieren. Abrechnung pro Mandant, Tarife, Nutzungslimits und das Admin-Panel können später kommen, ohne strukturelle Kosten. Die Isolation nicht.