طراحی معماری پایگاه داده SaaS

تصمیمات اشتباه در مورد پایگاه داده در هفته اول، سال‌ها گریبان‌گیر شما خواهد بود.

یک بنیان‌گذار SaaS به طرحواره‌ای (schema) نیاز دارد که چندمستاجری (multi-tenancy)، صورت‌حساب و رشد را مدیریت کند. اگر اشتباه کنید، مجبور خواهید شد تمام سیستم خود را در عرض شش ماه بازنویسی کنید.

در اینجا نحوه ساخت یک طرحواره آماده برای محیط عملیاتی (production-ready) آورده شده است.

۱. استراتژی مستاجر (Tenant) خود را انتخاب کنید

شما باید داده‌ها را بین مشتریان ایزوله کنید.

• سطح ردیف (Row-level) (پایگاه داده مشترک): پیچیدگی کم. بهترین گزینه برای اکثر استارتاپ‌ها. در هر پرس‌وجو (query) از فیلتر WHERE organization_id = ? استفاده کنید. • سطح طرحواره (Schema-level) (طرحواره‌های مجزا): پیچیدگی متوسط. مناسب برای نیازهای نظارتی و قانونی. • سطح پایگاه داده (Database-level) (پایگاه‌های داده مجزا): پیچیدگی بالا. بهترین گزینه برای مشتریان سازمانی (enterprise).

برای ۹۰٪ محصولات جدید، چندمستاجری در سطح ردیف انتخاب درستی است.

۲. سلسله‌مراتب صحیح موجودیت‌ها (Entity)

مستقیماً از کاربران صورت‌حساب دریافت نکنید. کاربران می‌آیند و می‌روند، اما سازمان‌ها می‌مانند.

سلسله‌مراتب باید به این صورت باشد: User ── MemberOf ── Organization ── Subscription ── Invoice

• کاربران (Users): این جدول را فقط برای احراز هویت نگه دارید. از UUIDها برای جلوگیری از حملات استفاده کنید. • سازمان‌ها (Organizations): این مرز مستاجر شماست. همیشه اشتراک‌ها را به سازمان متصل کنید. • عضویت‌ها (Memberships): از یک جدول واسط (join table) برای اتصال کاربران به سازمان‌ها استفاده کنید. نقش‌ها (roles) را اینجا ذخیره کنید، نه در جدول کاربر.

۳. صورت‌حساب و اشتراک‌ها

هرگز از یک مقدار بولین ساده مانند is_active استفاده نکنید. این کار باعث ایجاد داده‌های نامنظم می‌شود.

برای اشتراک‌ها از یک ماشین حالت (state machine) استفاده کنید. حالت‌های رایج عبارتند از: • trialing • active • past_due • canceled • expired • incomplete

این کار به شما اجازه می‌دهد تا شکست‌های پرداخت و دوره‌های مهلت (grace periods) را بدون نیاز به اصلاح دستی داده‌ها مدیریت کنید.

۴. پول و صورت‌حساب

برای جلوگیری از خطاهای مالی، این قوانین سخت‌گیرانه را رعایت کنید:

• هرگز برای پول از FLOAT یا REAL استفاده نکنید. از اعداد صحیح (integers) برای ذخیره سنت‌ها استفاده کنید. به عنوان مثال، ۲۹.۹۹ دلار تبدیل می‌شود به ۲۹۹۹. • از یک جدول invoice_line_items استفاده کنید. برای گزارش‌های مالیاتی و بازپرداخت‌ها (refunds) به این جدول نیاز دارید. • اگر بر اساس میزان استفاده مشتری از محصولتان هزینه دریافت می‌کنید، از یک جدول usage_events استفاده کنید.

۵. نکات عملکردی (Performance)

• روی کلیدهای خارجی (foreign keys) خود ایندکس‌گذاری کنید. • روی ستون‌های وضعیت (status) خود ایندکس‌گذاری کنید. • روی ستون‌های برچسب زمانی (timestamp) خود ایندکس‌گذاری کنید. • از پرس‌وجوهای 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