Hay un punto en todo proyecto dbt donde los tutoriales dejan de servir.
Tus dimensiones tienen claves huérfanas, el sistema fuente borra registros sin avisar, y necesitas inferir transacciones a partir de snapshots porque nadie te da los eventos explícitos.
Este capítulo del libro Data Engineering with dbt resuelve exactamente esos problemas con patrones concretos y macros reutilizables.
El capítulo empieza con una refactorización elegante:
cómo gestionar migraciones de base de datos (eliminar tablas renombradas, alterar modelos incrementales) usando una macro genérica que accede al diccionario
contextde Jinja.
El resultado es que cada migración nueva pasa de ser dos líneas de código a una sola, con validación automática si la macro no existe.
Un patrón pequeño que escala muy bien cuando acumulas decenas de migraciones.
El patrón más valioso del capítulo.
En lugar de reemplazar claves huérfanas por un registro por defecto (perdiendo la FK original), la dimensión se auto-completa: detecta qué claves existen en los hechos pero no en la dimensión, y crea registros nuevos con los datos del registro por defecto pero manteniendo la clave real.
Veremos la macro completa, con cada CTE explicasda, y mostrando cómo usarla.
Cuando un sistema fuente elimina registros sin dejar rastro, la única forma de detectarlo es comparar lo que tienes con lo que recibes.
Veremos cómo implementar este patrón con un modelo incremental que identifica las filas activas en el histórico que ya no aparecen en la entrada, las marca como cerradas, y las almacena como una nueva versión.
Incluye una tabla de decisión para saber cuándo necesitas este patrón y cuándo puedes usar la carga básica.
El último patrón es para cuando no tienes eventos transaccionales pero sí snapshots periódicos de posiciones.
Usando LAG() sobre la tabla histórica, veremos cómo inferir compras y ventas, calcular el tipo de transacción y estimar los importes económicos.
No es perfecto, pero es la mejor aproximación posible cuando el origen no te da los datos que necesitas.
¡A por ello! 💪