Saya terbiasa melihat baris tabel dengan kolom seperti 'DeletedDate' di dalamnya dan saya tidak menyukainya. Gagasan 'dihapus' adalah bahwa entri seharusnya tidak dibuat sejak awal. Secara praktis, mereka tidak dapat dihapus dari database tetapi saya tidak ingin mereka dengan data panas saya. Baris yang secara logis dihapus adalah, menurut definisi, data dingin kecuali seseorang secara spesifik ingin melihat data yang dihapus.
Selain itu, setiap permintaan yang ditulis harus secara khusus mengecualikannya dan indeks harus mempertimbangkannya juga.
Yang ingin saya lihat adalah perubahan pada tingkat arsitektur basis data dan tingkat aplikasi: buat skema yang disebut 'dihapus'. Setiap tabel yang ditentukan pengguna memiliki padanan yang identik dalam skema 'dihapus' dengan bidang tambahan yang menahan metadata - pengguna yang menghapusnya dan kapan. Kunci asing perlu dibuat.
Selanjutnya, hapus menjadi sisipan-hapus. Pertama, baris yang akan dihapus dimasukkan ke dalam skema mitra 'dihapus'. Baris yang dimaksud di tabel utama kemudian dapat dihapus. Namun, logika tambahan perlu ditambahkan di suatu tempat di sepanjang garis. Pelanggaran kunci asing dapat ditangani.
Kunci asing harus ditangani dengan benar. Ini adalah praktik yang buruk untuk menghapus baris secara logis tetapi yang primer / uniknya memiliki kolom di tabel lain yang merujuknya. Ini seharusnya tidak terjadi. Pekerjaan biasa dapat menghapus baris janda (baris yang kunci utamanya tidak memiliki referensi di tabel lain meskipun ada kunci asing. Namun, ini adalah logika bisnis.
Manfaat keseluruhan adalah pengurangan metadata dalam tabel dan peningkatan kinerja yang dimilikinya. Kolom 'deleteDate' mengatakan bahwa baris ini seharusnya tidak benar-benar ada di sini, tetapi demi kenyamanan, kita membiarkannya di sana dan membiarkan query SQL menanganinya. Jika salinan baris yang dihapus disimpan dalam skema 'dihapus', maka tabel utama dengan data panas memiliki persentase lebih tinggi dari data panas (dengan asumsi itu diarsipkan secara tepat waktu) dan lebih sedikit kolom metadata yang tidak perlu. Indeks & kueri tidak perlu lagi mempertimbangkan bidang ini. Semakin pendek ukuran baris, semakin banyak baris yang bisa dipasang ke halaman, semakin cepat SQL Server dapat bekerja.
Kerugian utama adalah ukuran operasi. Sekarang ada dua operasi bukan satu serta logika tambahan dan penanganan kesalahan. Ini dapat menyebabkan lebih banyak penguncian daripada memperbarui satu kolom jika tidak akan mengambil. Transaksi memegang kunci di atas meja lebih lama dan ada dua meja yang terlibat. Menghapus data produksi, setidaknya dalam pengalaman saya, adalah sesuatu yang jarang dilakukan. Meski begitu, di salah satu tabel utama, 7,5% dari hampir 100 juta entri memiliki entri di kolom 'DeletedDate'.
Sebagai jawaban untuk pertanyaan, aplikasi harus menyadari 'membatalkan penghapusan. Ini hanya perlu melakukan hal yang sama dalam urutan terbalik: masukkan baris dari skema 'dihapus' ke tabel utama dan kemudian hapus baris dari skema 'dihapus. Lagi-lagi beberapa logika & penanganan kesalahan tambahan diperlukan untuk memastikan untuk menghindari kesalahan, masalah dengan kunci asing dan sejenisnya.