← Назад к вопросам

Что такое Soft Delete?

2.0 Middle🔥 121 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Soft Delete?

Soft Delete (мягкое или программное удаление) — это архитектурный паттерн, при котором данные не удаляются физически из базы данных, а помечаются как удалённые с помощью специального флага. Вместо выполнения SQL-команды DELETE, система обновляет запись, устанавливая поле (например, deleted_at, is_deleted) в значение, указывающее на её "неактивный" статус. Это позволяет сохранить целостность исторических данных и обеспечивает возможность восстановления.

Ключевые принципы реализации

1. Структура данных

Обычно добавляется одно или несколько полей в таблицу базы данных:

ALTER TABLE users ADD COLUMN deleted_at TIMESTAMP NULL DEFAULT NULL;
-- Или
ALTER TABLE products ADD COLUMN is_deleted BOOLEAN DEFAULT FALSE;

2. Модификация запросов

Все SELECT-запросы автоматически фильтруют "удалённые" записи:

-- Вместо SELECT * FROM users
SELECT * FROM users WHERE deleted_at IS NULL;

3. "Удаление" как обновление

Операция удаления превращается в UPDATE:

// Жёсткое удаление (Hard Delete)
$query = "DELETE FROM orders WHERE id = 123";

// Мягкое удаление (Soft Delete)
$query = "UPDATE orders SET deleted_at = NOW() WHERE id = 123";

Преимущества Soft Delete

  • Откат операций: Возможность восстановить случайно удалённые данные без резервных копий
  • Аудит и аналитика: Сохранение полной истории всех сущностей для отчётности
  • Целостность ссылок: Внешние ключи продолжают работать, предотвращая нарушение связей
  • Архивация: Данные остаются доступными для юридических или compliance-требований
  • Бизнес-логика: Возможность реализовать корзину, историю заказов или отложенное удаление

Недостатки и сложности

  • Производительность: Необходимость постоянной фильтрации в WHERE-условиях
  • Уникальность: Проблемы с уникальными индексами (нужно включать deleted_at в индекс)
  • Сложность запросов: Все JOIN-операции требуют учёта статуса удаления
  • Хранение: Постоянный рост объёма данных в базе
  • Очистка: Необходимость периодического физического удаления устаревших записей

Практическая реализация в PHP

Базовый пример с PDO:

class SoftDeleteRepository {
    private $pdo;
    
    public function delete(int $id): void {
        $stmt = $this->pdo->prepare(
            "UPDATE articles SET deleted_at = :now WHERE id = :id"
        );
        $stmt->execute([
            ':now' => date('Y-m-d H:i:s'),
            ':id' => $id
        ]);
    }
    
    public function findAll(): array {
        return $this->pdo->query(
            "SELECT * FROM articles WHERE deleted_at IS NULL"
        )->fetchAll();
    }
    
    public function findWithTrashed(): array {
        return $this->pdo->query("SELECT * FROM articles")->fetchAll();
    }
}

Реализация в Laravel Eloquent:

// В модели
class User extends Model {
    use SoftDeletes; // Трейт с готовой реализацией
    
    protected $dates = ['deleted_at'];
}

// Использование
$user->delete(); // Soft delete
User::withTrashed()->find(1); // Включая удалённые
User::onlyTrashed()->get(); // Только удалённые
$user->restore(); // Восстановление

Альтернативные подходы

  1. Архивирование: Перемещение удалённых записей в отдельную таблицу-архив
  2. Версионирование: Хранение всех изменений в таблице версий (например, с использованием паттерна Event Sourcing)
  3. Физическое удаление с резервированием: Настоящее DELETE, но с предварительным сохранением в backup-таблице

Рекомендации по использованию

  • Не используйте Soft Delete для временных или неважных данных
  • Обязательно индексируйте поле статуса удаления
  • Реализуйте очистку старых записей через планировщик задач (cron)
  • Документируйте в коде, какие операции используют мягкое удаление
  • Рассмотрите компромисс: комбинируйте soft delete для важных данных и hard delete для остальных

Soft Delete — это мощный инструмент, который повышает надёжность приложения, но требует продуманной архитектуры и учёта долгосрочных последствий для базы данных.

Что такое Soft Delete? | PrepBro