Что происходит с данными после их удаления из базы данных и где они могут сохраняться?

Ответ

После выполнения команды DELETE данные не всегда исчезают бесследно. Их можно найти в нескольких местах, в зависимости от настроек СУБД и подхода к разработке:

  1. Журналы транзакций (Transaction Logs): Это основное место. В СУБД, таких как PostgreSQL (WAL - Write-Ahead Log) или MySQL (Binlog), все операции изменения данных, включая DELETE, записываются в журнал. Это необходимо для репликации и восстановления состояния БД на определенный момент времени (Point-in-Time Recovery).

  2. Резервные копии (Backups): Если бэкап был сделан до момента удаления, данные в нём, очевидно, сохранятся.

  3. "Мягкое удаление" (Soft Delete): Самый частый подход в приложениях. Данные физически не удаляются из таблицы. Вместо этого у строки обновляется специальное поле, например, deleted_at. Запись просто помечается как удаленная и исключается из обычных выборок.

    • Преимущества: Легкое восстановление, сохранение истории изменений (аудит), поддержание целостности связей (foreign keys).
    • Пример на Go с GORM:

      import "gorm.io/gorm"
      
      type User struct {
        gorm.Model // Включает ID, CreatedAt, UpdatedAt, DeletedAt
        Name string
      }
      
      // Это выполнит UPDATE "users" SET "deleted_at"='<timestamp>' WHERE id = ...
      db.Delete(&user)
      
      // Чтобы найти "удаленные" записи, нужно использовать Unscoped()
      var deletedUsers []User
      db.Unscoped().Where("deleted_at IS NOT NULL").Find(&deletedUsers)
  4. На физическом носителе: Даже после физического удаления строки, СУБД может не сразу затереть данные на диске. Область помечается как свободная, и данные будут перезаписаны позже. Специализированным софтом их можно попытаться восстановить.