Auditoría de libros vw_book_audit

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”.

Casos de uso

Query de uso típico: “libros cambiados desde X”

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;

Catálogo de Libros — Sincronización y Vistas

Este módulo expone el catálogo de libros mediante vistas SQL optimizadas para dos propósitos distintos:

La separación de responsabilidades permite escalar el sistema sin penalizar consultas frecuentes ni procesos batch.

Vistas principales

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.

vw_book — Vista maestra de catálogo

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.

Flujo recomendado de sincronización

Este patrón evita escanear todo el catálogo y reduce significativamente el costo de sincronización.

Queries de ejemplo

1) Traer todos los datos de libros modificados desde una fecha/hora

-- :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;

2) Sincronización incremental por lotes (paginable)

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.

3) Delta mínimo (solo IDs y fecha)

Ú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;

4) Cambios desde fecha + filtro por ISBN (usa índice)

⚠️ 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;

Consideraciones de performance

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.