Penghapusan fisik vs. logis / lunak dari catatan basis data?

116

Apa keuntungan dari melakukan penghapusan logis / lunak dari sebuah rekaman (yaitu menyetel bendera yang menyatakan bahwa rekaman tersebut dihapus) dibandingkan dengan menghapus rekaman secara aktual atau fisik?

Apakah ini praktik umum?

Apakah ini aman?

pengguna21826
sumber
22
Gunakan hapus stempel waktu, bukan bendera.
Dave Jarvis
@DaveJarvis, dapatkah Anda menjelaskan mengapa menggunakan stempel waktu adalah pendekatan yang lebih baik untuk flag?
C Henry
4
Bendera tidak memberikan informasi apa pun tentang kapan baris itu dihapus. Informasi temporal memiliki banyak kegunaan, termasuk debugging sistem.
Dave Jarvis

Jawaban:

70

Keuntungannya adalah Anda menyimpan riwayat (baik untuk audit) dan Anda tidak perlu khawatir tentang penghapusan secara bertahap melalui berbagai tabel lain dalam database yang mereferensikan baris yang Anda hapus. Kerugiannya adalah Anda harus mengkodekan metode pelaporan / tampilan apa pun untuk memperhitungkan bendera.

Sejauh ini adalah praktik umum - saya akan mengatakan ya, tetapi dengan apa pun apakah Anda menggunakannya tergantung pada kebutuhan bisnis Anda.

EDIT: Memikirkan kerugian lain - Jika Anda memiliki indeks unik pada tabel, catatan yang dihapus masih akan menggunakan catatan "satu", jadi Anda harus mengkodekan kemungkinan itu juga (misalnya, tabel Pengguna yang memiliki indeks unik pada nama pengguna; Catatan yang dihapus masih akan memblokir nama pengguna pengguna yang dihapus untuk catatan baru. Mengatasi masalah ini Anda dapat menempelkan GUID ke kolom nama pengguna yang dihapus, tetapi ini adalah solusi yang sangat hacky yang tidak akan saya rekomendasikan. Mungkin dalam keadaan seperti itu akan lebih baik memiliki aturan bahwa setelah nama pengguna digunakan, itu tidak akan pernah bisa diganti.)

Chris Shaffer
sumber
Display as Active / Deactivated users =) Pada catatan lain jika itu adalah indeks unik (dengan asumsi di sini yang Anda maksud basis data mengendalikan indeks unik) apa yang Anda maksud dengan - itu masih akan memblokir nama pengguna pengguna yang dihapus untuk catatan baru ??
Coops
@CodeBlend - Seperti yang saya jelaskan di atas, jika Anda memiliki tabel Pengguna dengan indeks unik pada kolom Nama Pengguna, maka jika Anda melakukan penghapusan lunak / logis pada pengguna bernama "Chris Shaffer" maka nama pengguna tersebut tidak akan tersedia untuk pengguna baru pengguna untuk membuat akun baru dengan, sedangkan jika Anda melakukan penghapusan keras / fisik maka nama pengguna akan tersedia lagi.
Chris Shaffer
Ah, saya berpikir dalam istilah baris, bukan nama pengguna (nama pengguna). Jika Anda ingin mempertahankan riwayat lengkap, jadi jika ada 'pesanan' atau sesuatu yang ditautkan ke pengguna tersebut, maka Anda harus menggunakan penghapusan lunak / logis.
Coops
11
@ChrisShaffer Alternatifnya, selain GUID, seseorang dapat memilih untuk mengindeks hanya baris yang tidak dihapus. Misalnya: CREATE UNIQUE INDEX ... WHERE DELETED_AT is null(di PostgreSQL) dan kemudian semua baris dengan tanggal penghapusan tidak diindeks. (Mereka dapat dimasukkan dalam indeks non-unik sebagai gantinya.)
KajMagnus
6
@ Chris Shaffer: Kutip "Anda tidak perlu khawatir tentang penghapusan secara bertahap melalui berbagai tabel lain". Tidak benar, Anda harus meneruskan soft delete secara manual, yang sangat merepotkan dan menyebabkan ketidakkonsistenan. Ini sebenarnya merugikan, karena tidak ada lagi penegakan hubungan kunci asing. Anda akan segera berakhir dengan sampah data.
Stefan Steiger
27

Apakah penghapusan logis merupakan praktik umum? Ya, saya telah melihat ini di banyak tempat. Apakah mereka aman? Itu benar-benar tergantung apakah mereka kurang aman dari data sebelum Anda menghapusnya?

Ketika saya menjadi Pimpinan Teknologi, saya menuntut agar tim kami menyimpan setiap bagian data, saya tahu pada saat itu bahwa kami akan menggunakan semua data itu untuk membangun berbagai aplikasi BI, meskipun pada saat itu kami tidak tahu apa persyaratannya. menjadi. Meskipun ini bagus dari sudut pandang audit, pemecahan masalah, dan pelaporan (Ini adalah situs e-niaga / alat untuk transaksi B2B, dan jika seseorang menggunakan alat, kami ingin mencatatnya bahkan jika akun mereka kemudian dimatikan), itu memang memiliki beberapa kelemahan.

Kerugiannya termasuk (tidak termasuk yang lain yang telah disebutkan):

  1. Implikasi Kinerja menyimpan semua data itu, Kami mengembangkan berbagai strategi pengarsipan. Misalnya, satu area aplikasi hampir menghasilkan sekitar 1 Gb data seminggu.
  2. Biaya penyimpanan data terus bertambah seiring waktu, sementara ruang disk murah, jumlah infrastruktur untuk menyimpan dan mengelola terrabyte data baik online maupun offline sangat banyak. Dibutuhkan banyak disk untuk redundansi, dan waktu orang-orang untuk memastikan pencadangan bergerak dengan cepat, dll.

Saat memutuskan untuk menggunakan logis, penghapusan fisik, atau pengarsipan, saya akan bertanya pada diri sendiri pertanyaan-pertanyaan ini:

  1. Apakah data ini yang mungkin perlu dimasukkan kembali ke dalam tabel. Misalnya Akun Pengguna cocok dengan kategori ini karena Anda dapat mengaktifkan atau menonaktifkan akun pengguna. Jika ini kasusnya, penghapusan logis paling masuk akal.
  2. Apakah ada nilai intrinsik dalam menyimpan data? Jika demikian berapa banyak data yang akan dihasilkan. Bergantung pada ini saya akan menggunakan penghapusan logis, atau menerapkan strategi pengarsipan. Ingatlah bahwa Anda selalu dapat mengarsipkan catatan yang dihapus secara logis.
JoshBerke
sumber
Dalam contoh akun pengguna Anda, apakah baik untuk tetap mengaktifkan dan menonaktifkan pengguna di tabel terpisah? Misalnya. Activatedtabel dan Deactivatedskema tabel - Id,Name,etc..Baris masuk Activated- 1001,Smith007,etc...Ketika dia dinonaktifkan, maka kita dapat menghapus semua kecuali kolom ID untuk smith in Activateddan menambahkannya ke Deactivated.
Erran Morad
Apa manfaatnya memindahkan semua data jika Anda akan meninggalkan Id dan baris? Mungkin jika catatan Anda sangat besar tetapi saya akan melihatnya sebagai pengoptimalan mikro.
JoshBerke
Semoga berhasil dengan batasan kunci asing berjenjang jika Anda memindahkan data di sekitar tabel.
Pria CAD
20

Mungkin agak terlambat tetapi saya menyarankan semua orang untuk memeriksa posting blog Pinal Dave tentang penghapusan logis / lunak:

Saya hanya tidak suka desain seperti ini [soft delete] sama sekali. Saya sangat percaya pada arsitektur di mana hanya data yang diperlukan harus berada dalam satu tabel dan data yang tidak berguna harus dipindahkan ke tabel yang diarsipkan. Alih-alih mengikuti kolom isDeleted, saya menyarankan penggunaan dua tabel berbeda: satu dengan pesanan dan satu lagi dengan pesanan yang dihapus. Dalam hal ini, Anda harus memelihara kedua tabel tersebut, tetapi kenyataannya, sangat mudah untuk dipelihara. Ketika Anda menulis pernyataan UPDATE ke kolom isDeleted, tulis INSERT INTO another table dan DELETE dari tabel asli. Jika situasinya adalah rollback, tulis INSERT INTO dan DELETE lainnya dengan urutan terbalik. Jika Anda khawatir tentang transaksi yang gagal, bungkus kode ini dalam TRANSACTION.

Apa keuntungan dari tabel yang lebih kecil ayat tabel yang lebih besar dalam situasi yang dijelaskan di atas?

  • Meja yang lebih kecil mudah dirawat
  • Operasi Index Rebuild jauh lebih cepat
  • Memindahkan data arsip ke grup file lain akan mengurangi beban grup file utama (mengingat semua grup file berada di sistem yang berbeda) - ini juga akan mempercepat pencadangan juga.
  • Statistik akan sering diperbarui karena ukurannya yang lebih kecil dan ini akan mengurangi penggunaan sumber daya.
  • Ukuran indeks akan lebih kecil
  • Kinerja tabel akan meningkat dengan ukuran tabel yang lebih kecil.
Tohid
sumber
16
bagaimana Anda menangani kunci asing menggunakan metode seperti itu? Mungkin ada 1, 10 atau lebih tabel lain yang mereferensikan rekaman yang sedang dihapus dan pindah ke tabel lain!
sam360
@ sam360 - itu tantangan besar. Sejujurnya, saya pribadi gagal menerapkan rekomendasi di atas dalam proyek saya, karena menangani PK dan hubungan antar tabel. Sayangnya tidak ada contoh dunia nyata di artikel itu. Saya sedang mengerjakan solusi di salah satu proyek saya, jika ternyata implementasi yang baik, saya akan membagikan kodenya dengan Anda ...
Tohid
disebut apakah itu ? bukannya hapus-lunak?
eugene
1
@eugene - Saya tidak tahu istilah khusus untuk solusi ini. Ini benar - benar baris "hapus" dan simpan catatan yang dihapus dalam pendekatan tabel "arsip" , jika masuk akal bagi Anda.
Tohid
1
Saya percaya, "Memindahkan data arsip ke grup file lain" dapat diimplementasikan sebagai partisi di Oracle, jadi seseorang mendapat manfaat yang tercantum di atas ...
Betlista
14

Saya adalah pengembang NoSQL, dan pada pekerjaan terakhir saya, saya bekerja dengan data yang selalu penting bagi seseorang, dan jika dihapus secara tidak sengaja pada hari yang sama saat dibuat, saya tidak dapat menemukannya di cadangan terakhir dari kemarin! Dalam situasi seperti itu, penghapusan lembut selalu menyelamatkan hari.

Saya melakukan soft-deletion menggunakan stempel waktu, mendaftarkan tanggal dokumen dihapus:

IsDeleted = 20150310  //yyyyMMdd

Setiap hari Minggu, proses berjalan di database dan memeriksa IsDeletedlapangan. Jika perbedaan antara tanggal sekarang dan stempel waktu lebih besar dari N hari, dokumen itu dihapus permanen. Mengingat dokumen tersebut masih tersedia di beberapa cadangan, itu aman untuk dilakukan.

EDIT: Kasus penggunaan NoSQL ini tentang dokumen besar yang dibuat dalam database, puluhan atau ratusan di antaranya setiap hari, tetapi tidak ribuan atau jutaan. Secara umum, mereka adalah dokumen dengan status, data, dan lampiran proses alur kerja. Itulah alasan mengapa ada kemungkinan pengguna menghapus dokumen penting. Pengguna ini bisa jadi seseorang dengan hak istimewa Admin, atau mungkin pemilik dokumen, hanya untuk beberapa nama.

TL; DR Kasus penggunaan saya bukan Big Data. Dalam hal ini, Anda memerlukan pendekatan yang berbeda.

Mario S
sumber
9

Salah satu pola yang saya gunakan adalah membuat tabel cermin dan melampirkan pemicu pada tabel utama, sehingga semua penghapusan (dan pembaruan jika diinginkan) dicatat di tabel cermin.

Hal ini memungkinkan Anda untuk "merekonstruksi" catatan yang dihapus / diubah, dan Anda masih dapat menghapus secara paksa di tabel utama dan menjaganya tetap "bersih" - ini juga memungkinkan pembuatan fungsi "urung", dan Anda juga dapat merekam tanggal, waktu , dan pengguna yang melakukan tindakan di meja cermin (sangat berharga dalam situasi perburuan penyihir).

Keuntungan lainnya adalah tidak ada kemungkinan secara tidak sengaja menyertakan rekaman yang dihapus saat melakukan kueri dari yang utama kecuali jika Anda sengaja mengalami masalah saat memasukkan rekaman dari tabel cermin (Anda mungkin ingin memperlihatkan rekaman langsung dan dihapus).

Keuntungan lainnya adalah tabel cermin dapat dihapus secara independen, karena tidak boleh memiliki referensi kunci asing yang sebenarnya, menjadikannya operasi yang relatif sederhana dibandingkan dengan pembersihan dari tabel utama yang menggunakan penghapusan lunak tetapi masih memiliki koneksi referensial ke tabel lain.

Keuntungan lain apa? - bagus jika Anda memiliki banyak pembuat kode yang mengerjakan proyek, membaca di database dengan keterampilan campuran dan perhatian pada tingkat detail, Anda tidak perlu begadang dengan harapan salah satu dari mereka tidak lupa untuk tidak menyertakan dihapus catatan (lol, Not Include Deleted Records = True), yang menghasilkan hal-hal seperti melebih-lebihkan, katakanlah posisi kas tersedia klien yang kemudian mereka beli beberapa saham (misalnya, seperti dalam sistem perdagangan), ketika Anda bekerja dengan sistem perdagangan, Anda akan mengetahui dengan sangat cepat nilai dari solusi yang kuat, meskipun mereka mungkin memiliki sedikit lebih banyak "overhead" awal.

Pengecualian:
- sebagai panduan, gunakan penghapusan lunak untuk data "referensi" seperti pengguna, kategori, dll., Dan hapus permanen ke tabel cermin untuk data jenis "fakta", yaitu riwayat transaksi.

Code Warrior
sumber
5

Saya biasanya menggunakan penghapusan logis - saya merasa mereka bekerja dengan baik ketika Anda juga sesekali mengarsipkan dari data yang 'dihapus' ke tabel yang diarsipkan (yang dapat dicari jika perlu) sehingga tidak memiliki peluang untuk mempengaruhi kinerja aplikasi.

Ini berfungsi dengan baik karena Anda masih memiliki datanya jika Anda pernah diaudit. Jika Anda menghapusnya secara fisik, itu hilang !

Galwegian
sumber
5

Saya penggemar berat penghapusan logis, terutama untuk aplikasi Lini Bisnis, atau dalam konteks akun pengguna. Alasan saya sederhana: sering kali saya tidak ingin pengguna dapat menggunakan sistem lagi (sehingga akun ditandai sebagai dihapus), tetapi jika kami menghapus pengguna, kami akan kehilangan semua pekerjaan mereka dan semacamnya.

Skenario umum lainnya adalah bahwa pengguna mungkin dibuat ulang beberapa saat setelah dihapus. Ini adalah pengalaman yang jauh lebih baik bagi pengguna untuk menampilkan semua data seperti sebelum dihapus, daripada harus membuatnya kembali.

Saya biasanya menganggap menghapus pengguna lebih sebagai "menangguhkan" mereka tanpa batas. Anda tidak pernah tahu kapan mereka benar-benar harus kembali.

Jon Dewees
sumber
Bukankah kita harus menggunakan sesuatu seperti aktivasi / penonaktifan akun alih-alih penghapusan logis di sini? @ jon-dewees
Eagle_Eye
4

Saya hampir selalu menghapus sementara dan inilah alasannya:

  • Anda dapat memulihkan data yang dihapus jika pelanggan meminta Anda untuk melakukannya. Pelanggan yang lebih senang dengan penghapusan lunak. Mengembalikan data tertentu dari cadangan itu rumit
  • memeriksa di isdeletedmana - mana tidak menjadi masalah, Anda harus memeriksauserid tetap (jika database berisi data dari banyak pengguna). Anda dapat menerapkan pemeriksaan dengan kode, dengan menempatkan dua pemeriksaan tersebut pada fungsi terpisah (atau menggunakan tampilan)
  • hapus dengan anggun. Pengguna atau proses yang berurusan dengan konten yang dihapus akan terus "melihatnya" sampai mereka menekan penyegaran berikutnya. Ini adalah fitur yang sangat diinginkan jika suatu proses sedang memproses beberapa data yang tiba-tiba terhapus
  • sinkronisasi: jika Anda perlu merancang mekanisme sinkronisasi antara database dan aplikasi seluler, Anda akan lebih mudah menerapkan soft delete untuk diterapkan
Gianluca Ghettini
sumber
@Jim mempertahankan data ke database itu tidak ilegal. itu ilegal jika Anda menyimpan catatan bahkan setelah pelanggan menyuruh Anda menghapus datanya sendiri. Penghapusan lunak sangat kompatibel dengan GDPR: atas permintaan, cukup timpa data yang masuk akal dengan data kosong. Selain itu, jika pengguna menghapus catatan, ia mungkin ingin membatalkan tindakan di kemudian hari atau memulihkan datanya entah bagaimana ... itu tidak berarti ia ingin datanya menghilang sepenuhnya dari database
Gianluca Ghettini
3

Re: "Apakah ini aman?" - tergantung apa yang kamu maksud.

Jika Anda bermaksud bahwa dengan melakukan penghapusan fisik, Anda akan mencegah siapa pun menemukan data yang dihapus , maka ya, itu lebih atau kurang benar; Anda lebih aman dalam menghapus data sensitif yang perlu dihapus secara fisik, karena itu berarti data tersebut hilang secara permanen dari database. (Namun, ketahuilah bahwa mungkin ada salinan lain dari data yang dipermasalahkan, seperti di cadangan, atau log transaksi, atau versi yang direkam dari transit, mis. Packet sniffer - hanya karena Anda menghapus dari database Anda tidak menjamin itu tidak disimpan di tempat lain.)

Jika Anda bermaksud bahwa dengan melakukan penghapusan logis, data Anda lebih aman karena Anda tidak akan pernah kehilangan data apa pun , itu juga benar. Ini bagus untuk skenario audit; Saya cenderung merancang seperti ini karena mengakui fakta dasar bahwa begitu data dibuat, data tidak akan pernah benar - benar hilang (terutama jika pernah memiliki kemampuan, katakanlah, di-cache oleh mesin pencari internet). Tentu saja, skenario audit nyata mensyaratkan bahwa tidak hanya penghapusan logis, tetapi pembaruan juga dicatat, bersama dengan waktu perubahan dan aktor yang membuat perubahan.

Jika Anda bermaksud bahwa data tidak akan jatuh ke tangan siapa pun yang tidak seharusnya melihatnya, maka itu sepenuhnya terserah aplikasi Anda dan struktur keamanannya. Dalam hal ini, penghapusan logis tidak lebih atau kurang aman dari apa pun di database Anda.

Ian Varley
sumber
3

Saya sangat tidak setuju dengan penghapusan logis karena Anda menghadapi banyak kesalahan.

Pertama-tama kueri, setiap kueri harus menjaga bidang IsDeleted dan kemungkinan kesalahan menjadi lebih tinggi dengan kueri kompleks.

Kedua kinerja: bayangkan tabel dengan 100000 recs dengan hanya 3 aktif, sekarang kalikan angka ini untuk tabel database Anda; masalah kinerja lainnya adalah kemungkinan konflik dengan catatan baru dengan yang lama (catatan yang dihapus).

Satu-satunya keuntungan yang saya lihat adalah riwayat rekaman, tetapi ada metode lain untuk mencapai hasil ini, misalnya Anda dapat membuat tabel pencatatan di mana Anda dapat menyimpan info: di TableName,OldValues,NewValues,Date,User,[..]mana *Valuesbisa varchardan menulis detailnya dalam formulir ini fieldname : value; [..] atau simpan info sebagai xml.

Semua ini dapat dicapai melalui kode atau Pemicu tetapi Anda hanya SATU tabel dengan semua riwayat Anda. Opsi lainnya adalah untuk melihat apakah mesin database yang ditentukan adalah dukungan asli untuk pelacakan perubahan, misalnya pada database SQL Server terdapat SQL Track Data Change.

Max
sumber
3

Saya biasa melakukan soft-delete, hanya untuk menyimpan catatan lama. Saya menyadari bahwa pengguna tidak repot-repot melihat rekaman lama sesering yang saya kira. Jika pengguna ingin melihat catatan lama, mereka bisa melihat dari arsip atau tabel audit, bukan? Jadi, apa keuntungan soft-delete? Ini hanya mengarah ke pernyataan kueri yang lebih kompleks, dll.

Berikut adalah hal-hal yang telah saya terapkan, sebelum saya memutuskan untuk tidak menghapus-lunak lagi:

  1. mengimplementasikan audit, untuk merekam semua aktivitas (menambah, mengedit, menghapus). Pastikan tidak ada kunci asing yang ditautkan ke audit, dan pastikan tabel ini diamankan dan tidak ada yang dapat menghapus kecuali administrator.

  2. mengidentifikasi tabel mana yang dianggap sebagai "tabel transaksional", yang kemungkinan besar akan disimpan untuk waktu yang lama, dan kemungkinan besar pengguna ingin melihat catatan atau laporan sebelumnya. Sebagai contoh; transaksi pembelian. Tabel ini tidak hanya menyimpan id tabel master (seperti dept-id), tetapi juga menyimpan info tambahan seperti nama sebagai referensi (seperti nama-dept), atau bidang lain yang diperlukan untuk pelaporan.

  3. Menerapkan catatan "aktif / tidak aktif" atau "aktifkan / nonaktifkan" atau "sembunyikan / tampilkan" dari tabel master. Jadi, alih-alih menghapus record, pengguna dapat menonaktifkan / menonaktifkan master record. Jauh lebih aman dengan cara ini.

Hanya opini dua sen saya.

David
sumber
2

Penghapusan logis jika sulit pada integritas referensial.

Ini adalah pemikiran yang tepat untuk dilakukan bila ada aspek temporal dari data tabel (berlaku FROM_DATE - TO_DATE).

Jika tidak, pindahkan data ke Tabel Pengauditan dan hapus catatan.

Sisi positifnya:

Ini adalah cara termudah untuk melakukan rollback (jika memungkinkan).

Sangat mudah untuk melihat bagaimana keadaan pada titik waktu tertentu.

pkario
sumber
2

Ini cukup standar dalam kasus di mana Anda ingin menyimpan riwayat sesuatu (mis. Akun pengguna seperti yang disebutkan @Jon Dewees). Dan tentu saja merupakan ide bagus jika ada kemungkinan besar pengguna meminta penghapusan.

Jika Anda khawatir tentang logika memfilter rekaman yang dihapus dari kueri Anda menjadi berantakan dan hanya memperumit kueri Anda, Anda bisa membuat tampilan yang melakukan pemfilteran untuk Anda dan menggunakan kueri untuk itu. Ini akan mencegah kebocoran catatan ini dalam solusi pelaporan dan semacamnya.

BQ.
sumber
2

Ada persyaratan di luar desain sistem yang perlu dijawab. Apa persyaratan hukum atau undang-undang dalam penyimpanan catatan? Bergantung pada apa baris terkait, mungkin ada persyaratan hukum bahwa data disimpan untuk jangka waktu tertentu setelah 'ditangguhkan'.

Di sisi lain, persyaratannya mungkin sekali catatan 'dihapus', itu benar-benar dihapus dan tidak dapat dibatalkan. Sebelum Anda membuat keputusan, bicarakan dengan pemangku kepentingan Anda.

Dave
sumber
2

Aplikasi seluler yang bergantung pada sinkronisasi mungkin memberlakukan penggunaan penghapusan logis daripada penghapusan fisik: server harus dapat menunjukkan kepada klien bahwa catatan telah (ditandai sebagai) dihapus, dan ini mungkin tidak dapat dilakukan jika catatan dihapus secara fisik.

axd
sumber
1

Mereka tidak membiarkan database bekerja sebagaimana mestinya membuat hal-hal seperti fungsi kaskade menjadi tidak berguna.

Untuk hal-hal sederhana seperti sisipan, dalam kasus penyisipan ulang, maka kode di belakangnya akan berlipat ganda.

Anda tidak bisa begitu saja menyisipkan, sebagai gantinya Anda harus memeriksa keberadaan dan menyisipkan jika tidak ada sebelumnya atau memperbarui bendera penghapusan jika ada sementara juga memperbarui semua kolom lain ke nilai baru. Ini dilihat sebagai pembaruan ke log transaksi database dan bukan penyisipan baru yang menyebabkan log audit tidak akurat.

Mereka menyebabkan masalah kinerja karena tabel dipenuhi dengan data yang berlebihan. Ini memainkan kekacauan dengan pengindeksan terutama dengan keunikan.

Saya bukan penggemar berat penghapusan logis.

Taqveem
sumber
1

Untuk membalas komentar Tohid, kami menghadapi masalah yang sama di mana kami ingin mempertahankan sejarah catatan dan juga kami tidak yakin apakah kami ingin is_deletedkolom atau tidak.

Saya berbicara tentang implementasi python kami dan kasus penggunaan serupa yang kami pukul.

Kami menemukan https://github.com/kvesteri/sqlalchemy-continuum yang merupakan cara mudah untuk mendapatkan tabel versi untuk tabel Anda yang sesuai. Baris kode minimum dan riwayat menangkap untuk menambah, menghapus, dan memperbarui.

Ini melayani lebih dari sekedar is_deletedkolom. Anda selalu dapat mengembalikan tabel versi untuk memeriksa apa yang terjadi dengan entri ini. Apakah entri dihapus, diperbarui atau ditambahkan.

Dengan cara ini kami tidak perlu memiliki is_deletedkolom sama sekali dan fungsi hapus kami cukup sepele. Dengan cara ini kita juga tidak perlu mengingat untuk menandai is_deleted=Falsedi salah satu api kita.

Lalit
sumber
0

Soft Delete adalah praktik pemrograman yang diikuti di sebagian besar aplikasi jika datanya lebih relevan. Pertimbangkan kasus aplikasi keuangan di mana penghapusan karena kesalahan pengguna akhir bisa berakibat fatal. Itulah kasus ketika hapus lembut menjadi relevan. Dalam penghapusan lunak, pengguna tidak benar-benar menghapus data dari rekaman melainkan ditandai sebagai IsDeleted to true (Dengan konvensi normal).

Dalam EF 6.x atau EF 7 dan seterusnya Softdelete ditambahkan sebagai atribut tetapi kita harus membuat atribut khusus untuk saat ini.

Saya sangat merekomendasikan SoftDelete Dalam desain database dan konvensi yang baik untuk praktik pemrograman.

Sanu Antony
sumber
0

Seringkali softdeleting digunakan karena Anda tidak ingin mengekspos beberapa data tetapi Anda harus menyimpannya karena alasan historis (Sebuah produk dapat dihentikan, jadi Anda tidak ingin ada transaksi baru dengannya tetapi Anda masih perlu bekerja dengannya. sejarah transaksi penjualan). Ngomong-ngomong, ada juga yang menyalin nilai informasi produk di data transaksi penjualan alih-alih membuat referensi ke produk untuk menangani hal ini.

Nyatanya, ini lebih terlihat seperti merekam ulang untuk fitur yang terlihat / tersembunyi atau aktif / tidak aktif. Karena itulah arti "hapus" dalam dunia bisnis. Saya ingin mengatakan bahwa Terminator dapat menghapus orang tetapi bos hanya memecat mereka.

Latihan ini adalah pola yang cukup umum dan digunakan oleh banyak aplikasi karena berbagai alasan. Karena Ini bukan satu-satunya cara untuk mencapai ini, jadi Anda akan melihat ribuan orang mengatakan itu hebat atau omong kosong dan keduanya memiliki argumen yang cukup bagus.

Dari sudut pandang keamanan, SoftDelete tidak akan menggantikan pekerjaan Audit dan juga tidak akan menggantikan pekerjaan cadangan. Jika Anda takut dengan "penyisipan / penghapusan antara dua kasus cadangan", Anda harus membaca tentang Model Pemulihan Penuh atau Massal. Saya akui bahwa SoftDelete dapat membuat proses pemulihan menjadi lebih sepele.

Terserah Anda untuk mengetahui kebutuhan Anda.

Marco Guignard
sumber
0

Sebagai alternatif, kami memiliki pengguna yang menggunakan perangkat jarak jauh yang memperbarui melalui MobiLink. Jika kita menghapus record di database server, record tersebut tidak akan pernah ditandai dihapus di database klien.

Jadi kami melakukan keduanya. Kami bekerja dengan klien kami untuk menentukan berapa lama mereka ingin dapat memulihkan data. Misalnya, umumnya pelanggan dan produk aktif hingga klien kami mengatakan bahwa mereka harus dihapus, tetapi riwayat penjualan hanya disimpan selama 13 bulan dan kemudian dihapus secara otomatis. Klien mungkin ingin menyimpan pelanggan dan produk yang dihapus selama dua bulan tetapi mempertahankan sejarah selama enam bulan.

Jadi kami menjalankan skrip semalaman yang menandai hal-hal yang dihapus secara logis sesuai dengan parameter ini dan kemudian dua / enam bulan kemudian, apa pun yang ditandai dihapus secara logis hari ini akan dihapus secara permanen.

Kami kurang tentang keamanan data daripada memiliki database yang sangat besar pada perangkat klien dengan memori terbatas, seperti smartphone. Seorang klien yang memesan 200 produk dua kali seminggu selama empat tahun akan memiliki lebih dari 81.000 baris riwayat, di mana 75% klien tidak peduli jika dia melihatnya.

TychaBrahe
sumber
0

Itu semua tergantung pada kasus penggunaan sistem dan datanya.

Misalnya, jika Anda berbicara tentang sistem yang diatur oleh pemerintah (misalnya sistem di perusahaan farmasi yang dianggap sebagai bagian dari sistem mutu dan harus mengikuti pedoman FDA untuk catatan elektronik), maka sebaiknya Anda tidak melakukan hard delete! Auditor dari FDA dapat masuk dan meminta semua catatan dalam sistem yang berkaitan dengan nomor produk ABC-123, dan semua data sebaiknya tersedia. Jika pemilik proses bisnis Anda mengatakan bahwa sistem tidak boleh mengizinkan siapa pun untuk menggunakan nomor produk ABC-123 pada rekaman baru di masa mendatang, gunakan metode hapus lunak untuk membuatnya "tidak aktif" dalam sistem, sambil tetap mempertahankan data historis.

Namun, mungkin sistem Anda dan datanya memiliki kasus penggunaan seperti "melacak cuaca di Kutub Utara". Mungkin Anda melakukan pembacaan suhu sekali setiap jam, dan pada penghujung hari menjumlahkan rata-rata harian. Mungkin data per jam tidak akan pernah digunakan lagi setelah agregasi, dan Anda akan menghapus pembacaan per jam setelah membuat agregat. (Ini adalah contoh yang dibuat-buat dan sepele.)

Intinya adalah, itu semua tergantung pada kasus penggunaan sistem dan datanya, dan bukan keputusan yang dibuat murni dari sudut pandang teknologi.

Kode keras
sumber
0

Baik! Seperti yang dikatakan semua orang, itu tergantung situasinya.

Jika Anda memiliki indeks pada kolom seperti UserName atau EmailID - dan Anda tidak pernah mengharapkan UserName atau EmailID yang sama digunakan lagi; Anda bisa menggunakan soft delete.

Karena itu, selalu periksa apakah operasi SELECT Anda menggunakan kunci utama. Jika pernyataan SELECT Anda menggunakan kunci utama, menambahkan bendera dengan klausa WHERE tidak akan membuat banyak perbedaan. Mari kita ambil contoh (Pseudo):

Pengguna Tabel (UserID [primary key], EmailID, IsDeleted)

SELECT * FROM Users where UserID = 123456 and IsDeleted = 0

Kueri ini tidak akan membuat perbedaan apa pun dalam hal kinerja karena kolom UserID memiliki kunci utama. Awalnya, ini akan memindai tabel berdasarkan PK dan kemudian menjalankan kondisi selanjutnya.

Kasus di mana penghapusan lunak tidak dapat bekerja sama sekali:

Daftar di sebagian besar situs web menggunakan EmailID sebagai identifikasi unik Anda. Kami tahu betul, sekali EmailID digunakan di situs web seperti facebook, G +, itu tidak dapat digunakan oleh orang lain.

Ada saatnya pengguna ingin menghapus profilnya dari situs web. Sekarang, jika Anda membuat penghapusan logis, pengguna tersebut tidak akan pernah bisa mendaftar lagi. Selain itu, mendaftar lagi menggunakan EmailID yang sama tidak berarti memulihkan seluruh riwayat. Semua orang tahu, penghapusan berarti penghapusan. Dalam skenario seperti itu, kami harus melakukan penghapusan fisik. Namun untuk mempertahankan seluruh riwayat akun, kami harus selalu mengarsipkan catatan tersebut di tabel arsip atau tabel yang dihapus.

Ya, dalam situasi di mana kami memiliki banyak tabel asing, penanganannya cukup rumit.

Juga perlu diingat bahwa penghapusan lunak / logis akan meningkatkan ukuran tabel Anda, jadi ukuran indeks.

Jiten
sumber
0

Saya sudah menjawab di posting lain . Namun, saya rasa jawaban saya lebih cocok dengan pertanyaan di sini.

Solusi praktis saya untuk soft-delete adalah pengarsipan dengan membuat tabel baru dengan kolom berikut: original_id, table_name, payload, (dan opsional primary key `id).

Di mana original_idid asli dari catatan yang dihapus, table_name adalah nama tabel dari catatan yang dihapus ( "user"dalam kasus Anda), payloadadalah string yang dirangkai JSON dari semua kolom dari catatan yang dihapus.

Saya juga menyarankan membuat indeks pada kolom original_iduntuk pengambilan data terakhir.

Dengan cara pengarsipan data. Anda akan mendapatkan keuntungan ini

  • Lacak semua data dalam sejarah
  • Hanya memiliki satu tempat untuk mengarsipkan rekaman dari tabel mana pun, terlepas dari struktur tabel rekaman yang dihapus
  • Tidak perlu khawatir indeks unik dalam tabel asli
  • Tidak perlu khawatir memeriksa indeks asing di tabel asli
  • Tidak ada lagi WHEREklausa di setiap kueri untuk memeriksa penghapusan

Ini sudah diskusi di sini menjelaskan mengapa soft-penghapusan adalah bukan ide yang baik dalam praktek. Soft-delete menimbulkan beberapa potensi masalah di masa mendatang seperti menghitung record, ...

transang
sumber
Saya telah menulis posting blog tentang semua cara penghapusan data transang.me/database-design-practice-soft-deletion-to
transang
0

Keuntungan adalah pelestarian / pelestarian data. Disventage akan menurunkan kinerja saat membuat kueri atau mengambil data dari tabel dengan jumlah soft delete yang signifikan. Dalam kasus kami, kami menggunakan kombinasi keduanya: seperti yang telah disebutkan orang lain dalam jawaban sebelumnya, kami soft-delete users/clients/customersmisalnya, dan hard-deletepada items/products/merchandisetabel di mana ada rekaman duplikat yang tidak perlu bee keept.

Santiago berhenti SO
sumber
0

Itu tergantung pada kasusnya, pertimbangkan hal di bawah ini:

Biasanya, Anda tidak perlu "menghapus lunak" data. Tetap sederhana dan cepat. mis. Menghapus produk tidak lagi tersedia, jadi Anda tidak perlu memeriksa bahwa produk tidak dihapus untuk sementara di seluruh aplikasi Anda (jumlah, daftar produk, produk yang direkomendasikan, dll.).

Namun, Anda mungkin mempertimbangkan "hapus lunak" dalam model gudang data. mis. Anda sedang melihat tanda terima lama pada produk yang dihapus. *

Kris Khairallah
sumber