ProgramlamaDatabase Engineer

Veri tablolari arasında Foreign Key ve CASCADE işlemleri kullanarak otomatik veri senkronizasyonunu nasıl doğru şekilde uygularız? ON DELETE CASCADE, ON UPDATE CASCADE ve manuel tetikleyiciler arasındaki fark nedir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

İlişkili tablolar (örneğin, "siparişler" ve "müşteriler") ilişkisel veritabanlarında en başından beri mevcuttur, ancak erken dönemlerde bütünlük kontrolü, manuel olarak program mantığı ile sağlanıyordu. SQL'in gelişmesiyle birlikte yerleşik kısıtlamalar (FOREIGN KEY) ve otomatik işlemler (CASCADE) ortaya çıktı.

Konu tarihi:

Başlangıçta veritabanları, "askıda kalan" kayıtların olmaması için bütünlüğü sağlamak için mekanizmalara ihtiyaç duyuyordu (örneğin, var olmayan bir müşteri için sipariş). FOREIGN KEY bir standart haline geldi ve CASCADE seçenekleri, silmeler ve değişiklikler sırasında senkronizasyonu otomatikleştirdi.

Sorun:

Kaskad eylemleri olmadan, ana tabloda bir satırın silinmesi veya güncellenmesi hatalara veya "yetim" verilere yol açar. Bu görevi uygulamaya yüklemek genellikle karmaşık destek gerektirir ve büyük işlemlerde olay riski taşır. Kaskad eylemlerinin yanlış kullanımı, zincirleme silmelere veya iş mantığının ihlaline neden olabilir.

Çözüm:

ON DELETE CASCADE ve ON UPDATE CASCADE ile FOREIGN KEY kullanımı, otomatik olarak bütünlüğü sağlamaya ve ilişkili tabloları doğru bir şekilde senkronize etmeye olanak tanır. Karmaşık senaryolar (örneğin, silmenin yanı sıra eylemleri kaydetme gereksinimi) için tetikleyiciler kullanılır.

Kod örneği:

CREATE TABLE Customers ( CustomerID INT PRIMARY KEY, Name NVARCHAR(100) ); CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT, Amount DECIMAL(10,2), FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ON DELETE CASCADE ON UPDATE CASCADE );

Anahtar özellikler:

  • ON DELETE CASCADE — ana kaydın silinmesi durumunda alt kayıtların otomatik silinmesi.
  • ON UPDATE CASCADE — dış anahtarın değerinin otomatik olarak güncellenmesi.
  • Karmaşık senaryolar için özelleştirilmiş eylemler için tetikleyiciler kullanmak mümkündür.

Kandırmaca Soruları.

Kaskad silme her ilişki için en iyi uygulama mıdır?

Hayır: "tarihi" veriler veya arşiv bilgileri için kaskad silme değerli bilgilerin kaybolmasına neden olabilir. Her ilişki türünün iş değerini anlamak önemlidir.

ON UPDATE CASCADE, dış anahtarın ana tablonun PRIMARY KEY'ine dahil olmadığı durumlarda çalışır mı?

Birçok DBMS'de, dış anahtarın kaskadları desteklemesi için benzersiz veya PRIMARY KEY'e referans vermesi gerekir. Aksi takdirde, komut çalışmayacaktır.

Kaskad zinciri izin verilen derinlik sınırlarını aşabilir mi (özyineleme), ve ne olur?

Evet: büyük kaskadlarda derinlik sınırlarının aşılması mümkündür (örneğin, SQL Server'da — 32). Bu, bir hata ve işlemin geri alınması ile sonuçlanır.

Tipik hatalar ve anti-patrenler

  • Zayıf kontrol ile kaskad silme — önemli verilerin potansiyel kaybı.
  • Büyük değişikliklerin kaydedilmesi gereğinin göz ardı edilmesi.
  • Performansı dikkate almadan tetikleyici tasarlamak (örneğin, sonsuz özyineleme başlatmak).

Gerçek hayattan bir örnek

Olumsuz durum

Tedarikçi ve sipariş izleme sisteminde ON DELETE CASCADE uygulandı — müşteriler yanlışlıkla önemli bir tedarikçiyi sildi, tüm siparişler otomatik olarak silindi, teslimat geçmişleri kayboldu. Verileri geri yüklemek imkansız hale geldi.

Artılar:

  • Minimum manuel çalışma.

Eksiler:

  • İş geçmişinin kaybı.

Olumlu durum

ON DELETE SET NULL kullandık, artı kaydetme için tetikleyici — müşteri kaydı silinse bile siparişlerin geçmişi saklandı (geçersiz durum verildi), rastgele kütlesel silim gerçekleşmedi.

Artılar:

  • Esneklik.
  • Değişikliklerin denetim olanağı.

Eksiler:

  • Mantığın desteklenmesi daha zor.