Procedimientos almacenados vs flujos visuales: dónde debe residir la lógica
Procedimientos almacenados vs flujos visuales: una forma práctica para decidir qué lógica pertenece en la base de datos, en flujos drag-and-drop o en código personalizado.

Qué significa realmente esta decisión
La lógica de negocio es el conjunto de reglas que deciden qué está permitido, qué sucede a continuación y qué debe hacer el sistema cuando personas reales lo usan. No es el dato en sí. Es el comportamiento: quién puede hacer qué, en qué condiciones y con qué efectos secundarios.
Así que la discusión sobre procedimientos almacenados vs flujos visuales trata en realidad de dónde deben vivir estas reglas para que sean fáciles de cambiar, difíciles de romper y claras para las personas que son dueñas del proceso.
La mayoría de los equipos acaba con tres “hogares” posibles para la lógica:
- En la base de datos (procedimientos almacenados, triggers, restricciones): las reglas se ejecutan cerca de los datos. Puede ser rápido y consistente, pero más difícil de cambiar para quienes no son especialistas en bases de datos.
- En flujos visuales (constructores de procesos drag-and-drop): las reglas se expresan como pasos y decisiones. A menudo es más fácil de leer, revisar y ajustar conforme cambia el proceso.
- En código personalizado (servicios, apps, scripts): las reglas se escriben en un lenguaje de programación. Esto da máxima flexibilidad, pero los cambios suelen requerir más disciplina de ingeniería y pruebas.
La elección afecta la velocidad diaria y el mantenimiento a largo plazo. Poner la lógica en el lugar equivocado produce entregas lentas (cada cambio necesita a la única persona que conoce la base de datos), más errores (reglas duplicadas en varios sitios) y depuración dolorosa (nadie sabe por qué se rechazó un registro).
La mayoría de los sistemas contienen varios tipos de lógica de negocio. Ejemplos comunes incluyen validación (campos obligatorios, rangos permitidos), aprobaciones, precios y descuentos, notificaciones y reglas de acceso.
Una forma práctica de pensarlo: la base de datos es excelente protegiendo la integridad de los datos, los flujos visuales son excelentes expresando procesos de negocio y el código personalizado es ideal cuando la regla es demasiado única o compleja para modelarla con claridad. Plataformas como AppMaster se sitúan en el medio: puedes modelar datos y luego implementar el proceso como lógica visual legible sin dispersar reglas en muchas apps.
Los criterios: qué estás optimizando
No es realmente una cuestión de gusto. Es sobre qué intentas proteger: los datos, las personas que cambian el sistema y la velocidad de cambio.
Los resultados que más importan
Nombra los resultados principales para tu proyecto. La mayoría de los equipos buscan un equilibrio entre estos:
- Corrección: las reglas deben ejecutarse igual siempre, incluso bajo carga.
- Claridad: alguien nuevo debe entender qué pasa sin adivinar.
- Velocidad: la lógica debe ejecutarse rápido y cerca de los datos cuando sea necesario.
- Auditabilidad: necesitas probar quién cambió qué y cuándo se ejecutó.
- Tasa de cambio: esperas que los requisitos cambien semanalmente, no anualmente.
Rara vez maximizas los cinco. Empujar la lógica hacia la base de datos puede mejorar corrección y velocidad, pero puede reducir la claridad para quienes no viven en SQL.
Quién va a cambiar la lógica (y con qué frecuencia)
Sé honesto sobre quién será el responsable de los cambios día a día. Una regla que operaciones necesita ajustar cada semana no debería exigir un DBA para desplegar un procedimiento almacenado. Al mismo tiempo, una regla que afecta dinero no debería ser editable sin revisión.
Piensa en términos de fricción de cambio. Si los requisitos cambian con frecuencia, quieres un lugar donde las actualizaciones sean seguras, visibles y rápidas de desplegar. Las herramientas de flujo visual (por ejemplo, el Business Process Editor de AppMaster) pueden funcionar bien cuando propietarios de negocio e ingenieros necesitan colaborar en la lógica sin editar código de bajo nivel. Si los cambios son raros y la regla es crítica, una mayor fricción puede ser aceptable.
Una forma rápida de evaluar la propiedad:
- ¿A quién llaman si se rompe a las 2 a. m.?
- ¿Qué tan rápido necesitas parchear una regla?
- ¿Los cambios necesitan aprobaciones o un rastro en papel?
- ¿Múltiples apps dependerán de la misma regla?
- ¿La lógica es principalmente modelado de datos o decisiones de negocio?
Detecta las restricciones desde el principio. Algunas industrias requieren control de acceso estricto, separación de funciones o logs detallados. También considera límites de acceso a datos: si solo ciertos servicios deben ver ciertos campos, eso afecta dónde la lógica puede ejecutarse con seguridad.
Cuándo la lógica pertenece en procedimientos almacenados
Los procedimientos almacenados son fragmentos de lógica que se ejecutan dentro de la base de datos. En PostgreSQL, se escriben en SQL (y a veces en un lenguaje de base de datos como PL/pgSQL). En vez de que tu app extraiga filas, itere y vuelva a escribir cambios, la base de datos hace el trabajo donde viven los datos.
Una buena regla es simple: coloca lógica en la base de datos cuando el trabajo principal es proteger los datos y realizar operaciones en lote, no coordinar personas o sistemas.
Dónde brillan los procedimientos almacenados
Los procedimientos almacenados encajan bien en reglas que deben ser siempre verdaderas, sin importar qué app o integración toque la base de datos. Piensa en guardrails que mantienen los datos malos fuera.
También son excelentes en actualizaciones set-based, donde una sola instrucción puede actualizar miles de filas de forma segura y rápida. Cálculos simples que son puramente sobre datos, como calcular totales o aplicar una fórmula de descuento fija, también pueden vivir aquí cuando reduce viajes de ida y vuelta y mantiene resultados consistentes.
Ejemplo: cuando un pedido se marca paid, un procedimiento puede actualizar atómicamente el estado del pedido, decrementar inventario y escribir una fila de auditoría. Si algún paso falla, todo el cambio se revierte.
Cuándo los procedimientos almacenados se vuelven riesgosos
Los procedimientos almacenados pueden ser más difíciles de probar y versionar que el código de aplicación, especialmente si tu equipo no trata los cambios de base de datos como despliegues reales. La lógica también puede volverse “oculta” a la aplicación, creando acoplamiento que solo descubres más adelante.
La depuración también complica. Los errores pueden aparecer como mensajes de la base de datos con menos contexto sobre lo que hizo el usuario. Los nuevos compañeros pueden tener dificultades porque las reglas están divididas entre la app y la base de datos, y la lógica de la base de datos es fácil de pasar por alto durante la incorporación.
Si usas una herramienta visual para la mayor parte de la lógica, reserva los procedimientos almacenados para el núcleo pequeño y estable que debe ejecutarse cerca de los datos. Deja todo lo demás donde sea más fácil de leer, trazar y cambiar.
Cuándo la lógica encaja mejor en flujos visuales
Los flujos visuales son lógica de proceso paso a paso que puedes leer como una lista de verificación: cuando sucede algo, ejecuta estas acciones en este orden, con puntos de decisión claros. Son menos acerca de cálculos pesados y más sobre cómo el trabajo se mueve entre personas, sistemas y tiempo.
Brillan cuando te importa la comprensión compartida. Si producto, operaciones, soporte e ingeniería necesitan ponerse de acuerdo sobre cómo funciona un proceso, un flujo visual hace las reglas visibles. Esa visibilidad suele marcar la diferencia entre “el sistema está roto” y “el proceso cambió la semana pasada”.
Los flujos visuales suelen encajar bien para aprobaciones y revisiones, enrutamiento, notificaciones y recordatorios, pasos temporizados (espera 2 días y luego escala) e integraciones (llamar a Stripe, enviar un mensaje, actualizar un CRM).
Ejemplo: un cliente solicita un reembolso. El flujo comprueba la antigüedad del pedido, lo enruta a un gerente si supera un umbral, notifica a finanzas cuando se aprueba y envía una actualización al cliente. Cada paso es fácil de señalar y discutir en lenguaje llano, lo que ayuda a los interesados a aprobar y a los nuevos miembros del equipo a entender el “por qué”.
Herramientas como el Business Process Editor de AppMaster están hechas para este tipo de lógica: puedes ver el camino, las condiciones y los efectos secundarios (mensajes, llamadas API, cambios de estado) sin buscar en scripts de base de datos.
Para evitar que los flujos se conviertan en espagueti, mantenlos pequeños y legibles. Dale a cada flujo un solo resultado, usa nombres claros para pasos y ramas, limita decisiones profundamente anidadas y registra las elecciones clave para que puedas responder “¿por qué pasó esto?” más tarde.
Cuando un flujo comienza a hacer cálculos complejos o tocar muchas tablas, suele ser una señal de mover parte de la lógica a otro lugar. Los flujos visuales funcionan mejor como director, no como toda la orquesta.
Cuándo el código personalizado es la herramienta correcta
El código personalizado es la lógica que escribes y mantienes como software: funciones, servicios o pequeñas librerías que se ejecutan como parte de tu app. Es la opción más flexible, y por eso debe usarse con intención, no por defecto.
El código personalizado merece su lugar cuando la lógica es difícil de expresar de forma segura en un procedimiento de base de datos o en un flujo drag-and-drop. Si te encuentras forzando herramientas para encajar en el problema, el código suele ser más claro y fácil de mantener correcto.
Señales fuertes para optar por código:
- El problema es algorítmico (reglas de precios, planificación de rutas, scoring, matching, comprobaciones de fraude) y tiene muchos casos límite.
- Necesitas una integración inusual (una API de un partner con autenticación rara, reintentos complejos, reglas estrictas de idempotencia).
- El rendimiento es sensible (procesamiento de alto volumen, cálculos pesados, caching cuidadoso) y necesitas control fino.
- Debes compartir la misma lógica en varios lugares (web, móvil, jobs por lotes) sin copiarla.
- Necesitas pruebas automatizadas sólidas alrededor de la lógica porque los errores son costosos.
El código también aclara la propiedad. Un equipo puede ser responsable de revisar cambios, mantener las pruebas y documentar el comportamiento. Eso es mejor que “vive en tres flujos y nadie está seguro cuál se ejecuta primero”.
Ejemplo: un motor de decisión de reembolsos que considera historial de pedidos, señales de fraude, estado de envío y ventanas de tiempo. Puedes mantener los pasos de aprobación en un flujo visual, pero la decisión en sí suele estar mejor como código con tests unitarios y control de versiones.
El costo es real. El código personalizado necesita tiempo de ingeniería, revisiones y mantenimiento continuo. Los cambios pueden tardar más que editar un flujo y necesitas un proceso de despliegue. AppMaster puede reducir cuánto código necesitas cubriendo partes comunes con lógica visual y módulos, mientras permite exportar código fuente y extender donde realmente se necesite.
Un marco paso a paso que puedes reutilizar
Los equipos suelen saltarse la parte más útil: escribir la regla claramente y luego elegir un hogar que coincida con cómo se comporta la regla.
Usa este marco cada vez que aparezca nueva lógica:
- Escribe la regla en una frase y etiquétala. Si trata sobre datos válidos (restricciones, unicidad, totales que deben coincidir), es una regla de datos. Si trata sobre pasos y entregas (aprobaciones, esperas, notificaciones), es una regla de proceso. Si tiene mucha matemática o transformaciones complejas, es una regla de computación.
- Pregunta quién la edita y con qué frecuencia. Si personas no técnicas deben cambiarla semanalmente, no la entierres en SQL o en un despliegue de código. Si raramente cambia y debe aplicarse siempre, la base de datos es candidata más fuerte.
- Revisa el impacto del fallo y el rastro de auditoría que necesitas. Si un error puede causar pérdida de dinero, problemas de cumplimiento o datos difíciles de arreglar, prefiere un lugar con logging claro y control estricto.
- Elige la ubicación y define el límite. Sé explícito sobre entradas, salidas y errores. Ejemplo: “Dado un
order_id, devuelveallowed_refund_amounto un código de razón claro.” Ese límite evita que la lógica se filtre por todos lados. - Escoge una capa para mantener delgada. Decide qué debe ser mayormente “tonto” para no duplicar reglas. Opciones comunes: mantener la base de datos delgada (solo integridad de datos), mantener los flujos delgados (solo orquestación) o mantener el código delgado (solo pegamento).
Regla práctica: pon reglas de datos lo más cerca posible de los datos, pon reglas de proceso en una herramienta de flujos y pon reglas de cómputo donde sean más fáciles de probar y versionar.
Si usas una plataforma como AppMaster, puedes tratar la base como guardrails (tablas, relaciones, restricciones básicas) y usar el Business Process Editor para las partes de “quién hace qué a continuación”, reservando código personalizado para los pocos casos que realmente lo necesitan.
Errores comunes que crean sistemas desordenados
Los sistemas desordenados rara vez ocurren por una mala elección única. Suceden cuando la lógica se dispersa, se oculta o se copia hasta que nadie está seguro de qué hace realmente el sistema.
La duplicación es el problema clásico: la misma regla existe en dos sitios, pero se van separando con el tiempo. Ejemplo: la base de datos rechaza reembolsos mayores a $500 a menos que exista un registro de aprobación, pero un flujo aún envía la solicitud de reembolso a pagos porque checa un límite distinto. Ambos “funcionan” hasta el primer caso límite real y entonces soporte recibe un bug misterioso.
Las reglas ocultas siguen. Triggers, procedimientos almacenados y arreglos rápidos en la base de datos pueden ser invisibles para quienes construyen la UI o los flujos. Si la regla no está documentada cerca del flujo o la API que depende de ella, los cambios se vuelven conjeturas y las pruebas se convierten en prueba y error.
Los flujos sobrecargados crean otro tipo de desorden. Una cadena larga drag-and-drop con docenas de ramas se vuelve un artefacto frágil que nadie quiere tocar. En herramientas como AppMaster es fácil seguir añadiendo bloques porque es rápido, pero la rapidez hoy puede convertirse en confusión mañana si el flujo no tiene límites claros.
Dos errores opuestos de “demasiado” causan dolor a largo plazo:
- Demasiado en la base de datos: cada cambio de política se convierte en un proyecto de migración y pequeños ajustes de producto esperan a despliegues de BD.
- Demasiado en el código: reglas básicas de datos (campos obligatorios, estados permitidos, restricciones únicas) se olvidan y datos malos entran por importaciones, herramientas administrativas o integraciones futuras.
Un hábito simple evita la mayoría: mantén cada regla en un hogar primario y escribe dónde vive y por qué. Si no puedes responder “¿dónde se hace cumplir esto?” en 10 segundos, ya estás pagando la cuota del desorden.
Chequeos rápidos: decide en 2 minutos
Estás eligiendo dónde es más fácil mantener una regla correcta, visible y cambiable.
Empieza con una pregunta: ¿esta regla trata sobre corrección de datos, es decir, nunca debe poder ser evitada? Si la respuesta es sí, empújala más cerca de la base de datos. Si trata sobre pasos, aprobaciones o notificaciones, mantenla cerca de la capa de flujo.
Una lista rápida:
- ¿Hace cumplir la corrección de datos (evitar inventario negativo, bloquear registros “activos” duplicados)? Inclínate por la base de datos.
- ¿Toca muchas tablas y necesita actualizaciones set-based (muchas filas a la vez)? Inclínate por la base de datos.
- ¿Necesita una traza de auditoría clara y legible por humanos de quién aprobó qué y cuándo? Inclínate por el flujo.
- ¿Usuarios no ingenieros necesitarán cambiarla semanal o mensualmente? Inclínate por el flujo.
- ¿Llama a servicios externos (pagos, mensajería, IA)? Inclínate por la aplicación o el flujo, no por la base de datos.
Ahora piensa en el fallo. Una regla que puede fallar debería fallar de una manera que los humanos puedan recuperar.
Si necesitas reintentos seguros y mensajes de error claros, prefiere una capa de orquestación donde puedas rastrear estado y manejar excepciones paso a paso. Las herramientas visuales de flujo suelen facilitar esto porque cada paso es explícito y puede registrarse.
Un desempate práctico:
- Si el sistema debe seguir correcto incluso cuando alguien escriba una nueva app después, hazlo cumplir en la base de datos.
- Si el proceso debe ser leído y revisado por equipos de operaciones, mantenlo en un flujo visual.
- Si implica integraciones complejas, cómputo pesado o librerías especiales, usa código personalizado.
Ejemplo: “El monto de reembolso no puede exceder el pago original” es corrección, así que hazlo cumplir cerca de los datos. “Reembolsos mayores a $500 requieren aprobación de un gerente y luego enviar un mensaje por Telegram” es un flujo. En AppMaster, esa cadena de aprobación encaja naturalmente en el Business Process Editor, mientras que las restricciones estrictas quedan en el modelo de datos.
Ejemplo práctico: reembolsos con aprobaciones
Un caso común es un reembolso que necesita aprobación de un gerente por encima de cierta cantidad, además de notificaciones y un rastro de auditoría limpio.
Empieza por definir una fuente de verdad: un único registro Refund con montos y un campo de estado claro (por ejemplo: requested, needs_approval, approved, rejected, processing, paid, failed). Todas las partes del sistema deben leer y escribir esos mismos campos, en lugar de mantener estados paralelos en distintos sitios.
Qué pertenece en la base de datos
Pon las reglas que protegen el dinero y la consistencia de los datos lo más cerca posible de los datos.
Usa restricciones (y a veces un procedimiento almacenado) para asegurar que no puedas reembolsar más que el monto capturado, reembolsar un pedido ya totalmente reembolsado, crear dos solicitudes de reembolso activas para el mismo pedido o cambiar montos clave después de que el reembolso esté aprobado.
También guarda la actualización atómica aquí: cuando se crea una solicitud de reembolso, escribe la fila Refund y actualiza los totales del Order en una transacción. Si alguna escritura falla, nada debe quedar parcialmente actualizado.
Qué encaja mejor en un flujo visual
Los pasos de aprobación son proceso, no protección de datos. Un flujo visual es un buen hogar para enrutar la solicitud al gerente correcto, esperar una decisión, actualizar el estado, enviar recordatorios y notificar al solicitante.
Un flujo simple podría ser: crear solicitud -> si el monto excede el límite, poner estado needs_approval -> notificar al gerente -> si aprueba, poner approved -> notificar al solicitante -> si no responde en 24 horas, enviar un recordatorio.
En una herramienta como AppMaster, esto mapea limpiamente a un Business Process que reacciona a cambios de estado y desencadena email, SMS o mensajes por Telegram.
Qué debería ser código personalizado
Los proveedores de pago tienen casos límite que no siempre encajan en reglas o pasos drag-and-drop. Mantén la lógica específica del proveedor en código personalizado, como reembolsos parciales con tarifas o pagos multi-capture, reconciliación de webhooks (el proveedor dice “paid” pero tu app dice “processing”) y manejo de idempotencia y reintentos cuando el proveedor se queda sin respuesta.
La clave es que el código personalizado no debe inventar sus propios estados. Lee el registro Refund, realiza la acción con el proveedor y luego escribe el siguiente estado y montos confirmados para que la base de datos siga siendo el libro mayor que todos confían.
Próximos pasos: hacer que la elección perdure
Una buena decisión solo ayuda si se mantiene seis meses después. El objetivo es hacer que la elección de “¿dónde vive esta lógica?” sea fácil de ver, fácil de probar y difícil de evitar accidentalmente.
Crea un mapa simple de la lógica: una lista corta de tus reglas clave y el hogar que escogiste para cada una. Manténlo breve y actualízalo cuando cambie una regla. Incluye el nombre de la regla, dónde vive (base de datos, flujo, código personalizado), por qué (una oración), qué lee y escribe, y quién aprueba cambios.
Escribe límites como no negociables que protejan tu sistema cuando la gente añada características más adelante. Un formato útil es: “La base de datos garantiza X” y “Los flujos hacen cumplir Y.” Por ejemplo, la base de datos garantiza que un registro de reembolso no puede existir sin un pedido, mientras que el flujo hace cumplir que reembolsos mayores a $500 requieren aprobación de gerente.
Planea pruebas antes de cambiar cualquier cosa. No necesitas un plan grande, solo algunos casos que volverás a ejecutar cada vez que la regla cambie:
- Camino feliz (entrada esperada, resultado esperado)
- Camino de fallo (datos faltantes, estado inválido, solicitud duplicada)
- Concurrencia (dos personas disparando la misma acción al mismo tiempo)
- Seguridad (un usuario intentando saltarse pasos o llamar un endpoint directamente)
Define también la propiedad y las reglas de revisión. Decide quién puede editar procedimientos almacenados, quién puede editar flujos y qué necesita revisión por pares. Ahí es donde muchos sistemas se mantienen saludables o se deslizan hacia “nadie sabe por qué esto funciona”.
Si quieres flujos drag-and-drop sin renunciar a una estructura real de backend, una plataforma como AppMaster (appmaster.io) puede ser un punto medio práctico: modela tus datos, expresa el proceso en el Business Process Editor y regenera y despliega conforme cambian los requisitos.
Escoge una regla de alto impacto, mapeala, añade límites y escribe tres casos de prueba. Ese hábito único evita la mayoría de la dispersión de la lógica.
FAQ
Ponla donde se mantenga correcta, visible y fácil de cambiar. Mantén las reglas de integridad de datos cerca de la base de datos, las secuencias paso a paso en flujos de trabajo, y usa código cuando la regla sea demasiado compleja o requiera control y pruebas rigurosas.
Usa procedimientos almacenados para protección de datos y trabajo en lote: hacer cumplir invariantes para todas las apps, realizar actualizaciones set-based y ejecutar transacciones atómicas que siempre deben ser consistentes. Manténlos pequeños y estables para que no se conviertan en lógica oculta “sorpresa”.
Los flujos visuales funcionan mejor para reglas de proceso: aprobaciones, enrutamiento, notificaciones, recordatorios, pasos de espera e integraciones que siguen una secuencia legible. Son ideales cuando personas no técnicas o equipos multifuncionales necesitan revisar y ajustar cómo fluye el trabajo.
Elige código personalizado para lógica algorítmica o inusual: precios complejos, decisiones antifraude, emparejamiento/puntuación, reintentos avanzados e idempotencia, o integraciones que requieren librerías especiales y manejo de errores cuidadoso. El código también es mejor cuando necesitas pruebas automáticas sólidas alrededor de errores costosos.
Coloca las reglas innegociables de dinero y consistencia en la base de datos, y deja los pasos de aprobación y comunicación en un flujo de trabajo. Si los mezclas, o bloqueas cambios legítimos con despliegues de BD, o permites que los datos malos entren cuando alguien salta la UI.
Mantén cada regla en un hogar principal y hace que las otras capas lo llamen en vez de reimplementarlo. La duplicación es lo que provoca bugs tipo “funcionó en la UI pero falló en la base de datos” cuando límites, estados o validaciones se desincronizan.
Mantén los flujos pequeños y enfocados: un resultado claro, ramificaciones simples y nombres legibles para los pasos. Cuando un flujo empieza a hacer cálculos pesados o a tocar muchas tablas, separa la computación en código o mueve la integridad a la base de datos.
Trata la lógica de base de datos como cambios de software: versiona, revisa, prueba y documenta dónde se hace cumplir. Asegura también que los errores produzcan mensajes accionables en la capa de flujo o API para que la gente entienda qué falló y cómo actuar.
Haz cumplir acceso y restricciones de integridad en el nivel de datos, y guarda la traza del proceso (quién aprobó qué y cuándo) en la capa de flujo con cambios de estado explícitos y logs. Esta separación facilita las auditorías porque puedes probar tanto las reglas de datos como la pista de decisión.
AppMaster es un punto intermedio práctico cuando quieres datos estructurados y procesos legibles. Puedes modelar datos respaldados por PostgreSQL y expresar procesos de negocio en el Business Process Editor, reservando procedimientos almacenados para salvaguardas y código para casos límite.


