![Database: Hard Delete vs Soft Delete](https://images.ctfassets.net/7wjlcr9d5ii8/2BTFYuYD1AhFWNeY29g1ZE/e1c31a73a07828eed70b36c4e2f494db/OIG.jpeg?w=1024&h=1024&fl=progressive&q=100&fm=jpg&fit=thumb&f=faces)
Ketika memaintain data pada database, operasi Create, Read, Update, dan Delete (CRUD) adalah operasi yang paling sering digunakan. Yang akan dibahas kali ini adalah bagian Delete atau menghapus data. Terdapat dua pendekatan untuk menghapus data pada database, yaitu Hard Delete dan Soft Delete. Masing-masing pendekatan memiliki kelemahan dan keunggulan tersendiri.
Hard Delete adalah proses menghapus data pada database secara fisik. Data tersebut benar-benar dihapus secara permanen dari database menggunakan command delete:
DELETE
FROM users
WHERE
username = 'ferry.sikumbang'
;
Keunggulan dari Hard Delete adalah prosesnya yang sangat gampang, tinggal execute command delete dan datanya langsung hilang🚮. Selain itu storage dari database akan berkurang setelah eksekusi karena datanya dihapus secara permanen dari database. Dari sisi keamanan, ini lebih baik untuk diimplementasi pada fitur hapus data sensitif, seperti data nomor rekening yang sudah tidak digunakan lagi pada suatu system. Sehingga setelah dihapus, datanya benar-benar hilang tanpa harus was-was nomor rekening akan bocor pada system yang sudah tidak digunakan lagi.
Karena datanya dihapus permanen, maka data tersebut tidak dapat di-recovery. Jadi, kalau ada kemungkinan untuk mengembalikan data yang dihapus pada system, maka Hard Delete bukan solusi yang baik. Jika tidak sengaja terhapus, maka user harus menginput kembali secara manual pada system😓. Di sisi keamanan sosial pun ada kelemahannya. Misalkan pada suatu akun, seorang user menggunakan username “ferry.sikumbang”. Lalu user tersebut menghapus akunnya sehingga data user dengan username “ferry.sikumbang” akan terhapus secara permanen. Masalahnya, jika ada orang lain yang ingin berpura-pura menjadi user tersebut, dia bisa mendaftarkan ulang akun baru dengan username yang sama, karena setelah terhapus permanen, maka username “ferry.sikumbang” akan kembali available untuk digunakan. Sehingga orang tersebut bisa berpura-pura menjadi “ferry.sikumbang” dan melakukan penipuan atas nama user tersebut.
Berbeda dengan Hard Delete, Soft Delete adalah proses menghapus data menggunakan kolom dengan boolean value seperti “active” atau “deleted” sebagai flagging untuk menandakan apakah data tersebut aktif atau tidak. Kita wajib menambahkan filter where active IS TRUE
pada where clause saat menampilkan data. Ketika menghapus data, maka yang dilakukan adalah melakukan update flaggingnya menjadi active = FALSE, bukan menghapus secara permanen.
UPDATE users
SET active = FALSE
WHERE
username = 'ferry.sikumbang'
;
Soft Delete menyelesaikan permasalahan pada Hard Delete. Kita bisa melakukan recovery dengan gampang jika ingin mengembalikan data yang “terhapus” dengan cara mengganti kembali flagging tersebut menjadi true. History data akan tetap terjaga. Dari segi keamanan sosial, jika user pada suatu aplikasi menghapus akunnya yang menggunakan username “ferry.sikumbang”, maka user tersebut tidak perlu khawatir kalau ada orang lain yang ingin mencuri identitasnya, karena datanya tidak terhapus secara permanen sehingga orang lain yang ingin register akun baru dengan username tersebut ga akan bisa😎.
Soft Delete juga bukan solusi yang sempurna. Karena datanya tidak dihapus permanen, maka data tersebut akan menumpuk pada system dan akan memakan banyak storage. Selain itu, kita wajib memastikan setiap pemanggilan data untuk menambahkan where active IS TRUE
pada where clause agar data yang tampil hanyalah data yang aktif. Ini perlu hati-hati, jangan sampai data yang sudah tidak aktif ikut ditampilkan pada aplikasi🫣. Kelemahan lainnya, jika data tersebut menyimpan hal sensitif seperti nomor rekening, maka akan berpotensi ikut bocor jika suatu saat database aplikasinya kena hack meskipun user merasa sudah menghapus akunnya dan tidak pernah menggunakan aplikasi tersebut lagi.
Semuanya balik lagi tergantung kebutuhan. Menurut gw by default gunakan Soft Delete karena kita dapat memaintain history data yang tersimpan dengan mudah dan melakukan recovery dengan gampang jika terjadi penghapusan secara tidak sengaja. Pengecualian jika itu data sensitif, maka gunakan Hard Delete. Soft Delete juga berguna mencegah pencurian identitas seperti masalah pada contoh kasus di atas. Seperti yang pernah terjadi di Twitter, dulu ada korban kasus pembunuhan yang akunnya telah dihapus oleh pihak keluarga, lalu kemudian muncul lagi akun dengan username & foto profil yang sama dan berpura-pura sebagai korban kasus pembunuhan tersebut nge-tweet “tolong, di sini panas sekali!”😱. Seorang motivator di Kanada yang juga pernah menghapus akunnya mengalami hal yang sama, usernamenya digunakan kembali oleh oknum yang tak bertanggung jawab dan melakukan penipuan atas nama akun motivator tersebut. Jika data tersebut dirasa berisi hal sensitif, seperti nomor telepon, nomor rekening, atau sejenisnya, maka lebih baik implementasi Hard Delete pada fitur hapus data tersebut untuk antisipasi mencegah kebocoran data jika suatu saat database aplikasi kita dihack oleh orang sebagai bentuk tanggung jawab kita terhadap data user yang kita kelola. Selain itu, Hard Delete biasanya digunakan untuk menghapus data history secara permanen dari database yang sudah lama tersimpan. Contohnya pada aplikasi e-commerce, biasanya data pesanan yang dipesan lebih dari 2 atau 3 tahun yang lalu (tergantung dari regulasi perusahaan) akan dihapus oleh system agar tidak membebani database. Hard Delete juga diperlukan untuk menghapus data yang dihapus secara Soft Delete yang telah menumpuk secara berkala menggunakan scheduler. Seperti yang dilakukan Google baru-baru ini pada akun Gmail yang nonaktif lebih dari 2 tahun berturut-turut. Jadi, Hard Delete tetap diperlukan ketika kita mengimplementasi Soft Delete, tapi secara berkala.