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
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 Hard Delete
Keunggulan dari Hard Delete adalah caranya 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 dan user ga perlu was-was data sensitifnya bocor pada system yang sudah tidak ia gunakan lagi.
Kelemahan Hard Delete
Karena datanya dihapus permanen, maka data tersebut tidak dapat di-recovery. Jika ada requirement untuk mengembalikan data yang dihapus pada system, maka Hard Delete bukan solusi yang baik. Bila 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.
Soft Delete
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
atau where deleted IS FALSE
pada where clause saat menampilkan data. Ketika menghapus data, maka yang dilakukan adalah melakukan update flaggingnya menjadi active = FALSE atau deleted = TRUE, bukan menghapus secara permanen.
UPDATE users
SET active = FALSE
WHERE
username = 'ferry.sikumbang'
;
Keunggulan Soft Delete
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😎.
Kelemahan Soft Delete
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🫣. Tapi biasanya beberapa framework menyediakan cara handle Soft Delete otomatis agar ga dihandle manual seperti Eloquent pada PHP atau Hibernate pada Java. 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 datanya sebelumnya.
Mana yang lebih baik?
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 data secara tidak sengaja. Soft Delete juga berguna mencegah pencurian identitas. Seperti 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, lalu usernamenya digunakan kembali oleh oknum yang tak bertanggung jawab dan melakukan penipuan atas nama akun motivator tersebut. Jika data tersebut berisi hal sensitif, seperti nomor telepon, nomor rekening, atau sejenisnya, maka lebih baik implementasi Hard Delete sebagai bentuk tanggung jawab kita terhadap data sensitif 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 order 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.