Entwurf einer SaaS-Datenbankarchitektur

Schlechte Datenbankentscheidungen in deiner ersten Woche werden dich jahrelang verfolgen.

Ein SaaS-Gründer benötigt ein Schema, das Mandantenfähigkeit (Multi-Tenancy), Abrechnung und Wachstum bewältigt. Wenn du es falsch machst, wirst du dein gesamtes System in sechs Monaten neu schreiben müssen.

So erstellst du ein produktionsreifes Schema.

  1. Wähle deine Mandantenstrategie

Du musst die Daten zwischen den Kunden isolieren.

• Zeilenebene (Shared DB): Geringe Komplexität. Am besten für die meisten Startups. Verwende bei jeder Abfrage einen WHERE organization_id = ?-Filter. • Schema-Ebene (Separate Schemas): Mittlere Komplexität. Gut für regulatorische Anforderungen. • Datenbank-Ebene (Separate DBs): Hohe Komplexität. Am besten für Enterprise-Kunden.

Für 90 % aller neuen Produkte ist Mandantenfähigkeit auf Zeilenebene die richtige Wahl.

  1. Die korrekte Entitätshierarchie

Stelle Nutzern nicht direkt in Rechnung. Nutzer kommen und gehen. Organisationen bleiben.

Die Hierarchie sollte so aussehen: User ── MemberOf ── Organization ── Subscription ── Invoice

• Users: Behalte diese Tabelle nur für die Identität. Verwende UUIDs, um Angriffe zu verhindern. • Organizations: Dies ist deine Mandantengrenze. Verknüpfe Abonnements immer mit der Organisation. • Memberships: Verwende eine Verknüpfungstabelle (Join Table), um Nutzer mit Organisationen zu verknüpfen. Speichere Rollen hier und nicht in der User-Tabelle.

  1. Abrechnung und Abonnements

Verwende niemals ein einfaches Boolean wie is_active. Das führt zu unübersichtlichen Daten.

Verwende eine State Machine für Abonnements. Gängige Zustände sind: • trialing • active • past_due • canceled • expired • incomplete

Dies ermöglicht es dir, Zahlungsausfälle und Aufschubfristen (Grace Periods) zu handhaben, ohne manuelle Datenkorrekturen vornehmen zu müssen.

  1. Geld und Rechnungsstellung

Befolge diese strengen Regeln, um Finanzfehler zu vermeiden:

• Verwende niemals FLOAT oder REAL für Geld. Nutze Ganzzahlen (Integers), um Cent-Beträge zu speichern. Zum Beispiel wird $29,99 zu 2999. • Verwende eine invoice_line_items-Tabelle. Du benötigst diese für Steuerberichte und Rückerstattungen. • Verwende eine usage_events-Tabelle, wenn du basierend auf der Nutzung deines Produkts abrechnest.

  1. Performance-Tipps

• Indiziere deine Fremdschlüssel (Foreign Keys). • Indiziere deine Status-Spalten. • Indiziere deine Zeitstempel-Spalten (Timestamp Columns). • Vermeide N+1-Abfragen. Verwende JOINs, um Organisations- und Abonnementdaten in einem Durchgang abzurufen.

Ein gutes Schema ist unsichtbar, wenn es funktioniert. Es ist katastrophal, wenn es versagt.

Baue für die Organisation. Nutze State Machines. Speichere Geld als Ganzzahlen.

Quelle: https://dev.to/feidou/designing-saas-database-architecture-users-organizations-subscriptions-and-billing-df

Optionale Lern-Community: https://t.me/GyaanSetuAi