تصميم بنية قواعد بيانات SaaS

القرارات السيئة المتعلقة بقواعد البيانات في أسبوعك الأول ستطاردك لسنوات.

يحتاج مؤسس SaaS إلى مخطط (schema) يتعامل مع تعدد المستأجرين (multi-tenancy)، والفوترة، والنمو. إذا أخطأت في ذلك، فستضطر لإعادة كتابة نظامك بالكامل في غضون ستة أشهر.

إليك كيفية بناء مخطط جاهز للإنتاج.

  1. اختر استراتيجية المستأجر (Tenant Strategy)

يجب عليك عزل البيانات بين العملاء.

• على مستوى الصف (Row-level) (قاعدة بيانات مشتركة): تعقيد منخفض. الأفضل لمعظم الشركات الناشئة. استخدم فلتر WHERE organization_id = ? في كل استعلام. • على مستوى المخطط (Schema-level) (مخططات منفصلة): تعقيد متوسط. جيد للمتطلبات التنظيمية. • على مستوى قاعدة البيانات (Database-level) (قواعد بيانات منفصلة): تعقيد عالٍ. الأفضل لعملاء الشركات الكبرى (enterprise).

بالنسبة لـ 90% من المنتجات الجديدة، فإن تعدد المستأجرين على مستوى الصف هو الخيار الصحيح.

  1. التسلسل الهرمي الصحيح للكيانات (Entity Hierarchy)

لا تقم بفوترة المستخدمين مباشرة. المستخدمون يأتون ويذهبون، أما المؤسسات فتبقى.

يجب أن يبدو التسلسل الهرمي كالتالي: مستخدم (User) ── عضو في (MemberOf) ── مؤسسة (Organization) ── اشتراك (Subscription) ── فاتورة (Invoice)

• المستخدمون (Users): احتفظ بهذا الجدول للهوية فقط. استخدم UUIDs لمنع الهجمات. • المؤسسات (Organizations): هذا هو حد المستأجر الخاص بك. اربط الاشتراكات دائمًا بالمؤسسة. • العضويات (Memberships): استخدم جدول ربط (join table) لربط المستخدمين بالمؤسسات. قم بتخزين الأدوار (roles) هنا، وليس في جدول المستخدمين.

  1. الفوترة والاشتراكات

لا تستخدم أبدًا قيمة منطقية (boolean) بسيطة مثل is_active. فهذا يؤدي إلى بيانات فوضوية.

استخدم آلة حالة (state machine) للاشتراكات. تشمل الحالات الشائعة ما يلي: • تجريبي (trialing) • نشط (active) • متأخر عن السداد (past_due) • ملغى (canceled) • منتهي الصلاحية (expired) • غير مكتمل (incomplete)

يتيح لك ذلك التعامل مع فشل الدفع وفترات السماح دون الحاجة إلى إصلاحات يدوية للبيانات.

  1. الأموال والفواتير

اتبع هذه القواعد الصارمة لتجنب الأخطاء المالية:

• لا تستخدم أبدًا FLOAT أو REAL للأموال. استخدم الأعداد الصحيحة (integers) لتخزين السنتات. على سبيل المثال، 29.99 دولارًا تصبح 2999. • استخدم جدول invoice_line_items. ستحتاج إلى هذا لتقارير الضرائب وعمليات استرداد الأموال. • استخدم جدول usage_events إذا كنت تفرض رسومًا بناءً على مدى استخدام العميل لمنتجك.

  1. نصائح للأداء

• قم بإنشاء فهارس (index) للمفاتيح الخارجية (foreign keys). • قم بإنشاء فهارس لأعمدة الحالة (status columns). • قم بإنشاء فهارس لأعمدة الطابع الزمني (timestamp columns). • تجنب استعلامات N+1. استخدم JOINs للحصول على بيانات المؤسسة والاشتراك في استعلام واحد.

المخطط الجيد يكون غير مرئي عندما يعمل، ولكنه يكون كارثيًا عندما يفشل.

ابنِ من أجل المؤسسة. استخدم آلات الحالة (state machines). قم بتخزين الأموال كأعداد صحيحة (integers).

المصدر: https://dev.to/feidou/designing-saas-database-architecture-users-organizations-subscriptions-and-billing-df

مجتمع تعليمي اختياري: https://t.me/GyaanSetuAi