Hacker News Digest

23 августа 2025 г. в 21:13 • sophiebits.com • ⭐ 96 • 💬 48

OriginalHN

#typescript#redis#postgresql#materialized-views#incremental-view-maintenance#database-transactions#scalability#materialize#snowflake#scylladb

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, счётчик сломается навсегда.
Переносим счётчик в ту же БД и обновляем в транзакции, либо пишем триггер — логика в БД снова в моде.

Итог: из одной строки кода выросла куча кода, который нужно поддерживать и синхронизировать.
Таких «побочных» вычислений в приложениях тысячи; они скрывают суть и мешают рефакторингу.