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?
database
database-design
jerbersoft.dll
sumber
sumber
Jawaban:
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/
sumber
Kelebihan menggunakan bendera hapus:
Kontra menggunakan bendera hapus:
AND DeletedFlag = 'N'
suatu tempat di SQL Andasumber
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.
sumber
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).
sumber
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.
sumber
Saya menandai mereka sebagai dihapus, dan tidak benar-benar menghapus. Namun sesekali saya menyapu semua sampah dan mengarsipkannya, sehingga tidak mematikan kinerja.
sumber
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".
sumber
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.
sumber