Объекты БД позволяют выполнять логику и автоматизировать реакции на события внутри СУБД. Отдельная задача — периодическое удаление устаревших данных (например, хранить только за последний час).
Объекты в базах данных
Хранимые процедуры
Код (например, 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 проще, но создают нагрузку при больших объёмах данных.