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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

Źródło: https://dev.to/feidou/designing-saas-database-architecture-users-organizations-subscriptions-and-billing-df

Opcjonalna społeczność edukacyjna: https://t.me/GyaanSetuAi