Het ontwerpen van SaaS-databasearchitectuur
Slechte databasebeslissingen in je eerste week zullen je jarenlang achtervolgen.
Een SaaS-oprichter heeft een schema nodig dat multi-tenancy, facturering en groei aankan. Als je het fout doet, moet je binnen zes maanden je hele systeem herschrijven.
Hier lees je hoe je een productiebestendig schema bouwt.
- Kies je tenant-strategie
Je moet gegevens tussen klanten isoleren.
• Row-level (gedeelde DB): Lage complexiteit. Beste keuze voor de meeste startups. Gebruik een WHERE organization_id = ? filter bij elke query. • Schema-level (aparte schema's): Gemiddelde complexiteit. Goed voor regelgevende vereisten. • Database-level (aparte DB's): Hoge complexiteit. Beste keuze voor enterprise-klanten.
Voor 90% van de nieuwe producten is row-level multi-tenancy de juiste keuze.
- De juiste entiteitshierarchie
Factureer gebruikers niet rechtstreeks. Gebruikers komen en gaan. Organisaties blijven.
De hiërarchie zou er zo uit moeten zien: User ── MemberOf ── Organization ── Subscription ── Invoice
• Users: Gebruik deze tabel alleen voor identiteit. Gebruik UUID's om aanvallen te voorkomen. • Organizations: Dit is de grens van je tenant. Koppel abonnementen altijd aan de organisatie. • Memberships: Gebruik een join-tabel om gebruikers aan organisaties te koppelen. Sla rollen hier op, niet in de gebruikers-tabel.
- Facturering en abonnementen
Gebruik nooit een simpele boolean zoals is_active. Dit zorgt voor rommelige data.
Gebruik een state machine voor abonnementen. Veelvoorkomende statussen zijn onder andere: • trialing • active • past_due • canceled • expired • incomplete
Hiermee kun je betalingsmislukkingen en coulanceperiodes afhandelen zonder handmatige datacorrecties.
- Geld en facturering
Volg deze strikte regels om financiële fouten te voorkomen:
• Gebruik nooit FLOAT of REAL voor geld. Gebruik integers om centen op te slaan. Bijvoorbeeld: $29.99 wordt 2999. • Gebruik een invoice_line_items tabel. Dit heb je nodig voor belastingrapportages en terugbetalingen. • Gebruik een usage_events tabel als je factureert op basis van het gebruik van je product door een klant.
- Tips voor prestaties
• Indexeer je foreign keys. • Indexeer je statuskolommen. • Indexeer je timestamp-kolommen. • Vermijd N+1 queries. Gebruik JOINs om organisatie- en abonnementgegevens in één keer op te halen.
Een goed schema is onzichtbaar als het werkt. Het is catastrofaal als het faalt.
Bouw voor de organisatie. Gebruik state machines. Sla geld op als integers.
Optionele leercommunity: https://t.me/GyaanSetuAi
