data101

4. İleri NoSQL

4.7 Veri Modelleme En İyi Uygulamaları

NoSQL veritabanları, şemasız yapısıyla esneklik sunsa da veri modelleme stratejileri performans, ölçeklenebilirlik ve bakım kolaylığı açısından büyük önem taşır.

4.7.1 Gömme ve Referans

db.blogYazilari.insertOne({
    baslik: "Embedding Post",
    icerik: "This is a post with embedded comments.",
    yorumlar: [
      { yazar: "Mehmet", icerik: "Nice post!" },
      { yazar: "Ayşe", icerik: "Great post!" }
    ]
})
db.sosyalAgKullanicilar.insertOne({
    ad: "Mehmet",
    arkadaslar: [
      ObjectId("5f7b1b3b9b3b3d1b3b3b3b3b"),
      ObjectId("5f7b1b3b9b3b3d1b3b3b3b3c")
    ]
})

db.sosyalAgKullanicilar.insertOne({
    ad: "Ayşe",
    arkadaslar: [
      ObjectId("5f7b1b3b9b3b3d1b3b3b3b3a"),
      ObjectId("5f7b1b3b9b3b3d1b3b3b3b3b")
    ]
})

4.7.2 Şema Tasarım Desenleri

MongoDB veri modellemesinde yaygın olarak kullanılan bazı desenler vardır. Her desen, belirli bir kullanım senaryosuna hitap eder.

4.7.3.1 Attribute Pattern

Tanım: Esnek sayıda özelliği tek bir belge içinde yönetmek için kullanılır. Kullanım: Ürün özellikleri, kullanıcı tercihlerinin dinamik olarak değişebildiği durumlar.

{
  "_id": 1,
  "urunAdi": "Akıllı Telefon",
  "ozellikler": {
    "renk": "kırmızı",
    "bellek": "8GB",
    "kamera": "108MP"
  }
}

Avantaj: Şema değişikliklerine karşı esneklik. Dezavantaj: Sorgularda dinamik alan isimleri kullanımı karmaşıklık yaratabilir.

4.7.3.2 Bucket Pattern

Tanım: Zaman serisi veya benzer nitelikteki verileri mantıksal gruplar halinde saklamak. Kullanım: Sensör verileri, log kayıtları, metrikler.

{
  "sensorId": 42,
  "gun": "2024-04-10",
  "degerler": [
    { "saat": "10:00", "sicaklik": 23.5 },
    { "saat": "11:00", "sicaklik": 24.0 }
  ]
}

Avantaj: Büyük veri setlerinde toplu sorguların hızlanması.
Dezavantaj: Güncellemeler ve eklemeler daha karmaşık hale gelebilir.

4.7.3.3 Polymorphic Pattern

Tanım: Aynı koleksiyonda farklı yapıda belgeleri saklama.
Kullanım Durumu: Farklı tipte içerik öğeleri (kitap, dergi, blog yazısı) tek bir icerikler koleksiyonunda tutulabilir.
Avantaj: Tüm içerik tiplerine tek bir uç noktadan erişim.
Dezavantaj: Sorgularda tip filtrelemesi gerekebilir, veri bütünlüğü kontrolü zorlaşabilir.

4.7.3.4 Referans Pattern

Tanım: Verileri ayrı koleksiyonlarda tutup referanslar kullanarak bağlama.
Kullanım Durumu: Çok-çok ilişkiler, büyük boyutlu ilişkili veriler, kullanıcı - yorum, ürün - kategori ilişkileri.
Avantaj: Depolama tasarrufu, veri tekrarının önlenmesi.
Dezavantaj: İlişkili verilere erişirken ek sorgu masrafı.

4.7.3.5 Hybrid Pattern (Hibrit Yapı)

Tanım: Hem gömme hem de referanslamayı bir arada kullanmak.
Kullanım Durumu: En sık erişilen verileri göm, geri kalanını referansla. Örneğin bir forum sisteminde, son 5 mesajı konu belgesine göm, daha eski mesajları ayrı bir koleksiyonda tut.
Avantaj: Sık erişilen verilere hızlı erişim, veri artarken sürdürülebilirlik.
Dezavantaj: Karmaşıklık artar, güncellemeler dikkat ister.

4.7.4 Denormalizasyon ve Normalizasyon Dengesi

Normalizasyon: Geleneksel veri tabanlarından aşina olduğumuz, veri tekrarını en aza indirme yaklaşımıdır.

4.7.5 Sharding ile Uyumlu Modelleme

Eğer veriniz büyüdükçe sharding kullanacaksanız, veri modelinizin shard anahtarını desteklemesi gerekir.

Örneğin, kullanıcı bazlı bir sosyal medya uygulamasında kullanici_id shard anahtarı seçilmişse, gönderileri de kullanici_id alanıyla partition etmek mantıklıdır. Böylece belirli bir kullanıcının gönderilerini sorgularken tüm shard’ları gezmek yerine tek bir shard üzerinde çalışabilirsiniz.

4.7.7 Örnek Senaryolar

  1. Blog Uygulaması:
    • Yazı ve yorumlar ilişkiniz var. Yorum sayısı çok fazla ve sürekli artıyor.
    • Strateji: Yazı belgesine en son 3 yorumu gömün, tüm yorumları ayrı bir koleksiyonda tutun. Bu sayede yazıya hızlı erişim ve sınırlı yer tutan gömülmüş yorumlar elde ederken, eski yorumlara $lookup ile ulaşırsınız.
    • Avantaj: Hızlı okuma, esnek sorgu.
  2. E-Ticaret Ürün Kataloğu:
    • Her ürünün binlerce özelliği (renk, ebat, marka, vb.) olabilir.
    • Strateji: Attribute pattern kullanarak değişken özellikleri bir ozellikler alanında saklayın. Bu sayede yeni özellik eklemek kolaylaşır. Sık sorgulanan kategoriler için ise ayrı bir koleksiyon tutup ürün belgelerinden referans verin.
    • Avantaj: Esnek yapı, kategoriler değiştikçe ürün verisini minimal güncellemeyle yönetme.
  3. Log Analizi ve Zaman Serisi Verileri:
    • Milyonlarca log girişi sürekli akıyor.
    • Strateji: Bucket pattern ile günlük log verilerini tek bir belgede gruplandırın. Böylece belirli bir günün loglarını sorgulamak daha verimli hale gelir.
    • Avantaj: Zaman bazlı sorgularda performans, depolama optimizasyonu.

      4.7.8 En İyi Uygulamaların Özeti

      - **Sorgu Odaklı Tasarım:** En sık yapılan sorgularınıza göre veri modelini şekillendirin.
      - **Doğru Denge:** Gömme vs. Referanslama, Normalizasyon vs. Denormalizasyon dengesini uygulama ihtiyaçlarınıza göre belirleyin.
      - **Şema Desenlerini Bilin:** Attribute, Bucket, Polymorphic, Reference, Hybrid gibi desenleri ihtiyaçlarınıza göre kullanın.
      - **Sharding’i Erken Planlayın:** Shard anahtarınızla uyumlu bir veri modeli kurgulayın.
      - **İndeksleri Unutmayın:** Sorgu performansını destekleyecek indeksleri ekleyin.
      - **Esneklik vs. Disiplin:** Her ne kadar şemasız bir yapı olsa da, alan adlarında, veri tiplerinde ve dokümantasyonda tutarlılığı elden bırakmayın.
      - **Versiyonlama ve Evrim:** Şemanız zamanla değişebilir, buna hazırlıklı olun. Gerekirse belge versiyonlama stratejileri uygulayın.