ADHEAVEN - Natali Ardianto Official

COO tiket.com. Advisor bouncity.com. Advisor golfnesia.com. Co-founded urbanesia.com. Initiator #StartupLokal

February 4, 2011 12:27 pm

Salah delete akun user di situs anda?




Membaca berita tentang admin Flickr yang tidak sengaja menghapus akun usernya dan membutuhkan waktu beberapa hari untuk merestore ulang, saya jadi tergelitik untuk sharing. (Baca beritanya dulu: Flickr Secara Tidak Sengaja Hapus Akun Pengguna Mereka & Flickr Kembalikan Foto Beserta Semua Data Akun Mirco Wilhelm)

Dalam web developement, khususnya untuk situs yang memiliki akun untuk user, memang diperlukan moderasi atau tools untuk memanage user. Entah itu edit atau delete. Nah untuk dua hal ini, saya menggunakan teknik sebagai berikut:

  • Untuk perintah delete, entah itu delete akun, delete post atau apa pun, saya selalu menggunakan flag (state) untuk menghapus konten. Jadi tidak pernah saya menggunakan query DELETE FROM dalam sistem saya. Dan untuk flag ini, dibuatkan kolom bernama status dengan value TINYINT /*SIGNED*/ DEFAULT 1. Jadi valuenya antara -128 s/d 127 dengan nilai defaultnya 1. Jika statusnya aktif, valuenya di set ke 1, inactive di set ke 0 dan deleted di set ke nilai minus, entah -127 atau -1. Tujuannya adalah jika kita ingin melihat posts entah itu aktif atau inaktif, cukup query `status` >= 0. Ini bertujuan agar regular admin hanya melihat dua hal ini. Sedangkan untuk super admin, query tersebut (`status` >= 0) dihilangkan, jadi item-item yang di hapus akan tampil juga.
  • Tapi jika anda ingin menggunakan ENUM(‘ACTIVE’, ‘INACTIVE’, ‘DELETE’) untuk kolom status juga disarankan, karena sangat efisien dan hanya menggunakan 1 byte data. Lagipula kolom menjadi readable ketika melakukan query.
  • Untuk melakukan delete, cukup perintah UPDATE table_a SET `status` = ‘-1’ WHERE id = ‘123’. Jadi tidak pernah menggunakan query DELETE.
  • Untuk setiap perintah DELETE, dilakukan logging untuk mengetahui siapa yang menghapus, kapan perintah itu dihapus, dan bentuk querynya seperti apa. FYI, di situs yang saya buat, semua perintah INSERT, UPDATE, DELETE di log (kecuali account creation) beserta bentuk querynya. Ini bertujuan untuk audit trail.
  • Semua query di front-end diharuskan menggunakan kondisi WHERE `status` = ‘1’.
  • Jika situs anda memiliki jutaan rows data, maka mungkin anda memerlukan tabel purge.Jadi untuk semua row yang sudah dihapus semenjak setahun yang lalu, maka semua isinya dipindah ke tabel purge, dan di tabel utama dihapus secara fisik menggunakan query DELETE. Tujuannya adalah untuk menghindari full table scan karena kardinalitas kolom `status` hanya 3, jadi memang tidak masuk akal jika diberi indeks.
  • Belajarlah menggunakan MYISAM_merge. Jadi misal anda punya tabel: table_a dan table_a_purge, maka anda bisa membuat tabel gabungan semuanya dengan menggunakan query:
    • CREATE TABLE table_a_all (/* perintah create table yg sama dgn table_a */) ENGINE=MERGE UNION=(table_a, table_a_purge) INSERT_METHOD=LAST;
  • Jika admin secara tidak sengaja salah mengedit konten, anda cukup tracing log akun yang tidak sengaja diedit tersebut, dan cari query kedua dari bawah. Anda cukup menjalankan query tersebut dan anda sudah melakukan rollback.
Dari sini, jika regular admin tidak sengaja menghapus sebuah akun, data atau row (Ini benar-benar sering terjadi di kantor saya dulu), anda cukup tracing log admin tersebut, dan undo dengan perintah UPDATE table_a SET `status` = ‘1’. Tidak memakan waktu lebih dari satu menit, dan customer akan tetap happy dan tidak punya kesempatan untuk menulis blog dan menjadi viral seperti apa yang terjadi pada Flickr. Kasihan PR-nya nanti kalau sudah begini.

  1. adheaven posted this