Tablo satırlarını 'DeletedDate' gibi sütunlarla görmeye alışkınım ve onlardan hoşlanmıyorum. “Silinen” kavramı, girişin ilk başta yapılmaması gerektiği yönündedir. Pratik olarak, veritabanından kaldırılamazlar, ancak sıcak verilerimle birlikte olmasını istemiyorum. Mantıksal olarak silinmiş satırlar, birileri özellikle silinmiş verileri görmek istemediği sürece, tanım olarak soğuk verilerdir.
Ayrıca, yazılan her sorgu, onları özel olarak dışlamak zorundadır ve dizinlerin de göz önünde bulundurulması gerekir.
Görmek istediğim, veritabanı mimarisi düzeyinde ve uygulama düzeyinde bir değişiklik: 'deleted' adlı bir şema oluşturun. Her kullanıcı tanımlı tablo, 'silinen' şemada, meta verileri içeren ekstra bir alanla - onu ne zaman ve ne zaman sildiğini belirten eşdeğerdedir. Yabancı anahtarların oluşturulması gerekiyor.
Sonra, siler ekleme-silmeye dönüşür. Öncelikle silinecek satır 'silinmiş' şema emsaline eklenir. Ana tabloda söz konusu satır daha sonra silinebilir. Bununla birlikte, ekstra mantığın hat boyunca bir yere eklenmesi gerekir. Yabancı anahtar ihlalleri ele alınabilir.
Yabancı anahtarların doğru şekilde kullanılması gerekir. Mantıksal olarak silinmiş ancak birincil / benzersiz olan diğer tablolarda kendisine ait sütunlar bulunan bir satırın olması kötü bir uygulamadır. Bu zaten olmamalıydı. Düzenli bir iş, dul satırlarını kaldırabilir (birincil anahtarının yabancı anahtar olmasına rağmen diğer tablolarda referansı olmayan satırlar). Bu, iş mantığıdır.
Genel yarar tablodaki meta verilerin azaltılması ve getirdiği performans iyileştirmesidir. 'DeletedDate' sütunu bu satırın aslında burada olmaması gerektiğini, ancak kolaylık uğruna orada bıraktığımızı ve SQL sorgusunun işlemesine izin verdiğini söylüyor. Silinen satırın bir kopyası 'silinmiş' bir şemada tutulursa, sıcak verilere sahip ana tablo daha yüksek bir sıcak veri yüzdesine (zamanında arşivlendiği varsayılarak) ve daha az gereksiz meta veri sütununa sahiptir. Dizinlerin ve sorguların bu alanı dikkate almasına artık gerek yok. Satır boyutu ne kadar kısa olursa, bir sayfaya o kadar çok satır eklenebilir, SQL Server daha hızlı çalışabilir.
En büyük dezavantaj, operasyonun büyüklüğüdür. Artık bir mantıksal ve hata işleme yerine tek bir işlem yerine iki işlem var. Aksi takdirde tek bir sütunu güncellemekten daha fazla kilitlenmeye yol açabilir. İşlem masanın üzerindeki kilitleri daha uzun tutar ve ilgili iki tablo vardır. Üretim verilerini silmek, en azından benim deneyimime göre, nadiren yapılır. Yine de, ana tablolardan birinde, yaklaşık 100 milyon girişin% 7,5'inde 'DeletedDate' sütununda bir giriş var.
Sorunun cevabı olarak, uygulamanın 'geri alınmamışların' farkında olması gerekir. Aynı işlemi tersi sırayla yapmanız gerekecektir: 'silinmiş' şemadaki satırı ana tabloya ekleyin ve sonra 'silinmiş şemadan satırı silin. Yine hatalardan, yabancı anahtarlarla ve benzeri sorunlardan kaçınmak için bazı ekstra mantık ve hata yönetimi gereklidir.