Проєктування архітектури баз даних для SaaS

Погані рішення щодо бази даних, прийняті у ваш перший тиждень, переслідуватимуть вас роками.

Засновнику SaaS потрібна схема, яка підтримує мультитенентність, білінг та масштабування. Якщо ви припуститеся помилки, вам доведеться переписувати всю систему через шість місяців.

Ось як побудувати схему, готову до експлуатації (production-ready).

  1. Оберіть стратегію тенантності (Tenant Strategy)

Ви повинні ізолювати дані між клієнтами.

• На рівні рядків (Shared DB): Низька складність. Найкраще підходить для більшості стартапів. Використовуйте фільтр WHERE organization_id = ? у кожному запиті. • На рівні схем (Separate Schemas): Середня складність. Підходить для потреб регуляторів. • На рівні баз даних (Separate DBs): Висока складність. Найкраще для корпоративних клієнтів.

Для 90% нових продуктів мультитенентність на рівні рядків є правильним вибором.

  1. Правильна ієрархія сутностей

Не виставляйте рахунки безпосередньо користувачам. Користувачі приходять і йдуть. Організації залишаються.

Ієрархія має виглядати так: User ── MemberOf ── Organization ── Subscription ── Invoice

• Users: Використовуйте цю таблицю лише для ідентифікації. Використовуйте UUID, щоб запобігти атакам. • Organizations: Це межа вашого тенанта. Завжди прив'язуйте підписки до організації. • Memberships: Використовуйте таблицю зв'язку (join table), щоб пов'язати користувачів з організаціями. Зберігайте ролі тут, а не в таблиці користувачів.

  1. Білінг та підписки

Ніколи не використовуйте простий булевий тип, наприклад is_active. Це створює заплутані дані.

Використовуйте машину станів (state machine) для підписок. Поширені стани включають: • trialing • active • past_due • canceled • expired • incomplete

Це дозволяє обробляти помилки оплати та пільгові періоди (grace periods) без ручного виправлення даних.

  1. Гроші та інвойси

Дотримуйтесь цих суворих правил, щоб уникнути фінансових помилок:

• Ніколи не використовуйте FLOAT або REAL для грошей. Використовуйте цілі числа (integers) для зберігання центів. Наприклад, $29.99 перетворюється на 2999. • Використовуйте таблицю invoice_line_items. Вона необхідна для податкових звітів та повернення коштів. • Використовуйте таблицю usage_events, якщо ви стягуєте плату залежно від того, наскільки активно клієнт використовує ваш продукт.

  1. Поради щодо продуктивності

• Індексуйте ваші зовнішні ключі (foreign keys). • Індексуйте ваші колонки статусів. • Індексуйте ваші колонки з мітками часу (timestamps). • Уникайте запитів N+1. Використовуйте JOIN, щоб отримати дані про організацію та підписку за один запит.

Хороша схема непомітна, коли вона працює. Вона стає катастрофою, коли ламається.

Будуйте для організації. Використовуйте машини станів. Зберігайте гроші як цілі числа.

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

Optional learning community: https://t.me/GyaanSetuAi