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.
- Jadi, apakah cascading menghapus pilihan yang benar di sini?
- Kapan cascading detele tidak boleh digunakan?
Jawaban:
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.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.
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
DELETE
kemudian kembaliINSERT
untuk memperbarui baris, terutama ketika apa yang mereka inginkan adalahMERGE
/UPSERT
operasi (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 CASCADE
atur 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.sumber
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.
sumber
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.
sumber