Projektowanie architektury bazy danych SaaS
Złe decyzje dotyczące bazy danych podjęte w pierwszym tygodniu będą Cię prześladować przez lata.
Założyciel SaaS potrzebuje schematu, który obsługuje wielonajemność (multi-tenancy), rozliczenia i wzrost. Jeśli popełnisz błąd, będziesz musiał przepisać cały system w ciągu sześciu miesięcy.
Oto jak zbudować schemat gotowy do produkcji.
- Wybierz strategię najemcy (tenant strategy)
Musisz izolować dane między klientami.
• Na poziomie wiersza (Shared DB): Niska złożoność. Najlepsze dla większości startupów. Używaj filtra WHERE organization_id = ? w każdym zapytaniu.
• Na poziomie schematu (Separate Schemas): Średnia złożoność. Dobre dla potrzeb regulacyjnych.
• Na poziomie bazy danych (Separate DBs): Wysoka złożoność. Najlepsze dla klientów korporacyjnych (enterprise).
Dla 90% nowych produktów wielonajemność na poziomie wiersza jest właściwym wyborem.
- Poprawna hierarchia encji
Nie fakturowaj użytkowników bezpośrednio. Użytkownicy przychodzą i odchodzą. Organizacje zostają.
Hierarchia powinna wyglądać następująco: User ── MemberOf ── Organization ── Subscription ── Invoice
• Users: Zachowaj tę tabelę wyłącznie do celów tożsamości. Używaj UUID, aby zapobiegać atakom. • Organizations: To jest granica Twojego najemcy. Zawsze łącz subskrypcje z organizacją. • Memberships: Użyj tabeli łączącej (join table), aby powiązać użytkowników z organizacjami. Przechowuj role tutaj, a nie w tabeli użytkowników.
- Rozliczenia i subskrypcje
Nigdy nie używaj prostego typu boolean, takiego jak is_active. Tworzy to nieuporządkowane dane.
Użyj automatu skończonego (state machine) dla subskrypcji. Typowe stany obejmują: • trialing • active • past_due • canceled • expired • incomplete
Pozwala to na obsługę niepowodzeń płatności i okresów karencji bez konieczności ręcznej naprawy danych.
- Pieniądze i fakturowanie
Przestrzegaj tych surowych zasad, aby uniknąć błędów finansowych:
• Nigdy nie używaj FLOAT ani REAL do przechowywania pieniędzy. Używaj liczb całkowitych (integers) do przechowywania centów. Na przykład $29.99 staje się 2999.
• Użyj tabeli invoice_line_items. Będziesz jej potrzebować do raportów podatkowych i zwrotów.
• Użyj tabeli usage_events, jeśli pobierasz opłaty na podstawie tego, jak bardzo klient korzysta z Twojego produktu.
- Wskazówki dotyczące wydajności
• Indeksuj klucze obce (foreign keys).
• Indeksuj kolumny statusu.
• Indeksuj kolumny z sygnaturą czasową (timestamp).
• Unikaj zapytań N+1. Używaj JOIN, aby pobrać dane organizacji i subskrypcji w jednym zapytaniu.
Dobry schemat jest niewidoczny, gdy działa. Jest katastrofalny, gdy zawodzi.
Buduj z myślą o organizacji. Używaj automatów skończonych. Przechowuj pieniądze jako liczby całkowite.
Opcjonalna społeczność edukacyjna: https://t.me/GyaanSetuAi
