Zum Hauptinhalt springen
KillaQ
Architektur7 Min. Lesezeit

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.

Zurück zum Blog

Verwandte Artikel

Performance6 Min. Lesezeit

Core Web Vitals in Next.js: was zählt und was nicht

LCP, CLS und INP ohne Marketing-Sprech erklärt — und die drei Ursachen der meisten Produktionsprobleme.

Artikel lesen
Mobile5 Min. Lesezeit

Offline-First ist kein Feature, sondern eine Architektur

Wie eine idempotente Schreib-Queue dafür sorgt, dass eine App auch ohne Netz funktioniert.

Artikel lesen