data101

4. İleri NoSQL

4.7 Veri Modelleme En İyi Uygulamaları

Veri modelleme, bir veritabanının veriyi nasıl depolayacağını, ilişkilendireceğini ve sorgulayacağını belirleyen kritik bir adımdır. MongoDB gibi NoSQL veritabanlarında, esnek şema yapısı sayesinde veri modelleme stratejileri SQL tabanlı veritabanlarına göre farklılık gösterebilir. Bu bölümde, gömme ve referanslama yöntemlerini, şema tasarım desenlerini ve bu stratejilerin avantajlarını ve dezavantajlarını ele alacağız.

4.7.1 Gömme ve Referanslama

MongoDB’de veri modelleme yaparken, ilişkili verileri gömme (embedding) veya referanslama (referencing) yöntemlerinden biriyle saklamayı seçebilirsiniz. Bu iki yaklaşım, veri yapınıza ve uygulamanızın gereksinimlerine bağlı olarak farklı avantajlar sunar.

Gömme (Embedding)

Tanım: Gömme, ilişkili verileri aynı belgede, iç içe yapılar olarak saklama yöntemidir. Bu yöntem, veriyi tek bir yerde toplar ve ilişkili bilgilerin bir arada bulunmasını sağlar.

Avantajları:

Dezavantajları:

Örnek: Bir kullanıcı ve arkadaşlarını aynı belgede gömme:

{
  "isim": "Ahmet",
  "arkadaslar": [
    { "isim": "Mehmet", "yas": 30 },
    { "isim": "Ayşe", "yas": 25 }
  ]
}

Kullanım Durumları:

Referanslama (Referencing)

Tanım: Referanslama, ilişkili verileri ayrı belgelerde veya ayrı koleksiyonlarda tutma yöntemidir. Bu yöntem, belgeler arasında bağlantılar kurarak veri ilişkilerini yönetir.

Avantajları:

Dezavantajları:

Örnek: Bir kullanıcı ve arkadaşlarını referanslama:

// kullanici belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4567"),
  "isim": "Ahmet",
  "arkadaslar": [
    ObjectId("60ad0cedf8d2e30d8c8b4568"),
    ObjectId("60ad0cedf8d2e30d8c8b4569")
  ]
}

// arkadas belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4568"),
  "isim": "Mehmet",
  "yas": 30
}

{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4569"),
  "isim": "Ayşe",
  "yas": 25
}

Kullanım Durumları:

4.7.2 Gömme ve Referanslama Karşılaştırması**

| Özellik | Gömme (Embedding) | Referanslama (Referencing) | |——————-|————————————————————|—————————————————————| | Veri Yapısı | İlişkili veriler aynı belgede iç içe gömülü olarak tutulur | İlişkili veriler ayrı belgelerde veya koleksiyonlarda tutulur | | Okuma Performansı | Tek sorguyla tüm verilere erişim sağlar | Birden fazla sorgu gerekebilir | | Yazma Performansı | İlişkili veriler tek bir belgede güncellenir | İlişkili veriler ayrı belgelerde güncellenir | | Veri Tekrarı | Veri tekrarına yol açabilir | Veri tekrarı önlenir | | Veri Bütünlüğü | Daha kolay korunur | Referanslar yönetilmelidir, veri bütünlüğü karmaşık olabilir | | Esneklik | Daha az esnek | Daha esnek | | Belge Boyutu | Büyük veri setlerinde sorun yaratabilir | Büyük veri setleri için uygundur | 4.7.2.1 Gömme ve Referanslama Kullanım Stratejileri

MongoDB’de en iyi veri modelleme stratejisini belirlemek için, gömme ve referanslama yöntemlerini doğru şekilde kombinlemek önemlidir. Aşağıda, bu stratejilerin nasıl birleştirilebileceğine dair bazı ipuçları ve örnekler bulabilirsiniz.

1. İlişkilerin Doğasına Göre Seçim Yapın

2. Verilerin Sık Kullanım Şeklini Analiz Edin

3. Veri Güncellemelerinin Frekansını Değerlendirin

4.7.3 Şema Tasarım Desenleri

MongoDB’de şema tasarımı yaparken, belirli desenler kullanmak veri organizasyonunu ve performansı optimize etmenize yardımcı olabilir. Bu bölümde, yaygın olarak kullanılan bazı şema tasarım desenlerini ve bunların ne zaman kullanılacağını inceleyeceğiz.

4.7.3.1. Öznitelik Deseni (Attribute Pattern) Tanım: Öznitelik deseni, dinamik ve esnek alanları saklamak için kullanılır. Bu desen, değişken sayıda özellik içerebilen belgeleri yönetmek için idealdir.

Kullanım Amacı:

Örnek:

{
  "urunId": 1,
  "ozellikler": {
    "renk": "kırmızı",
    "boyut": "L",
    "agirlik": "200g"
  }
}

Avantajları:

Dezavantajları:

4.7.3.2. Bucket Deseni Tanım: Bucket deseni, özellikle zaman serisi verileri gibi büyük miktarda veriyi gruplamak için kullanılır. Bu desen, verileri belirli zaman aralıklarına (örneğin, günlük, haftalık) göre gruplandırır ve her grup için bir belge oluşturur.

Kullanım Amacı:

Örnek:

{
  "sensorId": 1,
  "gun": "2023-10-15",
  "degerler": [
    { "saat": "10:00", "deger": 23.5 },
    { "saat": "11:00", "deger": 24.0 },
    // Daha fazla ölçüm değeri
  ]
}

Avantajları:

Dezavantajları:

4.7.3.3. Referans Deseni (Reference Pattern)

Tanım: Referans deseni, verileri ayrı belgelerde veya koleksiyonlarda tutarak ilişkili veriler arasında bağlantılar kurma yöntemidir. Bu desen, ilişkili verilerin bağımsız olarak yönetilmesini sağlar.

Kullanım Amacı:

Örnek:

// kullanici belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4567"),
  "isim": "Ahmet",
  "arkadaslar": [ObjectId("60ad0cedf8d2e30d8c8b4568"), ObjectId("60ad0cedf8d2e30d8c8b4569")]
}

// arkadas belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4568"),
  "isim": "Mehmet",
  "yas": 30
}

{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4569"),
  "isim": "Ayşe",
  "yas": 25
}

Avantajları:

Dezavantajları:

4.7.3.4. Polymorphic Desen (Polymorphic Pattern)

Tanım: Polymorphic desen, farklı türde belgeleri aynı koleksiyonda saklama yöntemidir. Bu desen, farklı veri türlerinin aynı koleksiyonda yönetilmesini sağlar.

Kullanım Amacı:

Örnek:

// Kitap belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b456a"),
  "tur": "kitap",
  "isim": "MongoDB Rehberi",
  "yazar": "Ahmet Yılmaz",
  "sayfaSayisi": 350
}

// Dergi belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b456b"),
  "tur": "dergi",
  "isim": "Teknoloji Haftası",
  "yayinevi": "XYZ Yayıncılık",
  "baskiNo": 45
}

Avantajları:

Dezavantajları:

4.7.3.5. Hybrid Desen (Hibrit Desen)

Tanım: Hibrit desen, gömme ve referanslama yöntemlerini birleştirerek daha karmaşık veri ilişkilerini yönetme stratejisidir. Bu desen, hem veri bütünlüğünü hem de sorgu performansını optimize etmek için kullanılır.

Kullanım Amacı:

Örnek:

// Kullanici belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4567"),
  "isim": "Ahmet",
  "profil": {
    "yas": 30,
    "cinsiyet": "Erkek"
  },
  "arkadaslar": [ObjectId("60ad0cedf8d2e30d8c8b4568"), ObjectId("60ad0cedf8d2e30d8c8b4569")]
}

// Arkadas belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4568"),
  "isim": "Mehmet",
  "yas": 30
}

Avantajları:

Dezavantajları:

4.7.4 Diğer Veri Modelleme En İyi Uygulamaları

Bu alt bölümde, gömme ve referanslama dışında MongoDB’de etkili veri modelleme için kullanılabilecek diğer bazı en iyi uygulamaları ele alacağız.

4.7.4.1. Bileşik Anahtarlar (Compound Keys)

Tanım: Bileşik anahtarlar, birden fazla alanı içeren anahtarları ifade eder. Bu, daha karmaşık veri ilişkilerini yönetmek ve sorgu performansını artırmak için kullanılır.

Kullanım Amacı:

Örnek:

{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b456c"),
  "kullanici_id": 1,
  "urun_id": 1001,
  "siparis_tarihi": ISODate("2024-04-27T12:34:56Z"),
  "adet": 2
}

Avantajları:

Dezavantajları:

4.7.4.2. Denormalizasyon (Denormalization)

Tanım: Denormalizasyon, veriyi normalleştirilmiş yapısında gereksiz kopyalar oluşturarak sorgu performansını artırma yöntemidir. Bu, veriyi belirli durumlarda tekrar etmeyi kabul eder.

Kullanım Amacı:

Örnek: Bir sipariş belgesinde, kullanıcının ismini ve adresini gömme:

{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4570"),
  "siparis_id": 5001,
  "kullanici_id": 1,
  "kullanici_isim": "Ahmet",
  "kullanici_adres": "İstanbul",
  "urunler": [
    { "urun_id": 1001, "isim": "Laptop", "adet": 1 },
    { "urun_id": 1002, "isim": "Mouse", "adet": 2 }
  ],
  "siparis_tarihi": ISODate("2024-04-27T12:34:56Z")
}

Avantajları:

Dezavantajları:

4.7.4.3. Indexed Lookup ve Join Deseni

Tanım: MongoDB’de veriyi join’lemek için $lookup operatörünü kullanarak farklı koleksiyonlardaki verileri ilişkilendirme yöntemidir. Bu desen, ilişkili verilerin birbirine bağlanmasını sağlar.

Kullanım Amacı:

Örnek: Bir kullanıcı ve siparişlerini birleştirme:

db.kullanicilar.aggregate([
  {
    $lookup: {
      from: "siparisler",
      localField: "_id",
      foreignField: "kullanici_id",
      as: "kullanici_siparisleri"
    }
  }
])

Avantajları:

Dezavantajları:

4.7.5 Veri Modelleme Stratejilerini Belirleme

Etkili veri modelleme, uygulamanızın performansını, ölçeklenebilirliğini ve bakım kolaylığını doğrudan etkiler. Aşağıda, veri modelleme stratejilerinizi belirlerken dikkate almanız gereken bazı önemli faktörler bulunmaktadır.

1. Sorgu Analizi Yapın

2. Veri İlişkilerini Anlayın

3. Veri Büyüklüğünü ve Büyüme Hızını Değerlendirin

4. Performans Gereksinimlerini Belirleyin

5. Veri Bütünlüğü ve Tutarlılığını Sağlayın


4.7.6 İleri Düzey Veri Modelleme Teknikleri

Bu alt bölümde, MongoDB’de veri modelleme konusunda daha ileri düzey teknikleri ve stratejileri inceleyeceğiz. Bu teknikler, büyük ve karmaşık veri setlerini yönetirken performansı ve ölçeklenebilirliği optimize etmenize yardımcı olur.

4.7.6.1. Materialized Views (Materyalize Görünümler)

Tanım: Materialized Views, sıkça kullanılan ve hesaplanması zor sorguların sonuçlarını önceden hesaplayarak saklama yöntemidir. Bu, sorgu performansını artırmak için kullanılır.

Kullanım Amacı:

Örnek: Satış verilerinin aylık toplamını materialized view olarak saklamak:

db.sales.aggregate([
  { $group: { _id: { ay: { $month: "$satis_tarihi" }, yil: { $year: "$satis_tarihi" } }, toplam_satis: { $sum: "$tutar" } } },
  { $out: "monthly_sales_summary" }
])

Avantajları:

Dezavantajları:

4.7.6.2. Sharded Cluster’da Index Yönetimi

Tanım: Sharded cluster’larda, indekslerin doğru yönetimi veri erişimini optimize etmek için kritik öneme sahiptir. Shard anahtarına uygun indeksler oluşturmak, performansı artırır.

Kullanım Amacı:

Örnek: Shard anahtarı kullanici_id olan bir koleksiyonda, created_at alanına göre indeks oluşturma:

db.gonderiler.createIndex({ created_at: 1 })

Avantajları:

Dezavantajları:

4.7.6.3. Lookup ve Aggregation Kullanarak Veri İlişkilerini Yönetme

Tanım: MongoDB’de $lookup operatörü, farklı koleksiyonlardaki verileri birleştirerek ilişkili verilerin bir araya getirilmesini sağlar. Bu, SQL’deki JOIN işlemlerine benzer şekilde çalışır.

Kullanım Amacı:

Örnek: Bir kullanıcı ve siparişlerini birleştirme:

db.kullanicilar.aggregate([
  {
    $lookup: {
      from: "siparisler",
      localField: "_id",
      foreignField: "kullanici_id",
      as: "kullanici_siparisleri"
    }
  },
  {
    $project: {
      isim: 1,
      "kullanici_siparisleri.siparis_id": 1,
      "kullanici_siparisleri.tutar": 1
    }
  }
])

Avantajları:

Dezavantajları:

4.7.7 Denormalizasyon ve Normalizasyon Stratejileri

MongoDB’de veri modelleme yaparken, veriyi normalize etmek veya denormalize etmek arasındaki dengeyi doğru kurmak önemlidir. Bu stratejiler, veri bütünlüğü, performans ve esneklik açısından farklı avantajlar sunar.

4.7.7.1. Normalizasyon (Normalization) Tanım: Normalizasyon, veriyi mantıksal olarak organize etme ve tekrar eden verileri en aza indirgeyerek veri tutarlılığını sağlama yöntemidir. Bu, ilişkili verilerin ayrı belgelerde veya koleksiyonlarda saklanmasını içerir.

Kullanım Amacı:

Avantajları:

Dezavantajları:

Örnek: Bir kullanıcı ve onun siparişlerini ayrı koleksiyonlarda saklama:

// kullanici belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4567"),
  "isim": "Ahmet"
}

// siparis belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b456a"),
  "kullanici_id": ObjectId("60ad0cedf8d2e30d8c8b4567"),
  "siparis_tarihi": ISODate("2024-04-27T12:34:56Z"),
  "tutar": 150.00
}

4.7.7.2. Denormalizasyon (Denormalization) Tanım: Denormalizasyon, veriyi gereksiz kopyalar oluşturarak sorgu performansını artırma yöntemidir. Bu, veri tekrarını kabul eder ve veriyi daha hızlı erişilebilir hale getirir.

Kullanım Amacı:

Avantajları:

Dezavantajları:

Örnek: Bir kullanıcı belgesinde onun en son sipariş bilgisini gömme:

{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4567"),
  "isim": "Ahmet",
  "son_siparis": {
    "siparis_id": ObjectId("60ad0cedf8d2e30d8c8b456a"),
    "siparis_tarihi": ISODate("2024-04-27T12:34:56Z"),
    "tutar": 150.00
  }
}

4.7.8 Veri Modelleme ve Sharding Stratejileri

Veri modelleme stratejileri, sharding stratejileri ile birlikte düşünülmelidir. Veri modellemenin doğru yapılması, sharding’in verimli çalışmasını sağlar. Aşağıda, veri modelleme ve sharding stratejilerini uyumlu hale getirmenin bazı yollarını inceleyeceğiz.

4.7.8.1. Shard Anahtarının Veri Modeli ile Uyumlu Olması

Shard anahtarınızın, veri modelinizle uyumlu olması, shard’lar arasında dengeli bir veri dağılımı sağlar ve performansı artırır.

Örnek:

4.7.8.2. İndekslerin Shard Anahtarı ile Uyumlu Olması

Shard anahtarı, verilerin nasıl bölündüğünü belirlediğinden, indekslerin de bu anahtarla uyumlu olması önemlidir.

Örnek:

db.gonderiler.createIndex({ kullanici_id: 1, created_at: -1 })

4.7.8.3. Sık Kullanılan Sorgulara Göre Veri Modelleme

Veri modelleme stratejilerinizi, en sık kullanılan sorgularınıza göre belirleyin. Bu, hem veri modellemede hem de sharding stratejisinde doğru seçim yapmanıza yardımcı olur.

Örnek:

4.7.8.4. Veri Güncellemelerinin Sharding ve Modelleme ile Entegrasyonu

Veri güncellemelerinin nasıl yapılacağını ve shard’lar arasındaki etkileşimi planlayın. Gömme ve referanslama stratejilerinin veri güncellemelerine etkisini değerlendirin.

Örnek:

4.7.9 Veri Modelleme İpuçları ve En İyi Uygulamalar

MongoDB’de etkili veri modelleme için bazı ipuçları ve en iyi uygulamalar şunlardır:

4.7.9.1. Sorgu Performansını Önceliklendirin

4.7.9.2. Shard Anahtarını Dikkatlice Seçin

4.7.9.3. Sharded ve Replika Set Yapılandırmalarını Optimize Edin

4.7.9.4. Veri Güncellemelerini Optimize Edin

4.7.9.5. Shard Balancer’ı İzleyin ve Optimize Edin

4.7.9.6. Veri Modelinizi Düzenli Olarak Gözden Geçirin

4.7.10 Örnek Senaryolar ve Uygulamalar

Bu alt bölümde, yukarıda ele alınan veri modelleme stratejilerini gerçek dünya senaryolarında nasıl uygulayabileceğinizi göstermek için bazı örnekler sunacağız.

Örnek 1: E-Ticaret Uygulaması

Senaryo: Bir e-ticaret platformunda kullanıcılar, ürünler ve siparişler arasında ilişkiler bulunmaktadır. Kullanıcıların siparişleri, ürünlerin kategorilere ait olduğu ve her ürünün birden fazla yorumu olduğu bir yapıya sahiptir.

Veri Modelleme Stratejisi:

Örnek Belgeler:

// Kullanici belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4567"),
  "isim": "Ahmet",
  "email": "ahmet@example.com",
  "siparisler": [ObjectId("60ad0cedf8d2e30d8c8b456a"), ObjectId("60ad0cedf8d2e30d8c8b456b")]
}

// Siparis belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b456a"),
  "kullanici_id": ObjectId("60ad0cedf8d2e30d8c8b4567"),
  "urun_id": ObjectId("60ad0cedf8d2e30d8c8b456c"),
  "siparis_tarihi": ISODate("2024-04-27T12:34:56Z"),
  "tutar": 150.00
}

// Urun belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b456c"),
  "isim": "Laptop",
  "kategori": "Elektronik",
  "yorumlar": [
    { "isim": "Mehmet", "yorum": "Çok iyi!", "puan": 5 },
    { "isim": "Ayşe", "yorum": "Fiyatı makul.", "puan": 4 }
  ]
}

Sharding ve Replication:

Sorgu Örnekleri:

  1. Kullanıcının Siparişlerini Getirme: db.kullanicilar.find({ “_id”: ObjectId(“60ad0cedf8d2e30d8c8b4567”) }, { “siparisler”: 1 })`
  2. Ürünün Yorumlarını Getirme: db.urunler.find({ "_id": ObjectId("60ad0cedf8d2e30d8c8b456c") }, { "yorumlar": 1 }) Avantajları:
    • Sıkça Kullanılan Sorguların Optimize Edilmesi: Kullanıcı bazlı sorgular hızlı bir şekilde gerçekleştirilir.
    • Veri Bütünlüğü: Yorumlar ürün belgelerinde gömülü olduğundan, yorumlara erişim hızlı ve tutarlıdır.

Dezavantajları:

Örnek 2: Sosyal Medya Uygulaması

Senaryo: Bir sosyal medya platformunda kullanıcılar, gönderiler, beğeniler ve yorumlar arasında ilişkiler bulunmaktadır. Kullanıcıların gönderileri, beğeniler ve yorumlar ayrı koleksiyonlarda tutulmaktadır.

Veri Modelleme Stratejisi:

Örnek Belgeler:

// Kullanici belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b4567"),
  "isim": "Ahmet",
  "email": "ahmet@example.com",
  "gonderiler": [ObjectId("60ad0cedf8d2e30d8c8b456a"), ObjectId("60ad0cedf8d2e30d8c8b456b")]
}

// Gonderi belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b456a"),
  "kullanici_id": ObjectId("60ad0cedf8d2e30d8c8b4567"),
  "icerik": "Merhaba Dünya!",
  "begeni_sayisi": 120,
  "yorumlar": [ObjectId("60ad0cedf8d2e30d8c8b456c"), ObjectId("60ad0cedf8d2e30d8c8b456d")]
}

// Yorum belgesi
{
  "_id": ObjectId("60ad0cedf8d2e30d8c8b456c"),
  "gonderi_id": ObjectId("60ad0cedf8d2e30d8c8b456a"),
  "kullanici_id": ObjectId("60ad0cedf8d2e30d8c8b4567"),
  "yorum": "Çok güzel bir gönderi!",
  "yorum_tarihi": ISODate("2024-04-27T12:34:56Z")
}

Sharding ve Replication:

Sorgu Örnekleri:

  1. Gönderinin Yorumlarını Getirme:
    db.gonderiler.aggregate([
     { $match: { "_id": ObjectId("60ad0cedf8d2e30d8c8b456a") } },
     { $lookup: { from: "yorumlar", localField: "_id", foreignField: "gonderi_id", as: "yorumlar_detay" } },
     { $project: { "icerik": 1, "yorumlar_detay.yorum": 1 } }
    ])
    
  2. Bir Kullanıcının Gönderilerini Getirme:
    db.kullanicilar.find({ "_id": ObjectId("60ad0cedf8d2e30d8c8b4567") }, { "gonderiler": 1 })   
    

Avantajları:

Dezavantajları:

Veri modelleme sürecinde yapılan hatalar, veritabanı performansını, ölçeklenebilirliğini ve bakımını olumsuz etkileyebilir. Aşağıda, MongoDB’de sıkça yapılan veri modelleme hatalarını ve bu hatalardan kaçınma yollarını inceleyeceğiz.

4.7.11.1. Yanlış Shard Anahtarı Seçimi

Hata: Shard anahtarını yanlış seçmek, verilerin shard’lar arasında dengesiz dağıtılmasına ve hotspot’ların oluşmasına yol açar.

Kaçınma Yolları:

4.7.11.2. Aşırı Gömme veya Aşırı Referanslama

Hata:

Kaçınma Yolları:

4.7.11.3. İndekslerin Yanlış Kullanımı

Hata: Yanlış veya eksik indeksler, sorgu performansını olumsuz etkiler ve gereksiz depolama alanı kullanımına yol açar.

Kaçınma Yolları:

4.7.11.4. Denormalizasyonun Aşırı Kullanımı

Hata: Denormalizasyonu aşırı kullanmak, veri tutarlılığı sorunlarına ve depolama alanı artışına yol açar.

Kaçınma Yolları:

4.7.11.5. Sharded Cluster’ın Yanlış Yapılandırılması

Hata: Shard’ların yanlış yapılandırılması, veri dağılımında dengesizliklere ve performans sorunlarına neden olabilir.

Kaçınma Yolları: