Mert Özen Her Satırda Daha İleri

Blog

Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.

Seriler
91 yazı bulundu
Audit Trail: Kim, Neyi, Ne Zaman, Neden Değiştirdi?
Yazılım Tasarımı SERİ 07

Audit Trail: Kim, Neyi, Ne Zaman, Neden Değiştirdi?

Güvenilir bir audit trail için değişiklikleri bir SaveChangesInterceptor ile property bazında eski/yeni değer, kullanıcı, correlation id ve gerekçeyle iş verisiyle aynı transaction'da yaz; kişisel veriyi maskele ve tabloyu append-only yap. ExecuteUpdate gibi interceptor'ı atlayan yollar için özet kayıt ve temporal table güvenlik ağı ekle.

7 Kas 2026 14 dk 7
Soft Delete'i Doğru Yapmak: IsDeleted, DeletedAt, Filtered Unique Index ve Archive Tablosu
Yazılım Tasarımı SERİ 06

Soft Delete'i Doğru Yapmak: IsDeleted, DeletedAt, Filtered Unique Index ve Archive Tablosu

Soft delete'i doğru yapmak için unique index'leri WHERE DeletedAt IS NULL ile filtrele, aynı işlemde silinen kayıtları bir DeletionId ile bağla ve KVKK silme talebini soft delete ile değil anonimleştirmeyle karşıla. Geri getirme gerçek bir ihtiyaç değilse archive tablosu veya hard delete + audit daha sade bir seçimdir.

7 Kas 2026 15 dk 8
Enum mı Lookup Tablosu mu? Reference Data'yı Kodda ve Veritabanında Tutmak
Yazılım Tasarımı SERİ 05

Enum mı Lookup Tablosu mu? Reference Data'yı Kodda ve Veritabanında Tutmak

Kodun davranışını belirleyen kapalı listeler (sipariş durumu) enum olarak kalmalı ve veritabanında HasData ile seed'lenen, FK ile bağlı bir aynası olmalı; iş biriminin yönettiği açık listeler (masraf tipi) ise IsActive'li bir lookup tablosunda deploy'suz değişmeli. Yazı yeniden numaralandırma ve string enum rename tuzaklarını gerçek çıktılarla gösteriyor.

7 Kas 2026 13 dk 7
Id'yi Dışarıya Açmak: int Identity, GUID v7 ve Public Id Ayrımı
Yazılım Tasarımı SERİ 04

Id'yi Dışarıya Açmak: int Identity, GUID v7 ve Public Id Ayrımı

Dışarıya açılan id için en dengeli yol, içeride clustered key olarak bigint identity, dışarıda değişmez ve unique bir PublicId tutmak ve her sorguda sahiplik koşulu aramaktır. Ölçümde Guid.CreateVersion7 SQL Server'da v4 kadar parçalandı (yüzde 99, 4.987 sayfa), çünkü SQL Server uniqueidentifier'ı son 6 byte'a göre sıralıyor; EF Core'un sequential generator'ı ise identity'ye yakın kaldı.

7 Kas 2026 13 dk 5
Sentinel Value'lar: 0, -1, "1900-01-01" ve 9999-12-31'in Gizli Maliyeti
Yazılım Tasarımı SERİ 03

Sentinel Value'lar: 0, -1, "1900-01-01" ve 9999-12-31'in Gizli Maliyeti

Sentinel value'lar (maaşta 0, bitişte 9999-12-31, tarihte 1900-01-01) aggregate'leri sessizce bozar: örnekte ortalama maaş 85.000 yerine 51.000 çıkıyor. Çözüm genelde nullable kolon, anlamı birden fazlaysa ayrı bir durum field'ı ve domain'de Special Case tipi; sentinel ancak tek bir üreticisi olduğunda (temporal table, persisted computed column) bilinçli bir standart olabilir.

7 Kas 2026 15 dk 5
Gölge Kayıt: Veritabanında Olmayan Virtual Root — Departmanların Üstündeki "Şirket = 0"
Yazılım Tasarımı SERİ 02

Gölge Kayıt: Veritabanında Olmayan Virtual Root — Departmanların Üstündeki "Şirket = 0"

Veritabanında olmayan "Şirket = 0" kökü, 0 yalnız API sınırında bir DepartmentScope tipine (içeride null) çevrilirse güvenli çalışır; 0'ı sıradan bir int olarak taşırsan okumada boş liste, yazmada FK ihlali alırsın. Yazı virtual root'u, DB'de gerçek kökü, Company entity'sini ve açık scope sözleşmesini trade-off'larıyla karşılaştırıyor.

7 Kas 2026 15 dk 8
Solution Pattern Nedir? GoF'ta Olmayan Gerçek Hayat Problemleri ve Pattern Template
Yazılım Tasarımı SERİ 01

Solution Pattern Nedir? GoF'ta Olmayan Gerçek Hayat Problemleri ve Pattern Template

Solution pattern, GoF'un (Gang of Four) kod yapısı pattern'lerinden farklı olarak veri, API ve UI'ı birlikte kesen, tekrar eden bir uygulama kararıdır (soft delete, sentinel value, virtual root gibi). Bu yazı serinin Pattern Template'ini, sabit trade-off kriterlerini ve İK Portalı örnek uygulamasının şemasını tanıtıyor.

7 Kas 2026 15 dk 3
Blog Haritası