Marten ile Tür Hiyerarşilerini Saklama ve Sorgulama
Jeremy D. Miller, Marten'ın sınıf hiyerarşilerini tek bir PostgreSQL tablosunda nasıl sakladığını ve LINQ ile nasıl sorguladığını anlatıyor. EF Core'daki TPH, TPT ve TPC seçeneklerine kıyasla bu yaklaşım şema kararını ortadan kaldırıyor. Kısmi indeksler ve alt tipe özgü alanlar da ele alınıyor.
Kilit noktalar
- Alt tipleri AddSubClassHierarchy() ile kaydedin; büyük assembly'lerde açık tip listesi daha güvenlidir.
- Tüm hiyerarşi tek tabloda tutulur; mt_doc_type ayırt edici sütunu üzerinde otomatik bir btree indeksi oluşur.
- Taban tip sorguları somut alt tipleri döndürür; LoadAsync<CryptoPayment>(id) başka bir alt tipin belgesi için null döner.
- Discriminator değeri sınıf adından türetilir; yeniden adlandırılan alt tipler için MappedType ile takma ad sabitleyin.
- Duplicate<TSub>() alt tip alanını gerçek bir sütuna çevirir; indeksteki Predicate ise tek bir alt tipe özgü kısmi indeks oluşturur.
- Yalnızca alt tipe ait özellikler için migration gerekmez; yeni özellikler JSON içinde otomatik görünür.
Jeremy D. Miller, EF Core tarafındaki geliştiricelerin sorduğu bir soruyu ele alarak Marten'ın sınıf hiyerarşilerini nasıl sakladığını ve sorguladığını anlatıyor. EF Core'da kalıtım eşlemesi için TPH, TPT ve TPC arasında baştan seçim yapmak gerekirken Marten, JSONB olarak saklanan belgeler sayesinde bu kararı ortadan kaldırıyor.
Konfigürasyon tek bir tabloyu kullanır ve her satır, gerçek tipini belirten mt_doc_type ayırt edici sütunu ile birlikte yalnızca kendi JSON verisini taşır. Taban tipe yapılan sorgular tüm aileyi somut tipleriyle geri getirir; alt tip sorguları ise otomatik olarak ayırt edici koşulu ekler. Yazar ayrıca alt tipe özgü kısmi indeksler ve Duplicate<TSub>() ile kopyalanan alanları anlatıyor. Ayrıntılar için orijinal yazıya göz atın.
Gerçek dünyada kullanımı
- Kart, banka transferi ve kripto ödemelerinin tek API ve tek PostgreSQL tablosu üzerinden yönetildiği bir ödeme servisi.
- Tüm ödemeleri tutar ve tarihe göre filtreleyen, ardından yalnızca bir alt tipe kısmi indeksle inen bir raporlama ekranı.
- Marten projeksiyonları kullanan ve EF Core eşleme kararları olmadan belge tabanlı kalıtım modeli isteyen bir ekip.
Neden önemli
Marten'da hiyerarşi kararı tek bir tabloya indiği için şema bakımı ve sorgu ayarı çok daha az ceremoni gerektirir. Yine de tek sıcak tablonun autovacuum ve bloat maliyetlerini tüm alt tiplerle paylaştığını göz önünde bulundurun.
Benzer haberler
- Odoo'ya lead gönderirken kaybetmemek: ASP.NET Core'da transactional outboxDEV Community: #aspnetcore2 gün önce
- NebulaGraph'a .NET'ten idempotent toplu yükleme: VID ile çoğaltma sorunuDEV Community: #csharp3 gün önce
- TableSchema ile veritabanı yapısı yükseltmeleri: karşılaştır, planla, uygulaDEV Community: #dotnet3 gün önce