SaaS डेटाबेस आर्किटेक्चर डिजाइन करना
आपके पहले सप्ताह में लिए गए डेटाबेस के गलत निर्णय आपको वर्षों तक परेशान करेंगे।
एक SaaS फाउंडर को ऐसे स्कीमा की आवश्यकता होती है जो मल्टी-टेनेंसी (multi-tenancy), बिलिंग और विकास को संभाल सके। यदि आप इसमें गलती करते हैं, तो आपको छह महीने में अपना पूरा सिस्टम फिर से लिखना होगा।
यहाँ बताया गया है कि प्रोडक्शन-रेडी (production-ready) स्कीमा कैसे बनाया जाए।
1. अपनी टेनेंट रणनीति (Tenant Strategy) चुनें
आपको ग्राहकों के बीच डेटा को अलग (isolate) करना चाहिए।
• रो-लेवल (Row-level) (Shared DB): कम जटिलता। अधिकांश स्टार्टअप्स के लिए सबसे अच्छा। हर क्वेरी पर WHERE organization_id = ? फ़िल्टर का उपयोग करें।
• स्कीमा-लेवल (Schema-level) (Separate Schemas): मध्यम जटिलता। नियामक (regulatory) आवश्यकताओं के लिए अच्छा।
• डेटाबेस-लेवल (Database-level) (Separate DBs): उच्च जटिलता। एंटरप्राइज क्लाइंट्स के लिए सबसे अच्छा।
90% नए उत्पादों के लिए, रो-लेवल मल्टी-टेनेंसी ही सही विकल्प है।
2. सही एंटिटी पदानुक्रम (Entity Hierarchy)
उपयोगकर्ताओं को सीधे बिल न करें। उपयोगकर्ता आते-जाते रहते हैं। संगठन (Organizations) बने रहते हैं।
पदानुक्रम ऐसा दिखना चाहिए: User ── MemberOf ── Organization ── Subscription ── Invoice
• Users: इस टेबल को केवल पहचान (identity) के लिए रखें। हमलों से बचने के लिए UUIDs का उपयोग करें। • Organizations: यह आपकी टेनेंट सीमा (tenant boundary) है। सब्सक्रिप्शन को हमेशा संगठन से जोड़ें। • Memberships: उपयोगकर्ताओं को संगठनों से जोड़ने के लिए एक जॉइन टेबल (join table) का उपयोग करें। भूमिकाएँ (roles) यहाँ स्टोर करें, यूजर टेबल पर नहीं।
3. बिलिंग और सब्सक्रिप्शन
कभी भी is_active जैसा साधारण boolean उपयोग न करें। इससे डेटा अव्यवस्थित (messy) हो जाता है।
सब्सक्रिप्शन के लिए स्टेट मशीन (state machine) का उपयोग करें। सामान्य स्टेट्स में शामिल हैं:
• trialing
• active
• past_due
• canceled
• expired
• incomplete
यह आपको मैन्युअल डेटा सुधार के बिना भुगतान विफलताओं और ग्रेस पीरियड (grace periods) को संभालने की अनुमति देता है।
4. पैसा और इनवॉइसिंग
वित्तीय त्रुटियों से बचने के लिए इन सख्त नियमों का पालन करें:
• पैसे के लिए कभी भी FLOAT या REAL का उपयोग न करें। सेंट्स (cents) स्टोर करने के लिए पूर्णांक (integers) का उपयोग करें। उदाहरण के लिए, $29.99 बदलकर 2999 हो जाएगा।
• एक invoice_line_items टेबल का उपयोग करें। टैक्स रिपोर्ट और रिफंड के लिए आपको इसकी आवश्यकता होगी।
• यदि आप इस आधार पर शुल्क लेते हैं कि ग्राहक आपके उत्पाद का कितना उपयोग करता है, तो usage_events टेबल का उपयोग करें।
5. परफॉरमेंस टिप्स
• अपनी फॉरेन कीज़ (foreign keys) को इंडेक्स करें।
• अपने स्टेटस कॉलम को इंडेक्स करें।
• अपने टाइमस्टैम्प कॉलम को इंडेक्स करें।
• N+1 क्वेरीज़ से बचें। संगठन और सब्सक्रिप्शन डेटा को एक ही बार में प्राप्त करने के लिए JOIN का उपयोग करें।
एक अच्छा स्कीमा काम करते समय अदृश्य होता है। विफल होने पर यह विनाशकारी होता है।
संगठन के लिए निर्माण करें। स्टेट मशीन का उपयोग करें। पैसे को पूर्णांक (integers) के रूप में स्टोर करें।
वैकल्पिक लर्निंग कम्युनिटी: https://t.me/GyaanSetuAi
