SaaS Veritabanı Mimarisi Tasarlamak
İlk haftanızda verdiğiniz kötü veritabanı kararları yıllarca peşinizi bırakmayacaktır.
Bir SaaS kurucusu; çoklu kiracılığı (multi-tenancy), faturalandırmayı ve büyümeyi yönetebilen bir şemaya ihtiyaç duyar. Eğer yanlış yaparsanız, altı ay içinde tüm sisteminizi yeniden yazmak zorunda kalırsınız.
İşte üretime hazır (production-ready) bir şema oluşturmanın yolu.
- Kiracı (Tenant) Stratejinizi Seçin
Müşteriler arasındaki verileri izole etmelisiniz.
• Satır düzeyinde (Shared DB): Düşük karmaşıklık. Çoğu girişim için en iyisidir. Her sorguda WHERE organization_id = ? filtresini kullanın.
• Şema düzeyinde (Ayrı Şemalar): Orta karmaşıklık. Mevzuat gereksinimleri için uygundur.
• Veritabanı düzeyinde (Ayrı Veritabanları): Yüksek karmaşıklık. Kurumsal müşteriler için en iyisidir.
Yeni ürünlerin %90'ı için satır düzeyinde çoklu kiracılık doğru seçimdir.
- Doğru Varlık (Entity) Hiyerarşisi
Kullanıcılara doğrudan fatura kesmeyin. Kullanıcılar gelir ve gider; organizasyonlar kalıcıdır.
Hiyerarşi şu şekilde görünmelidir: User ── MemberOf ── Organization ── Subscription ── Invoice
• Kullanıcılar (Users): Bu tabloyu yalnızca kimlik için tutun. Saldırıları önlemek için UUID kullanın. • Organizasyonlar (Organizations): Bu sizin kiracı sınırınızdır. Abonelikleri her zaman organizasyona bağlayın. • Üyelikler (Memberships): Kullanıcıları organizasyonlara bağlamak için bir join tablosu kullanın. Rolleri kullanıcı tablosunda değil, burada saklayın.
- Faturalandırma ve Abonelikler
Asla is_active gibi basit bir boolean kullanmayın. Bu, karmaşık verilere yol açar.
Abonelikler için bir durum makinesi (state machine) kullanın. Yaygın durumlar şunlardır: • trialing • active • past_due • canceled • expired • incomplete
Bu, ödeme hatalarını ve ek süreleri (grace periods) manuel veri düzeltmelerine gerek kalmadan yönetmenizi sağlar.
- Para ve Faturalandırma
Finansal hatalardan kaçınmak için bu katı kurallara uyun:
• Para için asla FLOAT veya REAL kullanmayın. Kuruşları saklamak için tam sayıları (integers) kullanın. Örneğin, $29.99 değeri 2999 olur.
• Bir invoice_line_items tablosu kullanın. Vergi raporları ve iadeler için buna ihtiyacınız olacak.
• Eğer müşterinin ürününüzü ne kadar kullandığına bağlı olarak ücretlendiriyorsanız, bir usage_events tablosu kullanın.
- Performans İpuçları
• Foreign key'lerinizi (yabancı anahtarlar) indeksleyin. • Durum (status) sütunlarınızı indeksleyin. • Zaman damgası (timestamp) sütunlarınızı indeksleyin. • N+1 sorgularından kaçının. Organizasyon ve abonelik verilerini tek seferde almak için JOIN kullanın.
İyi bir şema, çalıştığında görünmezdir. Başarısız olduğunda ise felakettir.
Organizasyon için inşa edin. Durum makineleri kullanın. Parayı tam sayı olarak saklayın.
İsteğe bağlı öğrenme topluluğu: https://t.me/GyaanSetuAi
