Объекты баз данных и стратегии удаления данных

Объекты БД позволяют выполнять логику и автоматизировать реакции на события внутри СУБД. Отдельная задача — периодическое удаление устаревших данных (например, хранить только за последний час).

Объекты в базах данных

Хранимые процедуры

Код (например, PL/pgSQL в PostgreSQL) выполняется внутри СУБД. Плюсы: быстрее, без сетевых задержек. Минусы: сложнее поддержка, тестирование и версионирование; не все команды любят держать бизнес-логику в БД. Часто логику предпочитают выносить в приложение.

Триггеры

Автоматическое выполнение кода при изменениях в таблице: AFTER INSERT, AFTER UPDATE, AFTER DELETE. Пример: при вставке в orders автоматически добавлять запись в таблицу statistics. Удобны для логирования, обновления связанных данных, но усложняют отладку и явность потока данных.

Материализованные представления (Materialized Views)

Кэширование результата тяжёлого запроса (с JOIN и агрегатами). Данные хранятся физически и обновляются по расписанию, по событию или вручную (в PostgreSQL — REFRESH MATERIALIZED VIEW). Пример: средняя стоимость поездок за день по данным из rides и users. Используются для ускорения частых тяжёлых отчётов.

Watch / Notify и очереди изменений

Механизм подписки на изменения (например, в etcd — watch). При изменении ключа генерируется событие. Применение: репликация, выбор лидера в кластере, реакция на смену конфигурации (новый лидер, смена IP). Основа реактивных и распределённых сценариев.

Периодическое удаление данных

Требование: хранить данные только за последний час, раз в час удалять устаревшее.

1. Крон

Внешний скрипт по расписанию (cron) выполняет DELETE FROM events WHERE timestamp < NOW() - INTERVAL '1 hour'. Плюс — простота. Минус — full scan таблицы при каждом запуске, нагрузка на БД.

2. Встроенный планировщик СУБД

Например, Event Scheduler в MySQL: процедура удаления запускается раз в час внутри БД. Плюс — без внешнего процесса. Минус — по-прежнему может быть full scan; не все СУБД поддерживают (SQLite — нет).

3. TTL (Time-to-Live)

Некоторые БД поддерживают TTL на уровне таблицы или индекса (MongoDB, ClickHouse, Cassandra). Записи автоматически удаляются по истечении времени. Плюс — автоматически, без full scan. Минус — в PostgreSQL встроенного TTL нет.

Пример MongoDB: db.events.createIndex({"timestamp": 1}, {expireAfterSeconds: 3600}).

4. Партиционирование

Таблица разбивается на партиции по времени (например, по часу). Раз в час удаляется (DROP) устаревшая партиция. Плюс — удаление партиции O(1), без полного сканирования. Минус — нужна настройка партиций и учёт в запросах.

Пример: в PostgreSQL партиция events_2025_05_30_12 — данные за 12:00; DROP TABLE events_2025_05_30_12 удаляет их целиком.

Итог: для периодического удаления предпочтительны TTL или партиционирование; крон и scheduler проще, но создают нагрузку при больших объёмах данных.