Materialized views are obviously useful
Материализованные представления очевидно полезны
Разработчики постоянно перетасовывают данные между системами и форматами.
Возьмём таск-трекер: нужно показывать количество задач в каждом проекте. Сначала всё просто:
const getTaskCountForProject = (id) =>
db.query('select count(1) from tasks where project_id = $1', [id]);
Скорость не устраивает → добавляем Redis-кеш:
const getTaskCountForProject = async (id) => {
const key = `project:${id}:task-count`;
let cnt = await redis.get(key);
if (cnt !== null) return +cnt;
cnt = await db.query('select count(1) ...', [id]);
await redis.set(key, cnt, { ex: 3600 });
return cnt;
};
Пользователи жалуются: счётчик устаревает. Приходится чистить кеш при каждом insert/delete
.
Делаем инкрементальные обновления:
await redis.incr(`project:${id}:task-count`);
Но если сервер упадёт между записью в БД и Redis, счётчик сломается навсегда.
Переносим счётчик в ту же БД и обновляем в транзакции, либо пишем триггер — логика в БД снова в моде.
Итог: из одной строки кода выросла куча кода, который нужно поддерживать и синхронизировать.
Таких «побочных» вычислений в приложениях тысячи; они скрывают суть и мешают рефакторингу.