Ana içeriğe geç
Kesit SQL
İleri · Uygulama Geliştirme

Uygulama veritabanı desenleri: yumuşak silme, denetim sütunları, iyimser kilit

Gerçek uygulamalarda her tabloda karşılaşılan kalıplar.

Uygulamada aç, 4 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Yumuşak silme (soft delete)

Satırı gerçekten silmek yerine deleted_at sütununa tarih yazılır. Kayıt geri getirilebilir, geçmiş raporlar bozulmaz. Bedeli: her sorguda WHERE deleted_at IS NULL unutulmamalıdır. Bunu garanti etmenin yolu, uygulamanın tabloya değil bir görünüme bakmasıdır.

ALTER TABLE products ADD COLUMN deleted_at TEXT;

UPDATE products SET deleted_at = '2024-12-31' WHERE product_id IN (39, 40);

CREATE VIEW v_aktif_urunler AS
SELECT product_id, name, category, price
FROM products
WHERE deleted_at IS NULL;

SELECT COUNT(*) AS aktif FROM v_aktif_urunler;
Benzersizlik tuzağıE-posta tekil olmalıysa, silinmiş bir kaydın e-postası yeni kayda engel olur. SQL Server ve PostgreSQL'de filtreli/kısmi tekil indeks (WHERE deleted_at IS NULL) bunu çözer.

Denetim (audit) sütunları

Hemen her tabloda bulunur: created_at, created_by, updated_at, updated_by. Oluşturma zamanı varsayılan değerle, güncelleme zamanı uygulama veya trigger ile doldurulur. Değerlerin tam geçmişi gerekiyorsa ayrı bir geçmiş tablosu (veya SQL Server'ın temporal table özelliği) kullanılır.

İyimser kilit (optimistic concurrency)

İki kullanıcı aynı kaydı açıp düzenliyor. İkincisi kaydettiğinde birincinin değişikliğini sessizce ezmemeli. Çözüm: her satırda bir versiyon sütunu tut; güncellerken okuduğun versiyonu koşula ekle.

CREATE TABLE hesap (id INTEGER PRIMARY KEY, bakiye INTEGER, versiyon INTEGER);
INSERT INTO hesap VALUES (1, 1000, 1);

-- Ayşe ve Mehmet ikisi de versiyon = 1 olarak okudu.
-- Ayşe önce kaydeder: 1 satır etkilenir, versiyon 2 olur
UPDATE hesap SET bakiye = 900, versiyon = versiyon + 1 WHERE id = 1 AND versiyon = 1;

-- Mehmet eski versiyonla kaydetmeye çalışır: 0 satır etkilenir
UPDATE hesap SET bakiye = 1200, versiyon = versiyon + 1 WHERE id = 1 AND versiyon = 1;

SELECT * FROM hesap;

Uygulama etkilenen satır sayısına bakar; 0 ise “kayıt siz düzenlerken değişti, yeniden yükleyin” der. SQL Server'da bunun için hazır rowversion veri tipi vardır.

Tekrarlanabilir (idempotent) istekler

Ödeme gibi işlemlerde ağ hatası yüzünden aynı istek iki kez gelebilir. İsteğe tekil bir idempotency anahtarı verilip tekil kısıtla saklanır; ikinci istek kısıta takılır ve ilk sonucun aynısı döndürülür.

Alıştırmalara geç (4)