"Soft delete" sounds gentle. It isn't. Slapping a deleted_at column on every table pollutes queries, drags down migrations, and leaves tombstones all over production.
This post digs into saner options: PostgreSQL triggers, event archiving in the app layer, and CDC via WAL. Each separates the dead stuff from the living, keeping OLTP lean - but they come with their own setup costs and infra quirks.









