Soft Delete & Archiving — Database

Hard Delete vs Soft Delete Hard delete menghapus data secara permanen dari database. Soft delete menandai data sebagai "terhapus" tanpa benar-benar menghapusnya

Hard Delete vs Soft Delete

Hard delete menghapus data secara permanen dari database. Soft delete menandai data sebagai "terhapus" tanpa benar-benar menghapusnya.

Implementasi Soft Delete

-- Tambahkan kolom deleted_at
ALTER TABLE posts ADD COLUMN deleted_at TIMESTAMP NULL;

-- "Hapus" data (soft delete)
UPDATE posts SET deleted_at = NOW() WHERE id = 1;

-- Query hanya data aktif (belum dihapus)
SELECT * FROM posts WHERE deleted_at IS NULL;

-- Termasuk data yang "terhapus"
SELECT * FROM posts; -- semua data

-- Restore data yang soft-deleted
UPDATE posts SET deleted_at = NULL WHERE id = 1;

Laravel Soft Deletes

// Model
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes;
}

// Usage
$post->delete();           // soft delete
$post->restore();          // restore
$post->forceDelete();      // hard delete
Post::withTrashed()->get();   // termasuk yang dihapus
Post::onlyTrashed()->get();   // hanya yang dihapus

Archiving Pattern

Untuk data lama yang jarang diakses, gunakan archiving — pindahkan ke tabel terpisah.

-- Tabel utama (data aktif)
CREATE TABLE orders (...);

-- Tabel arsip (data lama)
CREATE TABLE orders_archive (LIKE orders INCLUDING ALL);

-- Arsipkan data lebih dari 1 tahun
INSERT INTO orders_archive
SELECT * FROM orders WHERE created_at < NOW() - INTERVAL '1 year';

DELETE FROM orders WHERE created_at < NOW() - INTERVAL '1 year';

Kapan Soft Delete vs Hard Delete?

Yang akan kamu pelajari