EF Core 10 ile PostgreSQL jsonb: eşleme, indeksleme ve sorgulama
EF Core 10 ve Npgsql 10, bir .NET karmaşık tipini ToJson() ile PostgreSQL jsonb kolonuna eşlemeyi destekliyor. Yazı, LINQ sorgularının hangi SQL'e çevrildiğini, hangi indekslerin işe yaradığını ve jsonb'nin ayrı tablodan ne zaman daha iyi olduğunu anlatıyor. Seyrek alanlı ürün tablolarında pratik bir rehber.
Kilit noktalar
- EF Core 10 ve Npgsql 10 ile karmaşık tipi ComplexProperty(...).ToJson("specs") ile jsonb kolonuna eşleyin.
- Kolon adını küçük harfle verin; aksi halde ham SQL'de tırnak kullanmak gerekir.
- EF.Functions.JsonContains bu eşlemede çevrilmez; @> ve ? için FromSql kullanın.
- LINQ'in ->> karşılaştırmaları için GIN değil, ifade tabanlı B-tree indeksi oluşturun.
- Varlık kontrolü için ? yerine specs->>'Alan' IS NOT NULL kullanın, çünkü null değerli anahtarlar da ? ile eşleşir.
- Tek bir özellik güncellemesi için ExecuteUpdate ve SetProperty kullanın; EF bunu jsonb_set'e çevirir.
Sık değişen, çoğu satırda boş kalan ürün özellikleri için her alanı ayrı kolon yapmak migration yükü doğurur. Yazar, EF Core 10'da ComplexProperty(...).ToJson("specs") ile bir karmaşık tipi jsonb kolonuna eşlemeyi ve LINQ'in bu kolona nasıl SQL ürettiğini inceliyor. Eşleme kolonu küçük harfle adlandırmayı ve EF.Functions.JsonContains gibi çağrıların karmaşık tipte çevrilmediğini, bu nedenle @> ve ? operatörlerinin FromSql ile yazılması gerektiğini belirtiyor.
İndeks tarafında önemli bir ayrım var: GIN indeksi @> ve ? gibi operatörlere yarar, ancak LINQ'in ürettiği ->> karşılaştırmaları için ifade tabanlı bir B-tree indeksi gerekir. Yazar ayrıca PostgreSQL 18'deki sanal üretilmiş kolonların indekslenemediğini ve ExecuteUpdate ile SetProperty kullanıldığında EF Core 10'un jsonb_set üretebildiğini gösteriyor. Ayrıntılar için orijinal yazıya bakmak faydalı olur.
Gerçek dünyada kullanımı
- Her müşterinin farklı özellik seti olduğu B2B SaaS ürününde özel alanları migration olmadan saklamak.
- Kategoriye göre değişen ürün teknik özelliklerini filtreleyen bir e-ticaret katalog API'si.
- Olay payload'ları ya da yapılandırma blokları gibi şeması sık değişen veriler için PostgreSQL tabanlı servis.
Neden önemli
Seyrek alanları jsonb'de tutarken sorgu performansını korumak için hangi LINQ ifadesinin hangi indeksi kullandığını bilmek gerekir. Yanlış indeks türü, sorgunun sıralı taramaya düşmesine yol açabilir.