2009-02-03 19 views
11

SQL, her zaman mükemmel bir özelliğe sahiptir: basamaklı silme işlemleri. Bunu önceden planladınız ve bir şey silme zamanı geldiğinde, BAM! Tüm bu bağımlı kayıtlar için endişelenmenize gerek yok. Bununla birlikte, günümüzde aslında herşeyi SİLMEK için neredeyse tabu oluyor. Silindi olarak işaretleyin ve göstermeyi durdurun. Ne yazık ki, bağımlı kayıtlar olduğunda bunu yapmak için katı bir çözüm bulamadım. Her zaman yumuşak silmelerin karmaşık ağını elle kodluyorum.Basamaklı Yumuşak Silme

Tamamen özlediğim daha iyi bir çözüm var mı?

cevap

13

Bunu söylemekten nefret ediyorum, ancak tetikleyiciler bu tür şeyler için özel olarak tasarlanmıştır. Bahsettiğin arkayüz neler

0

emin değil

(iyi tetikleyiciler yazmak için çok zor ve tabii ki debug olamaz çünkü nefret parçasıdır), ancak "delete bayrak" konulu pikap olabilir Bir tetikleyici kullanarak değişimi değiştirmek ve kademeli olarak kaydırmak.

6

Yabancı anahtar kısıtlamaları kaskad güncelleştirmelerini yapabilir. Tablolarınızı hem anahtar hem de silme bayrağına bağladıysanız, ana tablodaki silme bayrağı değiştiğinde, bu değişiklik ayrıntı tablosuna doğru yayılır. Bunu denemedim ama işe yaramalı.

+0

Bu çok şık IMO'dur. Bunu yapmanın tek sorunu, bir NULL Delete_Date kullanamazsınız ancak bunun yerine '9999-12-31' gibi bazı keyfi tarihleri ​​kullanmanız gerekir. – HaxElit

+1

Biraz daha düşündükten sonra işe yaramıyor çünkü bağımlı bir kaydı sildiyseniz, ebeveynin silme tarihi farklı olduğundan önemli bir kısıtlama hatası alırsınız. Doğru olması için, sanırım;) – HaxElit

2

Yumuşak silme işlemlerinin bir yararı genellikle her tablonun bir yumuşak silme bayrağına sahip olmamasıdır, bu yüzden basamaklanması gereken şeylerin sayısı azdır. Satırlar veritabanında basitçe kullanılmaz, ancak öksüz değil - sadece silinmiş satırlarla ifade edilir.

Her şey gibi, yine de sizin modelinize bağlıdır.

+0

Hmm, ama sonra hemen kullanılmakta olan bir veri tabanı var. Birincil masaya katılabilirsiniz, ancak eğer çağlayan birkaç seviyeyi derinden aşarsa, bu durum dağınık olabilir. Yoksa bir şey mi özlüyorum? – Piskvor

+1

Modele bağlı. İlişkisel tasarımda, silinmiş bir bayrak ilişki/tuple/tabloya ait değilse, yani anahtarın bir özelliği değil, bir tane koymaydım. Bir yıldız şemasında - onları sadece çekirdek masalara koyarsınız. –

+0

Bir alt sistemin şemasına ilişkin bir örnek verirseniz, size silinecek bir bayrağı nereye koyacağımı göstereceğim. Örneğin, bağlantı değişim tarihini koruyamadığınız sürece onları çoktan çoğa bir masaya koyamazdım, bu durumda etkili tarihler de eklemeniz gerekirdi. –

İlgili konular