Apakah ada waktu di mana kita harus menghindari penghapusan Cascading?

11

Dalam SQL Server 2008, ada tabel utama yang ditautkan ke tiga tabel anak lainnya oleh 1 ke banyak hubungan. Jadi, kami berpikir untuk menggunakan penghapusan Cascading di tabel utama, sehingga semua catatan di tabel anak akan dihapus ketika catatan dari tabel utama dihapus.

  1. Jadi, apakah cascading menghapus pilihan yang benar di sini?
  2. Kapan cascading detele tidak boleh digunakan?
Ramesh
sumber
3
Tidak ada yang bisa menjawab ini tanpa mengetahui kasus penggunaan Anda. Hapus Cascading selalu memiliki risiko data dihapus dengan mudah. Pada dasarnya saya sangat jarang menggunakannya, dalam hal ini adalah perilaku yang diinginkan. Ini adalah tabel yang dimodifikasi secara umum.
dezso

Jawaban:

17

Saya umumnya waspada terhadap penghapusan bertingkat (dan tindakan otomatis lainnya yang dapat menjatuhkan / merusak data), baik melalui pemicu atau ON <something> CASCADE. Fasilitas seperti itu sangat kuat, tetapi juga berpotensi berbahaya.

  • Jadi, apakah cascading menghapus pilihan yang benar di sini?

Itu pasti akan melakukan apa yang Anda cari untuk dilakukan: menghapus catatan terkait ketika catatan orang tua dihapus, tanpa Anda perlu menerapkan logika lain untuk memastikan bahwa anak-anak dihapus terlebih dahulu sehingga membuat kode Anda lebih ringkas. Semua tindakan akan dibungkus dalam transaksi implisit sehingga jika sesuatu menghalangi anak menghapus seluruh operasi diblokir, menjaga integritas referensial dengan sedikit atau tanpa upaya pengkodean tambahan.

Pastikan bahwa Anda menggunakan penghapusan bertingkat dan tindakan "di balik layar" lainnya didokumentasikan dengan baik sehingga pengelola sistem di masa mendatang sepenuhnya menyadarinya.

  • Kapan cascading detele tidak boleh digunakan?

Seharusnya tidak digunakan jika Anda paranoid seperti saya! Satu poin kunci untuk dipertimbangkan adalah pengembang lain yang saat ini, atau mungkin di masa depan, mengerjakan kode / basis data Anda (karenanya komentar di atas tentang mendokumentasikan perilaku "tersembunyi").

Sangat umum dalam pengalaman saya untuk orang yang tidak berpengalaman untuk menggunakan DELETEkemudian kembali INSERTuntuk memperbarui baris, terutama ketika apa yang mereka inginkan adalah MERGE/ UPSERToperasi (perbarui baris yang ada dan buat yang baru di mana baris dengan kunci yang diberikan tidak ada) dan DBMS tidak mendukung penggabungan / peningkatan (atau mereka tidak mengetahui dukungannya). Tanpa tindakan bertingkat ini sangat aman (atau akan kesalahan ketika mengancam integritas data) tetapi jika seseorang melakukan ini untuk baris dalam tabel induk di mana merujuk FK memilikiON DELETE CASCADEatur maka data terkait akan dihapus sebagai akibat dari penghapusan awal dan tidak diganti - sehingga data hilang (bahkan jika penghapusan dan penyisipan berikutnya dibungkus dalam transaksi eksplisit, kaskade terjadi dengan operasi penghapusan - itu tidak akan menunggu untuk melihat apakah transaksi menggantikan baris dalam tabel induk dalam pernyataan berikutnya) dan kaskade dapat dilanjutkan melalui kapal relasi lainnya (misalnya: hapus supervisor senior, timnya dihapus oleh kaskade, tim timnya dihapus oleh kaskade, semua catatan terlacak untuk semua orang itu dihapus oleh kaskade, ...). Tanpa cascading diaktifkan, Anda hanya akan mendapatkan kesalahan di sini alih-alih data hilang secara diam-diam.

David Spillett
sumber
Apakah akan ada implikasi kinerja? Seperti mendapatkan kunci dan menghapus secara manual akan lebih baik daripada kaskade?
Ramesh
Saya akan berasumsi bahwa akan ada sedikit perbedaan, dengan asumsi Anda memiliki lebih banyak proses manual yang dibungkus dalam transaksi eksplisit yang harus Anda lakukan untuk masalah konsistensi. Baik metode manual dan otomatis (kaskade) akan dipengaruhi oleh tingkat penguncian dan isolasi begitu konkurensi dipertimbangkan, tentu saja.
David Spillett
4

Saya kira jawabannya bermuara pada apakah atau tidak masuk akal untuk situasi Anda, itu tergantung . Untuk situasi Anda, apakah masuk akal jika baris di tabel 'child' tetap ada jika baris 'primer' yang bersesuaian pergi? Apakah data dalam tabel anak tidak akan berarti tanpa orang tua? Jika demikian, maka penghapusan cascading akan menegakkan integritas referensial. Anda mungkin ingin menjaga baris anak sebagai catatan, arsip aktivitas masa lalu (meskipun berpotensi Anda bisa menulis baris ini ke tabel lain khusus untuk tujuan ini).

Contoh yang saya gunakan untuk menggambarkan hal ini adalah hubungan dokter / pasien. Satu dokter dapat memiliki banyak pasien. Seorang pasien hanya dapat menjadi pasien jika mereka memiliki dokter. Jika dokter pergi (meninggalkan praktik) maka sesuatu harus terjadi pada pasien yang tersisa. Satu kemungkinan adalah bahwa mereka dibersihkan. Lain adalah bahwa nilai default menggantikan referensi doc atau mereka dapat dihapus dari tabel utama dan ditempatkan di tempat lain. Atau tidak ada aktivitas yang terjadi dan pasien tetap seperti itu, tidak tersentuh, seolah-olah dokter itu masih ada. Itu tergantung apa yang ingin Anda lakukan.

Dari pengalaman pribadi, pikirkan baik-baik tentang desain database. Minggu ini saya harus menjalankan pembersihan catatan yatim di sebuah meja yang menunjuk ke mana-mana dan benar-benar mengambil ruang.

the_good_pony
sumber
Saya harus menghapus catatan anak ketika catatan induk hilang.
Ramesh
Jika catatan harus benar-benar masuk dan tidak masuk akal untuk disimpan, maka penghapusan bertingkat akan lebih masuk akal dalam situasi Anda
the_good_pony
3

Menggunakan penghapusan cascading adalah masalah preferensi pribadi, seperti apakah akan memberi nama tabel dengan nama jamak atau tidak (Pelanggan vs Pelanggan).

Saya lebih suka tidak pernah menggunakan cascading delete. Beberapa desain basis data tidak menghapus sama sekali. Ada beberapa justifikasi untuk menghapus data dari database ketika ruang disk sangat murah. Beberapa desain basis data menetapkan bidang tambahan "IsDeleted" daripada menghapus data secara fisik.

Jika Anda harus menghapus data kemudian menggunakan prosedur tersimpan untuk mengelola ini memberi Anda lebih banyak transparansi dan kontrol. Aplikasi Anda dapat menjalankan prosedur tersimpan yang dihapus dari anak lalu orang tua. Anda tidak tahu bagaimana persyaratan bisnis akan berubah seiring waktu sehingga sp akan memberi Anda lebih banyak fleksibilitas. Itu 2c saya.

sa555
sumber
Benar, ini memberi Anda lebih banyak fleksibilitas, tetapi juga memperkenalkan perilaku "tersembunyi", yang berarti Anda harus memiliki dokumentasi tambahan untuk sps tersebut (sehingga ppl tahu tindakan bisnis apa yang memerlukan sp apa) cara lain bisa dengan membatasi pengguna sql hanya menjadi mampu mengeksekusi sps tersebut dan tidak menjalankan sisipan / pembaruan "biasa" lainnya.
DrCopyPaste