İçeriğe geç
Muhammet Şafak
en
Soran: Halil Cevaplandı:

Esnek ürün nitelikleri için NoSQL mu, PostgreSQL mi seçmeliyim?


Soru

Yeni projede esnek bir ürün nitelik sistemi (renk, beden, garanti süresi vb. her üründe farklı) tasarlayacağız. İlişkisel DB'de EAV modeli karmaşık SQL ve performans kaybı getiriyor; NoSQL (MongoDB) şemasız yapısıyla cazip duruyor. ACID gereksinimi, veri tutarlılığı ve raporlama ihtiyacını düşünerek bu iki dünya arasındaki seçimi hangi parametrelere göre yaparım?

Cevap

Kısa cevap: Sırf nitelikler üründen ürüne değişiyor diye MongoDB’ye koşma — bu tam olarak NoSQL tuzağı. PostgreSQL’in JSONB’si üçüncü ve en isabetli yolu sunuyor.

Sorunun kökü gerçek: ilişkisel DB’de EAV modeli (entity-attribute-value) cidden acı verir — devasa join’ler, okunamayan SQL, performans kaybı. Ama bu acı seni doğrudan şemasızlığa itmemeli.

  1. İlişkisel çekirdeği koru. Ürün, fiyat, sipariş, stok — ACID, join ve raporlama istediğin her şey ilişkisel kalsın. Bunlar işinin omurgası; transaction garantisini, foreign key’leri ve JOIN’lı raporları burada kaybetmek istemezsin.
  2. Değişken nitelikleri JSONB’ye koy. Üründen ürüne değişen renk/beden/garanti gibi alanları tek bir JSONB kolonunda tut. Üstüne bir GIN index kur; attributes @> '{"renk":"kırmızı"}' gibi sorgular hızlı çalışır. İhtiyacın olan yerde şema esnekliği, geri kalan her yerde transactional bütünlük elde edersin.
  3. Document NoSQL’i yalnızca tüm domain document ise seç. MongoDB’ye geçmen, ancak tüm erişimin anahtara göre (key-based) olduğu, varlıklar arası transaction/raporlama gerektirmediğin ve bütün domain’in doğası gereği belge şeklinde olduğu durumda mantıklı. Senin senaryonda öyle değil.
  4. Raporlama ihtiyacın tek başına kararı veriyor. Yoğun raporlama gerektiğini söylüyorsun. Veriyi Mongo’ya bölersen bu raporları SQL ile yapamaz, iki ayrı sistemden veri birleştirme derdine düşersin. Bu tek gereksinim bile bölmeye karşı yeterli argüman.

Sonuç: PostgreSQL + variant nitelikler için JSONB (GIN index’li). NoSQL’i yalnızca erişim deseni gerçekten onu zorunlu kılıyorsa düşün. “Şeması yok, kolay olur” diye başlamak, ileride tutarlılık ve raporlama faturasını çok daha ağır ödetir; bu mimari tercihin neden tuzak olduğunu sade.dev’deki yazıda açtım.

İlgili Yazılar

Etiketler: #veritabanı#mimari#postgresql
Paylaş:

Yorumlar

Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.

Diğer Sorular

Tüm sorular

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi