Database: Untuk menghapus atau tidak menghapus catatan

117

Saya tidak berpikir saya satu-satunya orang yang bertanya-tanya tentang ini. Apa yang biasanya Anda praktikkan tentang perilaku database? Apakah Anda lebih suka menghapus record dari database secara fisik? Atau lebih baik hanya menandai record dengan flag "dihapus" atau kolom boolean untuk menunjukkan record aktif atau tidak aktif?

jerbersoft.dll
sumber
67
... apakah ini lebih mulia dalam database yang mengalami pembengkakan dan redundansi bendera, atau membawa DELETE ke tabel catatan, Dan dengan menghapus, akhiri mereka. Untuk menghapus, tidur;
nickf
7
Hei! Bagaimana cara memberi suara positif pada komentar ??
Nifle

Jawaban:

48

Ini pasti tergantung pada konten sebenarnya dari database Anda. Jika Anda menggunakannya untuk menyimpan informasi sesi, maka dengan segala cara segera bersihkan saat sesi berakhir (atau ditutup), Anda tidak ingin sampah itu berserakan. Karena tidak dapat digunakan lagi untuk tujuan praktis apa pun.

Pada dasarnya, apa yang perlu Anda tanyakan pada diri Anda sendiri, mungkinkah saya perlu memulihkan informasi ini? Seperti pertanyaan yang dihapus di SO, pertanyaan tersebut seharusnya hanya ditandai 'dihapus', karena kami secara aktif mengizinkan pembatalan penghapusan. Kami juga memiliki opsi untuk menampilkannya untuk memilih pengguna juga, tanpa banyak pekerjaan tambahan.

Jika Anda tidak secara aktif berusaha memulihkan data sepenuhnya, tetapi Anda masih ingin menyimpannya untuk tujuan pemantauan (atau serupa). Saya menyarankan agar Anda mencari (sejauh mungkin tentu saja) skema agregasi, dan mendorongnya ke tabel lain. Ini akan menjaga tabel utama Anda bersih dari data yang 'dihapus', serta menjaga tabel sekunder Anda tetap dioptimalkan untuk tujuan pemantauan (atau apa pun yang Anda pikirkan).

Untuk data temporal, lihat: http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/

falstro
sumber
30

Kelebihan menggunakan bendera hapus:

  1. Anda bisa mendapatkan datanya kembali nanti jika Anda membutuhkannya,
  2. Operasi penghapusan (memperbarui bendera) mungkin lebih cepat daripada benar-benar menghapusnya

Kontra menggunakan bendera hapus:

  1. Sangat mudah untuk melewatkan AND DeletedFlag = 'N'suatu tempat di SQL Anda
  2. Lebih lambat bagi database untuk menemukan baris yang Anda minati di antara semua omong kosong
  3. Akhirnya, Anda mungkin ingin benar-benar menghapusnya (dengan asumsi sistem Anda berhasil. Bagaimana dengan saat rekaman itu berumur 10 tahun dan "dihapus" 4 menit setelah dibuat)
  4. Itu bisa membuat tidak mungkin untuk menggunakan kunci alami. Anda mungkin memiliki satu atau lebih baris yang dihapus dengan kunci alami dan baris asli yang ingin menggunakan kunci alami yang sama.
  5. Mungkin ada alasan hukum / kepatuhan mengapa Anda dimaksudkan untuk benar-benar menghapus data.
WW.
sumber
23

Sebagai pelengkap semua tulisan ...

Namun, jika Anda berencana untuk menandai record, ada baiknya untuk mempertimbangkan membuat view, untuk record aktif. Ini akan menyelamatkan Anda dari menulis atau melupakan flag dalam kueri SQL Anda. Anda dapat mempertimbangkan tampilan untuk catatan non-aktif juga, jika menurut Anda itu juga memiliki tujuan.

Adeel Ansari
sumber
11

Saya senang menemukan utas ini. Saya juga bertanya-tanya apa pendapat orang tentang masalah ini. Saya telah menerapkan 'ditandai sebagai dihapus' selama sekitar 15 tahun di banyak sistem. Setiap kali pengguna menelepon untuk mengatakan sesuatu terhapus secara tidak sengaja, tentu jauh lebih mudah untuk menandainya sebagai un-delete daripada membuat ulang atau memulihkan dari cadangan.

Kami menggunakan postgresql dan Ruby pada rel. Sepertinya kami dapat melakukan ini dengan salah satu dari dua cara, memodifikasi rel atau menambahkan pemicu ondelete dan sebagai gantinya melakukan fungsi pl / pgsql untuk menandai sebagai dihapus. Saya condong ke arah yang terakhir.

Sedangkan untuk performance hits, akan menarik untuk melihat hasil EXPLAIN-ANALYZE pada tabel besar untuk beberapa item yang terhapus serta banyak item yang terhapus.

Dalam sistem yang digunakan dari waktu ke waktu, saya temukan, pengguna baru cenderung melakukan hal-hal konyol seperti menghapus sesuatu secara tidak sengaja. Jadi ketika orang baru dalam posisi mereka memiliki semua hak akses orang yang sebelumnya berada di posisi itu kecuali dengan pengalaman nol. Menghapus sesuatu secara tidak sengaja dan dapat memulihkan dengan cepat membuat semua orang kembali bekerja dengan cepat.

Tetapi seperti yang dikatakan seseorang, terkadang Anda mungkin memerlukan kunci tertentu itu kembali karena alasan tertentu, pada saat itu Anda harus benar-benar menghapusnya, lalu membuat ulang rekaman (saat membatalkan penghapusan dan memodifikasi rekaman).

pengguna67403
sumber
1
+1 karena keramahan pengguna termasuk membatasi kemampuan saya untuk membuat kesalahan besar.
Jesse
6

Ada juga masalah hukum jika data pribadi terlibat. Saya pikir itu sangat tergantung di mana Anda berada (atau di mana database itu), dan apa persyaratan penggunaannya.

Dalam beberapa kasus, orang dapat meminta untuk dihapus dari sistem Anda, dalam hal ini diperlukan penghapusan paksa (atau setidaknya menghapus semua informasi pribadi).

Saya akan menanyakan kepada departemen hukum Anda sebelum Anda mengadopsi strategi apakah informasi pribadi terlibat.

Jeremy Prancis
sumber
5

Saya menandai mereka sebagai dihapus, dan tidak benar-benar menghapus. Namun sesekali saya menyapu semua sampah dan mengarsipkannya, sehingga tidak mematikan kinerja.

Robert Gould
sumber
2

Jika Anda khawatir tentang catatan "tidak aktif" yang memperlambat akses database Anda, Anda mungkin ingin memindahkan baris tersebut ke tabel lain yang bertindak sebagai tabel "arsip".

cruizer
sumber
1

Untuk data yang dimasukkan / dikelola pengguna, saya telah menggunakan metode bendera yang Anda gambarkan dan memberi pengguna antarmuka "kosongkan tempat sampah" untuk benar-benar menghapus item jika mereka mau.

Abie
sumber