Hapus data, adakah masih perlu?

Semasa aku belajar dahulu untuk setiap sistem secara asasnya mempunyai empat fungsi teras. C.R.U.D.

  • C – Create (cipta)
  • R – Retrive/Read (capai kembali)
  • U – Update (kemaskini)
  • D – Delete (hapus)

Namun, pada zaman kini aku berpendapat sudah sampai masanya untuk kita menukar fungsi yang keempat daripada D iaitu delete atau hapus kepada S – Soft-delete atau hapus secara aplikasi tetapi bukan secara fizikal. Dengan kata lain yang lebih mudah, secara dalam aplikasi pengguna akan menganggap data tersebut dihapuskan kerana tidak dapat dicari melalui paparan sistem. Tetapi secara fizikal di dalam pangkalan data, datanya masih wujud.

is_deleted

Aku mula mempraktikkan kaedah soft delete ini daripada dulu tetapi secara kaedah boolean is_deleted. Data yang disimpan selalunya hanya bersifat 0 atau 1 iaitu 0 – tidak atau false, manakala 1 bermaksud ya atau true.

idNamais_deleted
1Ali1
2Abu0

Dalam contoh table di atas, Ali telah dijadikan sebagai soft delete yang mana datanya dianggap tidak ada di dalam paparan pengguna tetapi secara fizikalnya masih ada dan tidak dihapuskan secara sebenar. Antara kegunaan kaedah ini adalah selain daripada dapat menghilangkan paparan data Ali kepada pengguna sistem, aku juga dapat mengekalkan data yang berkaitan dengan Ali dan juga dapat mengembalikan data Ali jika perlu ke dalam sistem dalam kes-kes tertentu seperti rollback.

Tetapi kaedah ini memerlukan aku menambah setiap query kepada pangkalan data dengan membuat pemeriksaan data ... where is_deleted != 1. Itu semua sebelum datangnya Laravel.

Soft Delete di dalam Laravel

Laravel memperkenalkan kaedah soft delete yang lebih mudah daripada apa aku buat sebelum ini. Aku hanya perlu membuat beberapa perkara dan aku boleh gunakanya:

  1. Tambah deleted_at kepada table sedia ada
  2. Suntik fungsi soft delete ke dalam modul untuk memberitahu Laravel bahawa kita mahu gunakan fungsi soft delete untuk modul tersebut.

Dan selepas itu siap. Anda boleh gunakan terus fungsi soft delete tanpa mengubah apa-apa kod yang sebelum ini. Kaedahnya masih sama seperti contoh:

idnamadeleted_at
1Ali2018-09-23 22:00:00
2Abunull

Maka apabila anda membuat query kepada pangkalan data, Eloquent akan menambah secara automatik satu where untuk mencari data yang mempunyai nilai deleted_at is null sahaja. Dan apabila ditambah dengan kecanggihan Eloquent, anda terus dapat menapis segala data yang berkaitan dengan Ali walaupun berkaitan dengan table yang lain.

Anda masih boleh mengeluarkan data Ali secara paksa dengan menggunakan arahan ->withTrashed() ke dalam Eloquent dan semua data akan dikeluarkan termasuklah yang di hapus menggunakan soft delete.

Intergriti Data

Antara sebab kenapa aku amat memberatkan fungsi soft delete di dalam sistem lebih lagi yang menggunakan Laravel (sebab mudah) adalah kerana bagi aku setiap data yang masuk ke dalam sistem (yang live), sama ada itu adalah data contoh mahupun data spam tidak boleh dibuang. Apatah lagi data yang berkaitan maklumat di dalam server yang sensitif seperti audit trail, log kronologi, evaluation ataupun data transaction yang melibatkan wang. Ini dapat memastikan bahawa sesebuah sistem itu mempunyai intergriti data yang baik.

Ada sesetengah daripada sistem yang aku jaga, tetapan untuk pengguna pangkalan data yang digunakan untuk sistem juga tidak mempunyai fungsi hapus (delete) kecuali kepada beberapa table seperti reset password, token, queue dan seumpamanya yang memerlukan kita membuang data yang telah selesai kerja. Tetapi selain daripada itu memang tiada istilah buang data daripada pangkalan data.

Data banyak tak berat ke?

Data banyak tidak dinafikan akan memberikan impak kepada sistem tetapi kita hidup di zaman big data dan zaman kini mempunyai banyak cara untuk memastikan data yang banyak tidak menyebabkan sistem menjadi terlalu lambat. Contohnya sharding, partitioning, dan archiving. Maka aku tidak nampak kenapa data perlu di buang.

Notakaki

Dah lama nak tulis tetapi selepas JomLaunch 6.0 aku rasa perlu untuk aku tuliskan di dalam blog.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.