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.
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.
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ı:
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ı:
| Ö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
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ı:
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ı:
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.
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ı:
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
}
}
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:
kullanici_id
shard anahtarı, kullanıcı bazlı verilerin dengeli dağıtılmasını sağlar.created_at
shard anahtarı, zaman serisi verilerini yönetmek için kullanılabilir, ancak dikkatlice seçilmelidir.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 })
kullanici_id
) hem de zaman bilgisi (created_at
) ile sorguları optimize eder.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:
kullanici_id
kullanma.kullanici_id
shard anahtarı ile shard etme.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:
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
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:
kullanici_id
).Ö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:
kullanici_id
Sorgu Örnekleri:
db.kullanicilar.find({ “_id”: ObjectId(“60ad0cedf8d2e30d8c8b4567”) }, { “siparisler”: 1 })`db.urunler.find({ "_id": ObjectId("60ad0cedf8d2e30d8c8b456c") }, { "yorumlar": 1 })
Avantajları:
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:
gonderi_id
).Ö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:
gonderi_id
Sorgu Örnekleri:
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 } }
])
db.kullanicilar.find({ "_id": ObjectId("60ad0cedf8d2e30d8c8b4567") }, { "gonderiler": 1 })
Avantajları:
Dezavantajları:
gonderi_id
, verilerin shard’lar arasında dengeli dağıtılmasını sağlamalıdır. Aksi takdirde, bazı shard’lar aşırı yüklenebilir.
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ı: