Migrar de Airtable a PostgreSQL: patrones prácticos de traducción
Aprende a migrar de Airtable a PostgreSQL traduciendo registros vinculados, rollups, fórmulas y permisos para una app en producción.

Por qué los patrones de Airtable se sienten diferentes en una base de producción
Airtable funciona bien cuando necesitas algo que se parezca a una hoja de cálculo, pero con estructura. El problema aparece cuando la base se convierte en “el sistema” y más personas dependen de ella a diario. Una configuración ingeniosa de linked records, rollups y fórmulas puede volverse lenta, difícil de controlar y fácil de modificar por accidente.
Una app de producción respaldada por PostgreSQL se construye con expectativas distintas. Los datos se comparten. Las reglas se aplican todo el tiempo (no solo en una vista). Los cambios deben ser trazables. Por eso “migrar de Airtable a PostgreSQL” suele tratarse menos de copiar tablas y más de traducir comportamientos.
El uso en producción normalmente implica algunos requisitos concretos:
- Fiabilidad: la app se comporta igual para cada usuario, cada vez.
- Control de acceso: la gente solo ve y edita lo que se le permite.
- Auditabilidad: puedes responder “¿quién cambió qué y cuándo?”
- Rendimiento a escala: más registros y más usuarios no deben romper el trabajo diario.
- Propiedad clara: las actualizaciones ocurren mediante las reglas de la app, no con ediciones manuales dispersas en vistas.
En Airtable, muchas reglas son “en tiempo de vista”. Un rollup muestra un total, una fórmula muestra un valor calculado y una vista filtrada oculta registros. En PostgreSQL, esos comportamientos suelen convertirse en relaciones, consultas agregadas y lógica de aplicación que se ejecuta de forma consistente sin importar en qué parte de la app esté el usuario.
Algunos comportamientos de Airtable no se mapearán 1 a 1. Un campo de enlace que “simplemente funciona” puede convertirse en una tabla de unión con reglas más estrictas. Una fórmula que mezcla texto, fechas y búsquedas puede transformarse en una expresión SQL, una vista de base de datos o lógica en el backend.
Un ejemplo simple: en Airtable, un responsable puede ver el “Pipeline total” vía un rollup en una vista. En una app de producción, ese mismo número debe respetar permisos (¿qué acuerdos pueden ver?), refrescarse de forma predecible y ser reproducible en informes.
Empieza con una auditoría de Airtable que refleje los flujos reales
Antes de migrar de Airtable a PostgreSQL, escribe cómo se usa realmente la base día a día. Airtable suele empezar como una “hoja viva”, así que la misma tabla puede terminar haciendo reportes, aprobaciones y ediciones rápidas al mismo tiempo. Una app con base de datos necesita reglas más claras.
Haz inventario de lo que existe, incluidas las partes que la gente olvida, como vistas “temporales” y scripts puntuales que mantienen las cosas en marcha.
- Tablas (incluyendo las ocultas o archivadas)
- Vistas y filtros de los que dependen los equipos (especialmente las vistas “Mi trabajo”)
- Interfaces, formularios y quién usa cada uno
- Automatizaciones, scripts e integraciones
- Rutinas manuales (copiar/pegar importaciones, limpieza semanal)
Luego, etiqueta los campos como fuente de verdad o derivados.
- Los campos fuente de verdad los introduce una persona o un sistema de confianza (email del cliente, fecha de firma del contrato).
- Los campos derivados son rollups, fórmulas, lookups y banderas de estado impulsadas por otros datos.
Esto importa porque algunos valores derivados deberían almacenarse (para historial y auditoría), mientras que otros deberían calcularse cuando se necesiten.
Una regla útil: si la gente necesita saber “cómo era en ese momento” (por ejemplo, la comisión en el momento en que se cerró un trato), guárdalo. Si es solo para mostrar (por ejemplo, “Días desde la última actividad”), calcúlalo.
Captura los puntos dolor en lenguaje sencillo. Ejemplos: “La vista Deals tarda 20 segundos en cargar”, “Los managers ven campos salariales”, “Seguimos arreglando enlaces rotos tras las importaciones”. Estos se convierten en requisitos reales para permisos, rendimiento y comprobaciones de datos en la nueva app.
Traducción del modelo de datos: tablas, campos e IDs
Al migrar de Airtable a PostgreSQL, el mayor cambio de mentalidad es que la base de datos necesita reglas que se mantengan incluso cuando cambien etiquetas y diseños. Airtable puede tolerar “lo que sea que haya en la celda hoy”. PostgreSQL no debería.
Empieza traduciendo cada tabla de Airtable a una entidad real con una clave primaria estable. No uses un nombre humano (como “Acme, Inc.”) como ID. Los nombres cambian, se escriben mal y a veces colisionan. Usa un ID interno (a menudo un UUID o ID numérico) y deja los nombres como atributos editables.
Los tipos de campo merecen una segunda revisión porque el “número” o “texto” de Airtable puede ocultar diferencias importantes:
- Si un campo tiene un pequeño conjunto conocido de valores, trátalo como una elección controlada (estado, prioridad, nivel).
- Si contiene dinero, almacénalo como un tipo numérico diseñado para cálculos monetarios (y decide la moneda).
- Para tiempos, decide entre una fecha (sin hora) y un timestamp (momento exacto).
Los valores en blanco también necesitan una política clara. Airtable mezcla con frecuencia “vacío”, “cero” y “desconocido” de formas que parecen bien en una cuadrícula. En PostgreSQL debes decidir qué significa cada estado:
- Usa NULL cuando “realmente no sabemos aún”.
- Usa un valor por defecto cuando “hay un valor normal” (por ejemplo, status = "new").
- Convierte cadenas vacías a NULL cuando vacío realmente significa “faltante”.
- Mantén cadenas vacías solo cuando el vacío sea significativo.
- Añade chequeos básicos (por ejemplo, amount >= 0) para detectar importaciones malas.
Finalmente, añade algunos índices según el uso real. Si la gente filtra por cuenta, estado y fecha de creación cada día, esas columnas son candidatas claras. Evita indexación avanzada hasta tener datos reales de rendimiento, pero no ignores las obvias.
Ejemplo: una tabla “Deals” podría quedar como deals(id, account_id, stage, amount, close_date, created_at). Esa estructura permanece estable sin importar la UI que pongas encima.
Linked records: convertir enlaces en relaciones y tablas de unión
Airtable hace que las relaciones parezcan simples: agregas un campo linked record y ya está. En PostgreSQL, debes decidir qué significa ese enlace.
Empieza por la cardinalidad: ¿cada registro puede tener una sola coincidencia o muchas?
- Uno-a-muchos: una Company tiene muchos Contacts, pero cada Contact pertenece a una sola Company.
- Muchos-a-muchos: un Contact puede trabajar con muchos Deals, y un Deal puede incluir muchos Contacts.
En PostgreSQL:
- Un enlace uno-a-muchos suele ser una sola columna en el lado “muchos” (por ejemplo, contacts.company_id).
- Un enlace muchos-a-muchos suele convertirse en una tabla de unión, como deal_contacts(deal_id, contact_id).
Esa tabla de unión también puede contener detalles extra que a menudo se meten en la relación, como role_on_deal o added_by.
Mantén los enlaces seguros con integridad referencial
Airtable permite que los enlaces se vuelvan desordenados con el tiempo. En una app con base de datos, puedes evitar eso con foreign keys y reglas claras de borrado.
Decide:
- ¿Las eliminaciones deben hacer cascade, ser restringidas o poner el enlace a null?
- ¿Se deben bloquear filas huérfanas (por ejemplo, deal_contacts sin un deal o contact real)?
IDs vs nombres para mostrar
Airtable muestra un “campo primario” amigable como etiqueta del enlace. PostgreSQL debería guardar claves estables (ID numérico o UUID) y la app mostrar nombres amigables.
Un patrón práctico: almacena company_id en todos los lados, conserva companies.name (y posiblemente companies.code) para mostrar y buscar.
Rollups: de las cuentas en vista a agregados en la base de datos
En Airtable, un rollup es “matemáticas a través de registros relacionados”. Parece un campo único, pero en realidad es un resumen de muchas filas: conteos, sumas, fechas mín/max, promedios o listas sacadas a través de un enlace.
En PostgreSQL, la misma idea se convierte en una consulta agregada. Unes tablas relacionadas, agrupas por el registro padre y calculas totales con funciones internas. Al migrar de Airtable a PostgreSQL, los rollups dejan de ser campos tipo hoja de cálculo y pasan a ser preguntas que la base puede responder.
Traduciendo rollups comunes a pensamiento SQL
Patrones comunes incluyen:
- “Importe total de facturas para este cliente” -> SUM(amount) agrupado por cliente
- “Número de tareas abiertas en este proyecto” -> COUNT(*) con un filtro de estado
- “Fecha de la última actividad” -> MAX(activity_date)
- “Tamaño medio de trato por representante” -> AVG(deal_value)
Los rollups de Airtable con frecuencia incluyen filtros como “solo ítems activos” o “solo últimos 30 días”. En la base de datos eso se convierte en una cláusula WHERE. Sé explícito sobre zonas horarias y qué significa “últimos 30 días”, porque los reportes en producción se cuestionan.
Rollups calculados vs almacenados
Tienes dos opciones:
- Calcular rollups bajo demanda (siempre frescos, más sencillo de mantener).
- Almacenarlos (pantallas más rápidas, pero debes mantenerlos actualizados).
Una regla práctica: calcula para dashboards y listados; almacena solo cuando necesites velocidad a escala o snapshots estables.
Fórmulas: decidir qué se convierte en SQL y qué en lógica de la app
Al migrar de Airtable a PostgreSQL, las fórmulas suelen necesitar la traducción más cuidadosa. En Airtable, una fórmula puede alimentar silenciosamente una vista, un filtro y un flujo de trabajo al mismo tiempo. En una app de producción quieres resultados consistentes, rápidos e idénticos en cada pantalla.
Ordena las fórmulas según lo que realmente hacen:
- Formateo: convertir valores en etiquetas como "Q1 2026" o "Alta prioridad"
- Flags condicionales: checks TRUE/FALSE como "Vencido" o "Necesita revisión"
- Cálculos: totales, márgenes, diferencias de fecha, puntuaciones
- Lookups: traer valores a través de registros vinculados
- Reglas de negocio: cualquier cosa que cambie lo que los usuarios pueden hacer (elegibilidad, aprobaciones)
Cálculos y flags simples suelen pertenecer a SQL (expresiones en consultas, vistas o campos calculados). Eso mantiene cada pantalla consistente y evita reimplementar la misma matemática en varios lugares.
Si una fórmula es realmente una regla (por ejemplo, “Descuento permitido solo si la cuenta está activa y el trato supera $5,000”), normalmente debería moverse a la lógica del backend. Así no puede ser eludida por un cliente distinto, una importación CSV o un nuevo reporte.
Mantén el formateo cerca de la UI. Las etiquetas para mostrar se construyen en la interfaz web y móvil sin hardcodearlas en la base de datos.
Antes de finalizar, elige algunos resultados que siempre deben coincidir (como Status, Amount Due, SLA Breach) y decide dónde viven. Luego pruébalos desde cada cliente para que el número que alguien ve en la app sea el mismo que finanzas exporta después.
Rediseño de permisos: roles, acceso a registros y trazas de auditoría
Los permisos en Airtable suelen sentirse simples porque se basan principalmente en base, tabla y vistas. En una app de producción eso rara vez es suficiente. Las vistas son útiles para el flujo de trabajo, pero no son una frontera de seguridad. Al migrar de Airtable a PostgreSQL, trata cada decisión de “¿quién puede ver esto?” como una regla de acceso que debes aplicar en todas partes: API, UI, exportaciones y jobs en background.
Empieza listando los roles que necesita tu app, no las pestañas que la gente pulsa. Un conjunto típico:
- Admin: gestiona configuraciones, usuarios y todos los datos
- Manager: aprueba cambios y ve el trabajo de su equipo
- Staff: crea y actualiza registros asignados, reporting limitado
- Cliente: ve sus propias solicitudes, facturas o estado
Luego define reglas a nivel de registro (acceso por fila). Muchas apps reales se reducen a uno de estos patrones: “solo mis registros”, “mi equipo” o “mi organización”. Ya sea que lo apliques en la base de datos (row-level security) o en la capa API, la clave es la consistencia: cada consulta necesita la regla, incluidas exportaciones y pantallas “ocultas”.
Planifica la auditoría desde el primer día. Decide qué debes registrar por cada cambio:
- Quién lo hizo (user ID, rol)
- Qué cambió (campo por campo antes/después cuando haga falta)
- Cuándo ocurrió (timestamp y zona horaria)
- De dónde vino (UI, importación, API)
- Por qué (nota opcional o código de razón)
Plan de migración paso a paso que evita sorpresas
Las migraciones más seguras suelen ser aburridas. Fijas una fecha, reduces las partes móviles y facilitas comparar la base vieja con la nueva app.
Una semana antes del movimiento, para el cambio de esquema. Acepta una fecha de corte y establece una regla: no nuevas tablas, no nuevos campos, no renombrar campos. Pequeños cambios pueden romper importaciones y fórmulas de formas silenciosas.
Un plan simple de cinco pasos:
- Bloquea la estructura y define qué significa “terminado” (qué pantallas, flujos y reportes deben coincidir).
- Exporta datos y límpialos fuera de Airtable. Normaliza multi-selects, separa campos combinados y crea IDs estables para que los enlaces permanezcan intactos.
- Crea el esquema de PostgreSQL e importa por lotes con comprobaciones. Valida conteo de filas, campos requeridos, unicidad y claves foráneas.
- Reconstruye lo esencial diario primero: las pocas pantallas que la gente usa cada día, más los flujos de crear/actualizar.
- Corre en paralelo por una ventana corta y luego haz el corte. Mantén un plan de rollback: acceso en solo lectura a Airtable, snapshot de PostgreSQL antes del corte y una regla clara para detenerse si aparecen discordancias críticas.
Ejemplo: para una base de sales ops, ejecuta ambos sistemas por una semana. Los comerciales registran actividad en la nueva app, pero el equipo compara los totales de pipeline con Airtable cada mañana hasta que los números coincidan de forma consistente.
Calidad de datos y pruebas: demuestra que la nueva app coincide con la realidad
La mayoría de los bugs de migración no son “bugs de PostgreSQL”. Son desajustes entre lo que Airtable significaba y lo que ahora almacenan tus tablas nuevas. Trata las pruebas como parte del trabajo de datos, no como una tarea de última hora.
Mantén una hoja de mapeo simple. Para cada campo de Airtable, escribe la columna objetivo en Postgres y dónde se usa en la app (pantalla, reporte, regla de estado). Esto evita el “lo importamos” que se traduce en “no lo usamos nunca”.
Empieza con comprobaciones de saneamiento rápidas:
- Compara conteos de filas por tabla antes y después de la importación.
- Revisa enlaces faltantes (foreign keys que apuntan a nada).
- Encuentra duplicados donde valores eran “únicos en la práctica” (emails, IDs de trato).
- Detecta campos requeridos vacíos que Airtable permitía mediante formularios.
Luego valida los cálculos que la gente usa. Elige registros reales y verifica totales, estados y rollups contra ejemplos conocidos. Aquí es donde las sustituciones de fórmulas suelen desviarse, porque vacío, cero y registros vinculados ausentes se comportan diferente.
Finalmente, prueba datos de borde a propósito: vacíos, enlaces eliminados, textos largos, caracteres inusuales y saltos de línea. Nombres como "O'Neil" y notas con varias líneas son fuentes comunes de problemas en importación y presentación.
Trampas comunes al traducir Airtable a PostgreSQL
La mayor trampa es tratar una base de Airtable como una simple exportación de base de datos. Airtable mezcla almacenamiento, lógica de vista, fórmulas y reglas de compartición. PostgreSQL separa esas preocupaciones, lo cual es más sano en producción, pero te obliga a elegir dónde vive cada comportamiento.
Los linked records son un ejemplo clásico. Muchos equipos asumen que cada enlace es uno-a-muchos porque parece un solo campo. En la práctica, muchos enlaces de Airtable son muchos-a-muchos. Si modelas eso como una sola clave foránea, pierdes relaciones y terminas con soluciones improvisadas más tarde.
Los rollups pueden causar otro problema. Si importas el número actual de un rollup como verdad final, también necesitas capturar cómo se calculó. De lo contrario no podrás explicar por qué el número cambia después. Prefiere agregados recomputables (SUM/COUNT) con definiciones claras y decide si necesitas cache y cómo se actualiza.
Las vistas pueden engañar también. Los equipos a veces reconstruyen vistas de Airtable como filtros fijos en la nueva app, y luego descubren que esas vistas eran flujos personales, no requisitos compartidos. Antes de fijar filtros, pregunta quién usaba la vista, qué acción tomaban después y si necesitan filtros guardados, segmentos o un dashboard.
Una checklist rápida de trampas:
- Estados en texto libre (“In progress”, “in-progress”, “IP”) sin limpieza y sin valores controlados
- Rollups importados como respuestas finales sin definición ni plan de recalculo
- Campos de enlace modelados sin tablas de unión cuando las relaciones son muchos-a-muchos
- Vistas reconstruidas como pantallas fijas sin confirmar la intención del usuario
- Permisos añadidos al final, forzando reescrituras dolorosas
Escenario ejemplo: una base de sales ops reconstruida como una app real
Imagina una base de Sales Ops en Airtable con cuatro tablas: Accounts, Deals, Activities y Owners (reps y managers). En Airtable, un Deal enlaza con una Account y un Owner, y las Activities enlazan con un Deal (llamadas, emails, demos).
En PostgreSQL, esto se convierte en un conjunto claro de relaciones: deals.account_id apunta a accounts.id, deals.owner_id apunta a owners.id, y activities.deal_id apunta a deals.id. Si además necesitas múltiples owners por deal (rep + sales engineer), añades una tabla de unión como deal_owners.
Una métrica común en Airtable es “Deal Value rollup por Account” (suma de valores de deals vinculados). En una app con base de datos, ese rollup es una consulta agregada que puedes ejecutar bajo demanda, cachear o materializar:
SELECT a.id, a.name,
COALESCE(SUM(d.amount), 0) AS total_pipeline
FROM accounts a
LEFT JOIN deals d ON d.account_id = a.id
AND d.stage NOT IN ('Closed Won', 'Closed Lost')
GROUP BY a.id, a.name;
Ahora considera un “Health score” como fórmula. En Airtable es tentador meterlo todo en un solo campo. Para producción, guarda las entradas y hazlas auditable (last_activity_at, next_step_date, open_deal_count, overdue_tasks_count). Luego calcula health_score en la lógica del backend para poder cambiar las reglas sin reescribir registros antiguos. Aun así puedes almacenar la puntuación más reciente para filtrar y reportar.
Los permisos suelen necesitar la mayor revisión. En lugar de filtros de vista, define reglas explícitas de acceso:
- Los reps pueden ver y editar solo sus deals y actividades.
- Los managers pueden ver los deals de su equipo.
- Finanzas puede ver ingresos closed-won, pero no notas privadas.
- Sales Ops puede gestionar stages y reglas de scoring.
Checklist rápido antes de lanzar la nueva app PostgreSQL
Antes de ponerla en producción, haz una última revisión para asegurar que el “feeling de Airtable” se ha traducido a algo estable, testeable y seguro. Aquí es donde pequeños huecos se convierten en incidentes reales.
Si intentas migrar de Airtable a PostgreSQL, céntrate en lo que Airtable solía “manejar en silencio” por ti: relaciones, valores computados y quién puede ver o cambiar qué.
Comprobaciones pre-lanzamiento que atrapan la mayoría de sorpresas
- Relaciones: cada antiguo linked record tiene un tipo de relación explícito (uno-a-muchos, muchos-a-muchos) y una estrategia de claves clara (IDs estables, restricciones únicas y reglas de eliminación).
- Agregados: has etiquetado qué totales deben ser siempre correctos (facturas, cuotas, elegibilidad) frente a los que pueden estar ligeramente retrasados (dashboards).
- Lógica de decisión: cada fórmula que cambia resultados (aprobación, precios, comisiones, elegibilidad) está implementada y probada donde pertenece.
- Permisos: para cada rol ejecutaste historias de usuario reales de extremo a extremo (crear, editar, exportar, borrar, aprobar) y confirmaste el acceso a nivel de registro.
- Propiedad y despliegue: decidiste quién es responsable de cambios de esquema, quién revisa cambios de lógica, cómo funcionan los rollbacks y dónde corre la app.
Una comprobación realista: si un comercial podía editar “Account Tier” en Airtable y ese nivel determina descuentos, probablemente necesitas tanto un cambio de permisos (solo managers pueden editar) como una traza de auditoría que registre quién lo cambió y cuándo.
Próximos pasos: construir, lanzar y seguir mejorando
Después de migrar de Airtable a PostgreSQL, el mayor riesgo es intentar reconstruirlo todo a la vez. Empieza con un piloto que ejecute un flujo real de extremo a extremo con usuarios reales. Elige algo medible, como “crear registro - aprobar - notificar - reportar”, y mantén el alcance estrecho.
Trata el piloto como un producto. Escribe el nuevo modelo de datos y las reglas de permisos en lenguaje claro para que los responsables no técnicos puedan responder rápido a dos preguntas: “¿De dónde viene este valor?” y “¿Quién puede verlo o cambiarlo?”.
Mantén la documentación ligera. La mayoría de equipos avanza mucho con:
- Tablas clave y qué representa cada una
- Relaciones importantes (y qué deben hacer las eliminaciones/archivados)
- Qué campos son calculados (SQL vs lógica de la app) y por qué
- Roles, reglas de acceso por registro y quién concede acceso
- Expectativas de auditoría (qué debe registrarse)
Si quieres moverte rápido sin construir todo desde cero, una plataforma no-code puede funcionar bien siempre que produzca un backend real y aplique reglas de forma consistente. Por ejemplo, AppMaster (appmaster.io) está diseñada para construir apps respaldadas por PostgreSQL con lógica de negocio y acceso por rol, y además genera código fuente de producción.
Despliega por fases para que la gente cambie con seguridad: piloto con un equipo, ejecución paralela corta, un corte planificado con plan de rollback, y luego amplía flujo por flujo.
FAQ
Comienza listando qué hace realmente tu base de Airtable, no solo qué tablas existen. Presta especial atención a vistas, interfaces, automatizaciones, scripts y rutinas manuales recurrentes, porque esos a menudo contienen las “reglas” reales que una app respaldada por PostgreSQL debe aplicar de forma coherente.
Trata las tablas como entidades estables con una clave primaria real y considera las relaciones como restricciones explícitas que deben cumplirse en todas partes. Reemplaza el “lo que sea que haya en la celda” por tipos claros, valores por defecto y verificaciones para que los datos malos no se cuelen silenciosamente en importaciones o ediciones posteriores.
No uses nombres como identificadores, porque los nombres cambian, se duplican y se escriben mal. Usa un ID interno (a menudo un UUID o un ID numérico) como clave primaria y mantén el nombre como atributo editable para mostrar y buscar.
Decide si cada enlace es uno-a-muchos o muchos-a-muchos según el uso real. Uno-a-muchos normalmente se convierte en una columna con foreign key, mientras que muchos-a-muchos se modelan como una tabla de unión que también puede almacenar detalles de la relación como el rol o la fecha en que se añadió.
Añade claves foráneas para que la base de datos bloquee enlaces rotos y aplica un comportamiento deliberado ante eliminaciones: ¿hacer cascade, restringir o poner a NULL? Esto evita filas huérfanas y mantiene la consistencia después de la migración.
Considera los rollups como preguntas que la base de datos responde con consultas de agregación, no como campos tipo hoja de cálculo almacenados. Calcula las agregaciones bajo demanda para precisión por defecto, y almacénalas o cáchealas solo si tienes una razón de rendimiento y un mecanismo confiable para mantenerlas actualizadas.
Clasifica las fórmulas por propósito: formato para presentación, cálculos simples, flags, lookups y reglas de negocio reales. Mantén el formato en la UI, pon la aritmética simple en SQL cuando deba ser consistente en todas partes y mueve la lógica que define reglas a backend para que no pueda ser eludida vía importaciones o clientes alternativos.
Las vistas ayudan en los flujos de trabajo, pero no son un límite de seguridad. Define roles y reglas de acceso a nivel de registro de forma explícita y aplícalas coherentemente en la API, la UI, las exportaciones y los jobs en background. Añade auditoría para poder responder quién cambió qué y cuándo.
Congela el esquema antes del corte, exporta y limpia los datos, e importa validando campos obligatorios, unicidad y claves foráneas. Ejecuta ambos sistemas en paralelo por un breve periodo con un método claro para comparar números clave y mantén un plan de rollback, por ejemplo acceso en solo lectura a Airtable y una snapshot de la base de datos.
Si quieres velocidad sin codificar todo desde cero, elige una plataforma que produzca un backend real y reglas aplicables, no solo una UI encima de una tienda tipo hoja de cálculo. AppMaster es una opción para construir apps respaldadas por PostgreSQL con acceso por rol y lógica de negocio, y además genera código fuente de producción.


