“Veritabanı şeması bir sözleşmedir. Polimorfizm, uygulamanızın bu sözleşmeyi bozmadan büyümesine olanak tanıyan bir madde.” – Laravel Mimarisi Lideri
Önemli Noktalar
Önemli Noktalar
- Yapısal Esneklik: Polimorfik ilişkiler, tek bir modelin birden fazla diğer modelle tek bir ilişki kullanarak bağlı olmasına olanak tanır, bu da veritabanı şeması karmaşıklığını önemli ölçüde azaltır.
- Şema Ölçeklenebilirliği: Ayrı “post_comments” ve “video_comments” tabloları oluşturmak yerine, her bir varlık için hizmet eden tek bir “comments” tablosu kullanabilirsiniz.
- DRY (Kendini Tekrarlama): Eki, etiketler veya beğeniler için yazılan mantık bir kez yazılır ve sonsuz modeller arasında paylaşılır.
- Polimorfik Haritalarla Koparma: EnforceMorphMap kullanarak veritabanınızın PHP sınıf adlarına “bağlı” olmasını önler, uzun vadeli bakım kolaylığı sağlar.
- Performans Kontrolü: Güçlü olmasına rağmen, polimorfik ilişkiler veri ölçeklendikçe yavaş sorgu yürütmelerini önlemek için morf sütunlarında stratejik indeksleme gerektirir.
- Framework Egemenliği: Laravel’in 2025’te %35.87 pazar payı, karmaşık SQL’i okunabilir API çağrılarına dönüştüren Eloquent gibi geliştirici dostu araçlar sayesinde büyük ölçüde artmaktadır.
İçindekiler
İçindekiler
- Giriş
- Polimorfizmin Mimarisi
- Gerçek Dünya Kullanım Durumu 1: Evrensel Yorum Sistemi (Birden-Çoğa)
- Gerçek Dünya Kullanım Durumu 2: Medya ve Resim Kütüphanesi (Birden-Bire)
- Gerçek Dünya Kullanım Durumu 3: Esnek Etiketleme Sistemi (Çoktan-Çoka)
- Gerçek Dünya Kullanım Durumu 4: Küresel Aktivite Akışları ve Denetim Kayıtları
- Gerçek Dünya Kullanım Durumu 5: Beğeniler ve Tepkiler
- “Morph Map” Temel Deseni
- İstatistikler
- İlginç Bilgiler
- SSS
- Sonuç
Giriş
Giriş
Geleneksel veritabanı tasarımında, bir Kullanıcının bir Resmi ve bir Ürününde de bir Resmi olması durumunda, genellikle iki ayrı tabloya sahip olursunuz veya boş yabancı anahtarlarla dolu karmaşık bir tabloya sahip olursunuz. Uygulamanız büyüdükçe, bu tablo genişlemesi şemanızı kolayca kırar ve kodunuzu gereksiz hale getirir.
Polimorfik ilişkiler bu senaryoda faydalıdır. Bir modelin kimliğini bağlama göre “şekil değiştirmesine” olanak tanır. Bu makalenin sonunda, her yeni varlık için tek bir yeni tablo eklemeden, özelliklerinizin yatay olarak büyümesini sağlayan bir birleşik veritabanı yapısını nasıl oluşturacağınızı anlayacaksınız.
Polimorfizmin Mimarisi
Polimorfizmin Mimarisi
Polimorfik bir ilişkinin temelinde iki sütun bulunur:
- ID: İlgili modelin birincil anahtarı (örneğin, 10).
- Tip: İlgili modelin sınıf adı veya “takma adı” (örneğin, App\Models\Post).
Laravel, bu sütunları otomatik olarak oluşturmak için migrations’ta morphs() yardımcı fonksiyonunu kullanır.
Gerçek Dünya Kullanım Durumu 1: Evrensel Yorum Sistemi (Birden-Çoğa)
Gerçek Dünya Kullanım Durumu 1: Evrensel Yorum Sistemi (Birden-Çoğa)
Uygulamanızın Gönderileri, Videoları ve Görevleri olduğunu varsayın. Hepsinin yorumlara ihtiyacı var.
Uygulama:
// Migration
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->text('body');
$table->morphs('commentable'); // commentable_id ve commentable_type oluşturur
$table->timestamps();
});
// Comment Model
public function commentable() {
return $this->morphTo();
}
// Post Model
public function comments() {
return $this->morphMany(Comment::class, 'commentable');
}
Fayda: Artık $post->comments veya $video->comments çağrısını yapabilirsiniz. Eloquent, sahne arkasında filtreleme mantığını yöneterek bir videonun asla bir gönderinin yorumlarını görmemesini sağlar.
Gerçek Dünya Kullanım Durumu 2: Medya ve Resim Kütüphanesi (Birden-Bire)
Gerçek Dünya Kullanım Durumu 2: Medya ve Resim Kütüphanesi (Birden-Bire)
Bir Kullanıcının bir profil resmi ve bir Markanın bir logosu vardır. Her ikisi de sadece resimlerdir.
Uygulama:
public function image() {
return $this->morphOne(Image::class, 'imageable');
}
Fayda: Görsellerin merkezi hale getirilmesi, görüntü optimizasyonu veya CDN yükleme gibi küresel özellikleri uygulamayı son derece kolaylaştırır, çünkü tüm “sahip” modeller aynı Resim mantığı ile etkileşimde bulunur.
Gerçek Dünya Kullanım Durumu 3: Esnek Etiketleme Sistemi (Çoktan-Çoka)
Gerçek Dünya Kullanım Durumu 3: Esnek Etiketleme Sistemi (Çoktan-Çoka)
Peki, birçok Gönderinin birçok Etikete sahip olabileceği ve birçok Ürünün de birçok Etikete sahip olabileceği bir durum düşünün.
Uygulama: morphToMany ve morphedByMany kullanarak, uygulama genelindeki her ilişkiyi takip eden tek bir pivot tablosu (örn. taggables) yaratabilirsiniz.
Gerçek Dünya Kullanım Durumu 4: Küresel Aktivite Akışları ve Denetim Kayıtları
Her bir işlemi takip et: “Kullanıcı A, Gönderi B’yi beğendi” veya “Kullanıcı C, Görev D’yi güncelledi.”
Uygulama:
$log = Activity::create([
'action' => 'updated',
'subject_id' => $task->id,
'subject_type' => get_class($task),
]);
Fayda: “Aktivite Akışınız”, konuyla ilgili türler temelinde farklı Blade bileşenleri kullanarak render edilebilen tek bir polimorfik veri akışı haline gelir.
Gerçek Dünya Kullanım Durumu 5: Beğeniler ve Tepkiler
Gerçek Dünya Kullanım Durumu 5: Beğeniler ve Tepkiler
Gönderi_beğenileri ve yorum_beğenileri yerine, beğenilebilir bir varlığa morf olan bir Beğeni modeli kullanın.
Fayda: Beğeninin bir yorumda, fotoğrafta veya bir başlıkta olup olmadığını gözetmeksizin “Küresel Popülerlik” hesaplayabilirsiniz.
“Morph Map” Temel Deseni
“Morph Map” Temel Deseni
Varsayılan olarak, Laravel veritabanınızda tam sınıf adını (örn. App\Models\Post) saklar. Eğer bu sınıfı yeniden adlandırırsanız, verileriniz bozulur.
Çözüm: AppServiceProvider’ınızda bir harita tanımlayın:
use Illuminate\Database\Eloquent\Relations\Relation;
public function boot() {
Relation::enforceMorphMap([
'post' => 'App\Models\Post',
'video' => 'App\Models\Video',
]);
}
Artık veritabanınız yalnızca “post” dizesini saklar. Bu, verilerinizi kod yapınızdan ayırır.
“Belirlenen görevinizi yerine getirmek hakkına sahipsiniz, ancak eylemin sonuçlarına değil.”
— Bhagavad Gita 2.47
İstatistikler
İstatistikler
- Doğru indeksleme ile, polimorfik ilişki sorguları büyük veri kümesinde ondan alt milisaniye yanıt sürelerine kadar gidebilir (Kaynak).
- 20 yıldan fazla bir sürede Obje-İlişkisel Haritalama (ORM) çözümleri üzerine yapılan bir inceleme, birçok desenin ticareti ve karmaşık ORM özelliklerinin nasıl geliştiği hakkında bilgi vermektedir – polimorfizm, miras haritalama vb. dahil. (Kaynak).
- 1M’den fazla satır içeren tablolarda indekslenmemiş polimorfik sorgular, standart yabancı anahtarlardan 3 kat daha yavaş olabilir, bu nedenle indeksleme kritik öneme sahiptir.
- Polimorfik ilişkiler, karmaşık bir uygulamadaki toplam pivot tablosu sayısını %34’e kadar azaltabilir.
İlginç Bilgiler
İlginç Bilgiler
- “Morphs” Yardımcıları: $table->morphs(‘name’) migration yardımcısı, performans açısından kritik olan her iki sütun üzerinde otomatik olarak bir indeks oluşturur.
- İsimlendirme Kuralları: İlişkiniz imageable olarak adlandırıldığında, Laravel imageable_id ve imageable_type bekler.
- N+1 Riski: Polimorfik ilişkiler, eager loading düzgün kullanılmadığında N+1 sorunlarına eğilimlidir (örn. with(‘commentable’)).
- Soft Deletes: Eğer ana modelde Soft Deletes kullanıyorsanız, polimorfik çocuklar (yorumlar gibi), bir cascade paketi kullanılmadıkça otomatik olarak gizlenmez.
SSS
SSS
S1: Polimorfik ilişkilerde yabancı anahtar kullanabilir miyim? Cevap: Hayır. _id sütunu birden fazla tabloya işaret ettiği için standart veritabanı düzeyi yabancı anahtar kısıtlamaları uygulanamaz. Veri bütünlüğünü kodunuzda sağlamalısınız.
S2: Polimorfik ilişkiler daha mı yavaştır? Cevap: Biraz daha, çünkü veritabanı iki sütuna (Tip ve ID) göre filtreleme yapmak zorundadır. Ancak doğru indeksleme ile, fark çoğu uygulama için önemsizdir.
S3: Hangi durumlarda KULLANMAMAK gereklidir? Cevap: Eğer iki varlık temelden farklıysa ve asla paylaşılacak bir mantık yoksa, bunları ayrı tablolarda tutun. Zorla polimorfizm uygulamayın.
S4: Polimorfik “Yorumlar” tablosundan yalnızca “Gönderileri” nasıl sorgularım? Cevap: Comment::where(‘commentable_type’, ‘post’)->get();.
S5: nullableMorphs() nedir? Cevap: morphs() ile aynı, ancak _id ve _type sütunlarının NULL olmasına izin verir.
Sonuç
Sonuç
Polimorfik ilişkiler, ölçeklenebilir, temiz ve profesyonel Laravel uygulamaları oluşturmanın “gizli sosu”dur. Veritabanınızı katı bir tablo setinden, etiketleme, yorum yapma ve günlük tutma gibi karmaşık özellikleri minimum yük ile destekleyen dinamik, esnek bir ekosisteme dönüştürür.
Laravel, %35.87 pazar payı ile egemenliğini sürdürürken, bu gelişmiş Eloquent desenlerini idrak etmek, bir junior geliştiriciyi senior bir mimardan ayıran unsurdur.
Kaynak: Orijinal Makale
- Önemli Noktalar
- İçindekiler
- Giriş
- Polimorfizmin Mimarisi
- Gerçek Dünya Kullanım Durumu 1: Evrensel Yorum Sistemi (Birden-Çoğa)
- Gerçek Dünya Kullanım Durumu 2: Medya ve Resim Kütüphanesi (Birden-Bire)
- Gerçek Dünya Kullanım Durumu 3: Esnek Etiketleme Sistemi (Çoktan-Çoka)
- Gerçek Dünya Kullanım Durumu 5: Beğeniler ve Tepkiler
- “Morph Map” Temel Deseni
- İstatistikler
- İlginç Bilgiler
- SSS
- Sonuç


