Designing SaaS Database Architecture
તમારા પ્રથમ સપ્તાહમાં લીધેલા ડેટાબેઝના ખરાબ નિર્ણયો તમને વર્ષો સુધી હેરાન કરશે.
એક SaaS ફાઉન્ડરને એવા સ્કીમાની જરૂર હોય છે જે multi-tenancy, બિલિંગ અને વૃદ્ધિ (growth) ને સંભાળી શકે. જો તમે ભૂલ કરશો, તો તમારે છ મહિનામાં તમારી આખી સિસ્ટમ ફરીથી લખવી પડશે.
પ્રોડક્શન-રેડી સ્કીમા કેવી રીતે બનાવવું તે અહીં છે.
- તમારી ટેનન્ટ સ્ટ્રેટેજી (Tenant Strategy) પસંદ કરો
તમારે ગ્રાહકો વચ્ચેનો ડેટા અલગ રાખવો જોઈએ.
• Row-level (Shared DB): ઓછી જટિલતા. મોટાભાગના સ્ટાર્ટઅપ્સ માટે શ્રેષ્ઠ. દરેક ક્વેરી પર WHERE organization_id = ? ફિલ્ટરનો ઉપયોગ કરો.
• Schema-level (Separate Schemas): મધ્યમ જટિલતા. રેગ્યુલેટરી જરૂરિયાતો માટે સારું.
• Database-level (Separate DBs): ઉચ્ચ જટિલતા. એન્ટરપ્રાઇઝ ક્લાયન્ટ્સ માટે શ્રેષ્ઠ.
90% નવા ઉત્પાદનો માટે, row-level multi-tenancy એ સાચો વિકલ્પ છે.
- સાચું એન્ટિટી હાયરાર્કી (Entity Hierarchy)
યુઝર્સને સીધું બિલ ન કરો. યુઝર્સ આવે છે અને જાય છે. સંસ્થાઓ (Organizations) સ્થિર રહે છે.
હાયરાર્કી આ મુજબ હોવી જોઈએ: User ── MemberOf ── Organization ── Subscription ── Invoice
• Users: આ ટેબલ ફક્ત ઓળખ (identity) માટે રાખો. હુમલાઓ રોકવા માટે UUIDs નો ઉપયોગ કરો. • Organizations: આ તમારી ટેનન્ટ બોર્ડર છે. સબ્સ્ક્રિપ્શનને હંમેશા સંસ્થા (organization) સાથે લિંક કરો. • Memberships: યુઝર્સને સંસ્થાઓ સાથે જોડવા માટે join table નો ઉપયોગ કરો. ભૂમિકાઓ (roles) અહીં સ્ટોર કરો, યુઝર ટેબલમાં નહીં.
- બિલિંગ અને સબ્સ્ક્રિપ્શન (Billing and Subscriptions)
ક્યારેય is_active જેવું સાદું boolean ઉપયોગમાં ન લો. આનાથી ડેટા અસ્તવ્યસ્ત થઈ શકે છે.
સબ્સ્ક્રિપ્શન માટે state machine નો ઉપયોગ કરો. સામાન્ય સ્ટેટ્સમાં શામેલ છે: • trialing • active • past_due • canceled • expired • incomplete
આ તમને મેન્યુઅલ ડેટા ફિક્સ વગર પેમેન્ટ નિષ્ફળતા અને ગ્રેસ પિરિયડને હેન્ડલ કરવાની મંજૂરી આપે છે.
- નાણાં અને ઇનવોઇસિંગ (Money and Invoicing)
નાણાકીય ભૂલો ટાળવા માટે આ કડક નિયમોનું પાલન કરો:
• નાણાં માટે ક્યારેય FLOAT અથવા REAL નો ઉપયોગ કરશો નહીં. સેન્ટ્સ (cents) સ્ટોર કરવા માટે integers નો ઉપયોગ કરો. ઉદાહરણ તરીકે, $29.99 એ 2999 બની જાય છે.
• invoice_line_items ટેબલનો ઉપયોગ કરો. ટેક્સ રિપોર્ટ્સ અને રિફંડ માટે તમારે આની જરૂર પડશે.
• જો તમે ગ્રાહક તમારા ઉત્પાદનનો કેટલો ઉપયોગ કરે છે તેના આધારે ચાર્જ કરો છો, તો usage_events ટેબલનો ઉપયોગ કરો.
- પરફોર્મન્સ ટિપ્સ (Performance Tips)
• તમારી foreign keys ને ઇન્ડેક્સ કરો. • તમારા status columns ને ઇન્ડેક્સ કરો. • તમારા timestamp columns ને ઇન્ડેક્સ કરો. • N+1 queries ટાળો. સંસ્થા અને સબ્સ્ક્રિપ્શન ડેટા એક જ ટ્રિપમાં મેળવવા માટે JOINs નો ઉપયોગ કરો.
જ્યારે તે કામ કરે છે ત્યારે એક સારો સ્કીમા અદ્રશ્ય હોય છે. જ્યારે તે નિષ્ફળ જાય છે ત્યારે તે વિનાશક હોય છે.
સંસ્થા (organization) માટે બનાવો. state machines નો ઉપયોગ કરો. નાણાંને integers તરીકે સ્ટોર કરો.
Optional learning community: https://t.me/GyaanSetuAi
