SaaS ഡാറ്റാബേസ് ആർക്കിടെക്ചർ രൂപകൽപ്പന ചെയ്യുമ്പോൾ
നിങ്ങളുടെ ആദ്യ ആഴ്ചയിലെ മോശം ഡാറ്റാബേസ് തീരുമാനങ്ങൾ വർഷങ്ങളോളം നിങ്ങളെ വേട്ടയാടും.
മൾട്ടി-ടെനൻസി (multi-tenancy), ബില്ലിംഗ്, വളർച്ച എന്നിവ കൈകാര്യം ചെയ്യാൻ കഴിയുന്ന ഒരു സ്കീമയാണ് ഒരു SaaS സ്ഥാപകന് ആവശ്യം. നിങ്ങൾ ഇത് തെറ്റായി ചെയ്താൽ, ആറ് മാസത്തിനുള്ളിൽ നിങ്ങളുടെ മുഴുവൻ സിസ്റ്റവും വീണ്ടും എഴുതേണ്ടി വരും.
ഒരു പ്രൊഡക്ഷൻ-റെഡി (production-ready) സ്കീം എങ്ങനെ നിർമ്മിക്കാം എന്ന് ഇതാ:
1. നിങ്ങളുടെ ടെനന്റ് സ്ട്രാറ്റജി (Tenant Strategy) തിരഞ്ഞെടുക്കുക
ഉപഭോക്താക്കൾക്കിടയിലെ ഡാറ്റ നിങ്ങൾ വേർതിരിച്ചു നിർത്തണം.
• Row-level (Shared DB): കുറഞ്ഞ സങ്കീർണ്ണത. മിക്ക സ്റ്റാർട്ടപ്പുകൾക്കും അനുയോജ്യം. ഓരോ ക്വറിയിലും (query) WHERE organization_id = ? എന്ന ഫിൽട്ടർ ഉപയോഗിക്കുക.
• Schema-level (Separate Schemas): ഇടത്തരം സങ്കീർണ്ണത. റെഗുലേറ്ററി ആവശ്യങ്ങൾക്ക് നല്ലത്.
• Database-level (Separate DBs): ഉയർന്ന സങ്കീർണ്ണത. എന്റർപ്രൈസ് ക്ലയന്റുകൾക്ക് ഏറ്റവും അനുയോജ്യം.
പുതിയ ഉൽപ്പന്നങ്ങളിൽ 90% ശതമാനത്തിനും Row-level multi-tenancy ആണ് ശരിയായ തിരഞ്ഞെടുപ്പ്.
2. ശരിയായ എൻ്റിറ്റി ഹൈരാർക്കി (Entity Hierarchy)
ഉപയോക്താക്കളെ (Users) നേരിട്ട് ബില്ല് ചെയ്യരുത്. ഉപയോക്താക്കൾ വരികയും പോവുകയും ചെയ്തേക്കാം. എന്നാൽ ഓർഗനൈസേഷനുകൾ (Organizations) നിലനിൽക്കും.
ഹൈരാർക്കി ഇപ്രകാരമായിരിക്കണം: User ── MemberOf ── Organization ── Subscription ── Invoice
• Users: ഐഡന്റിറ്റിക്കായി മാത്രം ഈ ടേബിൾ ഉപയോഗിക്കുക. ആക്രമണങ്ങൾ തടയാൻ UUIDs ഉപയോഗിക്കുക. • Organizations: ഇതാണ് നിങ്ങളുടെ ടെനന്റ് അതിര് (tenant boundary). സബ്സ്ക്രിപ്ഷനുകളെ എപ്പോഴും ഓർഗനൈസേഷനുമായി ബന്ധിപ്പിക്കുക. • Memberships: ഉപയോക്താക്കളെ ഓർഗനൈസേഷനുകളുമായി ബന്ധിപ്പിക്കാൻ ഒരു join table ഉപയോഗിക്കുക. റോൾ (roles) ഇവിടെ സൂക്ഷിക്കുക, യൂസർ ടേബിളിലല്ല.
3. ബില്ലിംഗും സബ്സ്ക്രിപ്ഷനുകളും
is_active പോലുള്ള ഒരു ലളിതമായ ബൂളിയൻ (boolean) ഒരിക്കലും ഉപയോഗിക്കരുത്. ഇത് ഡാറ്റാ ക്രമക്കേടുകൾക്ക് കാരണമാകും.
സബ്സ്ക്രിപ്ഷനുകൾക്കായി ഒരു സ്റ്റേറ്റ് മെഷീൻ (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. പെർഫോമൻസ് ടിപ്സ് (Performance Tips)
• നിങ്ങളുടെ foreign keys ഇൻഡക്സ് (index) ചെയ്യുക. • നിങ്ങളുടെ status കോളങ്ങൾ ഇൻഡക്സ് ചെയ്യുക. • നിങ്ങളുടെ timestamp കോളങ്ങൾ ഇൻഡക്സ് ചെയ്യുക. • N+1 ക്വറികൾ ഒഴിവാക്കുക. ഓർഗനൈസേഷൻ, സബ്സ്ക്രിപ്ഷൻ ഡാറ്റ ഒരൊറ്റ തവണയിൽ ലഭിക്കാൻ JOINs ഉപയോഗിക്കുക.
ഒരു നല്ല സ്കീം ശരിയായി പ്രവർത്തിക്കുമ്പോൾ അത് ശ്രദ്ധയിൽപ്പെടില്ല. എന്നാൽ അത് പരാജയപ്പെട്ടാൽ വലിയ പ്രത്യാഘാതങ്ങൾ ഉണ്ടാക്കും.
ഓർഗനൈസേഷനായി നിർമ്മിക്കുക. സ്റ്റേറ്റ് മെഷീനുകൾ ഉപയോഗിക്കുക. പണം ഇന്റീജറുകളായി സൂക്ഷിക്കുക.
Optional learning community: https://t.me/GyaanSetuAi
