Vista orientada a auditoría y sincronización incremental del catálogo. Devuelve las fechas clave de actividad del libro y calcula global_last_modification_at como indicador único de “última modificación”.
SELECT book_id, int_code, title, global_last_modification_at
FROM public.vw_book_audit
WHERE global_last_modification_at > '2025-06-01'::timestamp
ORDER BY global_last_modification_at;
Este módulo expone el catálogo de libros mediante vistas SQL optimizadas para dos propósitos distintos:
Detección eficiente de cambios (auditoría / sincronización incremental)
Obtención del detalle completo del libro (catálogo enriquecido)
La separación de responsabilidades permite escalar el sistema sin penalizar consultas frecuentes ni procesos batch.
vw_book_audit — Auditoría y detección de cambios
Vista liviana orientada a control y sincronización. Expone las fechas clave de actividad de cada libro y calcula un único timestamp de referencia:
global_last_modification_at
Este campo representa la fecha más reciente entre:
creación o edición de la ficha del libro,
último cambio de precio (según la lista definida por el parámetro global PriceList),
último movimiento real de stock.
👉 Uso principal: detectar qué libros cambiaron desde una fecha/hora.
Vista enriquecida que consolida:
metadatos del libro,
autores (concatenados),
materias jerárquicas (vía vw_materia),
proveedor principal (vía vw_party),
stock consolidado,
precio vigente según PriceList,
auditoría.
👉 Uso principal: obtener todos los datos del libro para UI, APIs o exportaciones.
Consultar vw_book_audit para identificar los libros modificados desde la última sincronización.
Usar los book_id obtenidos para consultar vw_book.
Procesar los resultados en orden, permitiendo paginación y reintentos seguros.
Este patrón evita escanear todo el catálogo y reduce significativamente el costo de sincronización.
-- :since = timestamp de última sincronización
WITH changed_books AS (
SELECT book_id, global_last_modification_at
FROM public.vw_book_audit
WHERE global_last_modification_at > '2025-06-01 00:00:00'::timestamp
)
SELECT
vb.*,
cb.global_last_modification_at
FROM public.vw_book vb
JOIN changed_books cb ON cb.book_id = vb.book_id
ORDER BY cb.global_last_modification_at ASC, vb.book_id;
Recomendado para procesos batch o APIs.
-- Cursor compuesto: (last_sync_at, last_book_id)
WITH changed_books AS (
SELECT book_id, global_last_modification_at
FROM public.vw_book_audit
WHERE (global_last_modification_at, book_id)
> ('2025-06-01 00:00:00'::timestamp, 0)
ORDER BY global_last_modification_at, book_id
LIMIT 500
)
SELECT
vb.*,
cb.global_last_modification_at
FROM public.vw_book vb
JOIN changed_books cb ON cb.book_id = vb.book_id
ORDER BY cb.global_last_modification_at, vb.book_id;
Permite:
guardar el último cursor procesado,
retomar sin duplicar registros,
procesar catálogos grandes de forma segura.
Útil para colas de reprocesamiento o validaciones rápidas.
SELECT book_id, global_last_modification_at
FROM public.vw_book_audit
WHERE global_last_modification_at > '2025-06-01 00:00:00'::timestamp
ORDER BY global_last_modification_at, book_id;
⚠️ Importante: el campo isbn en vw_book es derivado. Para que PostgreSQL use índice, el filtro debe hacerse sobre book_isbn.
WITH changed_books AS (
SELECT book_id, global_last_modification_at
FROM public.vw_book_audit
WHERE global_last_modification_at > '2025-06-01 00:00:00'::timestamp
)
SELECT
vb.*,
cb.global_last_modification_at
FROM changed_books cb
JOIN public.book_isbn bi ON bi.book_id = cb.book_id
JOIN public.vw_book vb ON vb.book_id = cb.book_id
WHERE bi.isbn = '9789871234567'
ORDER BY cb.global_last_modification_at, vb.book_id;
vw_book_audit está pensada para ser liviana y usada frecuentemente.
vw_book incluye subconsultas correlacionadas (autores, materias, ISBN, stock).
Usar siempre con filtros (WHERE, LIMIT) o para un conjunto acotado de libros.
Recordar restricción de búsqueda por ISBN.