SQL como API

Usar SQL como límite público de API promete consultas potentes y flexibles para los clientes, pero plantea preguntas difíciles sobre seguridad, rendimiento y control de la complejidad. Los comentaristas comparan este enfoque con alternativas como DSL JSON personalizados, GraphQL, filtros de URL al estilo PostgREST y controles de acceso nativos de la base de datos (RBAC, seguridad a nivel de fila, timeouts), discutiendo cuánta capacidad deberían tener los usuarios y dónde hacer cumplir las restricciones. Muchos ven valor en lenguajes de consulta tipo SQL o subconjuntos limitados traducidos a SQL, pero las opiniones divergen mucho sobre si exponer SQL sin procesar en internet es alguna vez una buena idea.

Marco general

  • El hilo debate usar SQL (o algo parecido a SQL) como una API/lenguaje de consulta en lugar de estructuras de filtrado JSON a medida o endpoints REST.
  • Muchos ven esto como, inevitablemente, “inventar un lenguaje de consulta” de todos modos; la verdadera pregunta es: ¿cuál, y dónde hacer cumplir las restricciones?

SQL vs DSL personalizado / JSON / GraphQL

  • A favor de un subconjunto de SQL:
    • SQL es expresivo, muy conocido y naturalmente extensible; añadir más del lenguaje puede seguir siendo compatible hacia atrás.
    • Evita diseñar una estructura ad hoc que pueda romperse después o volverse difícil de evolucionar.
    • SQL local (p. ej., SQLite en el navegador/WASM) más sincronización puede difuminar los límites entre API y base de datos.
  • A favor de DSL / JSON:
    • Los formatos JSON/AST personalizados o lispy son más fáciles de analizar, comprobar tipos y transformar a SQL o a otros backends (p. ej., Elasticsearch).
    • Los DSL “que parecen SQL pero no son realmente SQL” pueden ser confusos; mejor ser explícito y estructurado.
    • Los estándares existentes (OData, JSON:API, AIP/CEL de filtrado de Google, lenguajes de expresión, Substrait) ya cubren muchas necesidades.
  • GraphQL recibe opiniones mixtas:
    • Algunos lo ven como equivalente a “empaquetar consultas” (resolviendo n+1/viajes de red).
    • Otros sostienen que principalmente es un lenguaje de composición de resultados, con poder de consulta limitado (sin uniones/recursión) y una gran sobrecarga de stack.

Seguridad, permisos y QoS

  • Preocupaciones: exponer SQL se califica de inseguro, difícil de mantener y arriesgado para el rendimiento (escaneos de tablas, DoS, superficie amplia).
  • Contraargumentos:
    • Las bases de datos modernas ofrecen RBAC, seguridad a nivel de fila, restricciones, vistas, timeouts, cuotas y limitación de tasa; todo esto puede acotar el daño.
    • Los timeouts de sentencias y los límites de recursos pueden frenar consultas patológicas.
  • Persiste el desacuerdo sobre si la seguridad a nivel de base de datos es más simple o más compleja que compilar un DSL restringido a SQL.

Experiencia de consulta orientada al usuario

  • Para usuarios no técnicos (p. ej., búsqueda de productos), SQL libre se considera demasiado difícil; los controles de la UI se mapean de forma natural a AND/OR/facetas simples.
  • Algunos profesionales informan que la lógica OR compleja en la búsqueda de productos rara vez se solicita; otros echan de menos con frecuencia una búsqueda booleana más rica en las herramientas.
  • Para usuarios avanzados (logs, auditorías, administración/informes), los lenguajes de consulta textuales (tipo SQL, Lucene, estilo JQL) se consideran muy valiosos.

Herramientas y patrones existentes

  • Ejemplos citados: PostgREST, APIs tipo SQL de grandes proveedores, los controles de ClickHouse, acceso público a Postgres de crt.sh y patrones de “envía la BD”.
  • Algunos sostienen que hacerlo “bien” se aproxima a lo que herramientas como PostgREST ya ofrecen; otros defienden implementaciones pequeñas y específicas del contexto.