Database: Hard Delete vs Soft Delete
Sat. Dec 23rd, 2023 11:23 AM4 mins read
Database: Hard Delete vs Soft Delete
Source: Bing Image Creator - Hard Delete and Soft Delete

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:

Copy
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 data sensitif, ini cocok untuk diimplementasi pada data seperti nomor rekening, kartu kredit, alamat, atau sejenisnya. 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😓. Kalau data tersebut berelasi dengan banyak tabel children, maka kita perlu eksekusi hapus banyak data. Di sisi keamanan identitas 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 mengimpersonate user tersebut, dia bisa mendaftarkan ulang akun baru dengan username yang sama. Karena telah 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 flagging untuk menandakan apakah data tersebut “terhapus” atau tidak. Contohnya menggunakan kolom boolean value “active” dengan default value TRUE, atau “deleted_id” yaitu id dari data yang dihapus dengan default value 0, atau tanggal penghapusan menggunakan datetime dengan default value null. Ketika menghapus data, maka yang dilakukan adalah melakukan update flagging menjadi active = FALSE jika menggunakan flagging boolean, deleted_id = id jika menggunakan id, atau deleted_at = now() jika menggunakan tanggal penghapusan. Jadi kita tidak menghapus data secara permanen.

Copy
UPDATE users
SET active = FALSE
WHERE
    username = 'ferry.sikumbang'
;

UPDATE users
SET deleted_id = users.id
WHERE
    username = 'ferry.sikumbang'
;

UPDATE users
SET deleted_at = now()
WHERE
    username = 'ferry.sikumbang'
;

Keunggulan Soft Delete

Soft Delete menyelesaikan permasalahan pada Hard Delete. Kita bisa recovery dengan gampang jika ingin mengembalikan data yang “terhapus” dengan cara mengganti kembali flagging tersebut menjadi default value. History data tetap terjaga. Dari segi keamanan identitas, 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😎. Sebanyak apa pun relasi datanya, kita bisa tentukan apakah hanya perlu eksekusi update satu data master saja atau beserta relasinya tergantung kasus. Misalnya menghapus data pada tabel products yang berelasi dengan tabel product_prices yang menyimpan jenis-jenis harga produk. Kita hanya perlu update satu data flagging di tabel products aja karena tabel product_prices bergantung pada data tabel products sebagai tabel master.

Kelemahan Soft Delete

Soft Delete juga bukan solusi sempurna. Karena datanya tidak dihapus permanen, maka data tersebut akan menumpuk dan memakan banyak storage. Kita juga wajib memastikan setiap pemanggilan data untuk menambahkan filter by default value dari kolom flagging pada where clause agar data yang tampil hanya data yang aktif seperti where active IS TRUE. Ini perlu hati-hati, jangan sampai data yang sudah tidak aktif masih tampil di aplikasi🫣. Untungnya beberapa framework menyediakan 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 atau kartu kredit, maka akan berpotensi ikut bocor jika suatu saat database aplikasinya kena hack meskipun user merasa sudah menghapus datanya sebelumnya. Beberapa regulasi juga melarang Soft Delete pada data sensitif. Selain itu, pada kolom unik data yang pernah dihapus jadi ga bisa digunakan kembali.

Mana yang lebih baik?

Menurut gw by default gunakan Soft Delete karena kita dapat memaintain history dan melakukan recovery dengan gampang jika terjadi penghapusan secara tidak sengaja. Soft Delete juga berguna mencegah impersonate user. Seperti di Twitter, dulu ada korban pembunuhan yang akunnya dihapus pihak keluarga, lalu muncul lagi akun dengan username & foto yang sama nge-tweet “tolong, di sini panas sekali!”😱. Seorang motivator di Kanada juga pernah mengalami hal yang sama, usernamenya digunakan kembali oleh oknum yang tak bertanggung jawab dan melakukan penipuan. Jika ada constraint unique, maka kolom flagging juga harus disertakan pada constraint tersebut dan ga boleh null serta harus ada default valuenya agar value dari data yang sudah dihapus bisa digunakan lagi pada data baru. Tapi menurut gw jika ada constraint unique maka lebih baik value tersebut memang ga boleh digunakan kembali untuk mencegah impersonate data. Tapi balik lagi ini tergantung requirement. Untuk hal sensitif seperti nomor telepon, alamat pribadi, nomor rekening, kartu kredit, atau sejenisnya, maka lebih baik gunakan 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 akan dihapus dari database transaksi atau dipindah ke database analitik. Hard Delete juga diperlukan untuk menghapus data 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.

© 2026 · Ferry Suhandri