{"id":5585,"date":"2026-08-03T13:47:19","date_gmt":"2026-08-03T20:47:19","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5585"},"modified":"2026-08-07T09:05:04","modified_gmt":"2026-08-07T16:05:04","slug":"when-column-names-lie-bringing-external-catalogs-to-nl2sql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/","title":{"rendered":"Cuando los nombres de las columnas enga\u00f1an: c\u00f3mo incorporar cat\u00e1logos externos a NL2SQL++"},"content":{"rendered":"<h2 id=\"h-the-problem\" class=\"wp-block-heading\">El problema<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">NL2SQL++ (lenguaje natural a SQL++) es tan bueno como el conocimiento del esquema que lo respalda. Dele a un modelo de lenguaje grande (LLM) una pregunta como <em>\u201c\u00bfCu\u00e1ntos clientes con una solicitud previa activa cayeron en incumplimiento?\u201d<\/em> y tiene que saber qu\u00e9 tablas existen, qu\u00e9 significa cada columna y c\u00f3mo se relacionan las tablas. La mayor\u00eda de los sistemas resuelven esto mediante <strong>incrustar el esquema de forma fija en el mensaje<\/strong>. Eso se rompe en el momento en que cambia el esquema, y colapsa por completo cuando los nombres de las columnas no tienen significado por s\u00ed mismos, la norma en los datos empresariales reales.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Considera las columnas a las que un modelo realmente se enfrenta en un esquema de producci\u00f3n. Algunos nombres son simplemente opacos: CUST_VAL_04 es el nivel de ingresos de por vida de un cliente, pero el nombre no dice nada sobre lo que contiene. Otros son peores que opacos, porque enga\u00f1an: CLOSE_DT suena como una fecha de cierre de cuenta, sin embargo, almacena una <strong>c\u00f3digo de estado<\/strong> (0 = abierto, 1 = congelado, 2 = cerrado) \u2013 un modelo que lo filtra como una fecha generar\u00e1 silenciosamente un SQL++ err\u00f3neo. Y luego est\u00e1n los casi duplicados que un nombre por s\u00ed solo no puede separar: BAL_CUR, BAL_AVG_30 y BAL_AVG_90 parecen \u201csaldo\u201d, pero solo uno es el <em>actual<\/em> saldo mientras que los otros son promedios de 30 y 90 d\u00edas. Preguntar <em>\u201c\u00bfCu\u00e1l es el saldo actual del cliente?\u201d<\/em> y solo de la columna <strong>descripci\u00f3n<\/strong> \u2013no su nombre\u2013 revela que BAL_CUR es la correcta y las otras dos son trampas. Un analista humano recurre a un diccionario de datos para leer columnas como estas. Un LLM necesita lo mismo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ese diccionario ya existe dentro de la mayor\u00eda de las organizaciones, curado en <strong>cat\u00e1logos de datos<\/strong> como DataHub y OpenMetadata: descripciones de columnas, tipos de datos y las relaciones de claves for\u00e1neas entre las tablas. El problema es que este conocimiento vive en un silo, desconectado de la base de datos operacional donde realmente se ejecutan las consultas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este proyecto conecta los cat\u00e1logos de datos empresariales con Couchbase para que NL2SQL++ pueda leer lo que realmente significan las columnas en lugar de adivinarlo por sus nombres. Extrae los metadatos de las columnas de un cat\u00e1logo, los incrusta en Couchbase y recupera el contexto correcto en el momento de la consulta mediante b\u00fasqueda vectorial, de modo que el esquema nunca est\u00e1 codificado de forma r\u00edgida. Y como diferentes clientes utilizan diferentes cat\u00e1logos, la integraci\u00f3n se basa en un <strong>patr\u00f3n de proveedor conectable<\/strong>el cambio entre cat\u00e1logos compatibles es un cambio de configuraci\u00f3n, y admitir uno nuevo implica agregar un peque\u00f1o adaptador independiente, sin tocar el resto del sistema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La Gran Idea: Una interfaz, cualquier cat\u00e1logo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En el coraz\u00f3n de este dise\u00f1o se encuentra un contrato \u00fanico que implementa cada cat\u00e1logo de datos. Cualquiera que sea la fuente, expone las mismas tres capacidades al resto de la tuber\u00eda:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Obtener metadatos de la columna<\/strong> \u2013 Cada columna de cada tabla dentro del alcance, cada una con su nombre, descripci\u00f3n, tipo de dato y ubicaci\u00f3n completamente calificada.<\/li>\n\n\n\n<li><strong>asociaciones de tipo fetch join<\/strong> \u2013 Las claves for\u00e1neas o los enlaces de linaje entre tablas, expresados como predicados de uni\u00f3n reutilizables.<\/li>\n\n\n\n<li><strong>Transmitir cambios en vivo<\/strong> \u2013 Una fuente opcional de modificaciones al esquema, para que pueda mantener los metadatos actualizados sin necesidad de una recarga completa.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Una sola configuraci\u00f3n selecciona qu\u00e9 cat\u00e1logo est\u00e1 activo. Todo lo que est\u00e1 aguas abajo (el cargador, el motor de consultas, la sincronizaci\u00f3n en vivo) se comunica con este contrato com\u00fan y nunca con un cat\u00e1logo espec\u00edfico. Para admitir el siguiente cat\u00e1logo (Atlan, un lago de datos S3 o algo a\u00fan no creado) se escribe un adaptador que cumple con el contrato; nada m\u00e1s cambia.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"764\" height=\"332\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Screenshot-2026-08-03-at-1.40.03-PM.png\" alt=\"\" class=\"wp-image-5587\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Screenshot-2026-08-03-at-1.40.03-PM.png 764w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Screenshot-2026-08-03-at-1.40.03-PM-300x130.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Screenshot-2026-08-03-at-1.40.03-PM-18x8.png 18w\" sizes=\"auto, (max-width: 764px) 100vw, 764px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">El conjunto de datos utilizado en todo momento es el p\u00fablico <a href=\"https:\/\/www.kaggle.com\/competitions\/home-credit-default-risk\">Datos de riesgo de incumplimiento de Home Credit<\/a> desde Kaggle: siete tablas relacionadas (solicitudes de pr\u00e9stamos, registros del bur\u00f3 de cr\u00e9dito, solicitudes anteriores e historiales de saldos mensuales) conviviendo en Couchbase.<br>C\u00f3mo funciona, de principio a fin<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hay dos ciclos de vida. Uno \u00fanico <strong>configuraci\u00f3n<\/strong> carga los metadatos del cat\u00e1logo en Couchbase y los hace aptos para b\u00fasquedas. El <strong>consulta<\/strong> flujo y luego responde preguntas sobre \u00e9l. Un oyente en vivo opcional mantiene los metadatos actualizados a medida que el cat\u00e1logo evoluciona.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configuraci\u00f3n: cat\u00e1logo en Couchbase<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La configuraci\u00f3n se ejecuta en cuatro pasos, todos determinados por el cat\u00e1logo que est\u00e9 activo:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Obtener los metadatos de la columna<\/strong> y almacenar un registro por columna en Couchbase: su descripci\u00f3n, tipo de datos y ubicaci\u00f3n.<\/li>\n\n\n\n<li><strong>Incruste la descripci\u00f3n de cada columna<\/strong> en un vector de 384 dimensiones utilizando un modelo sentence-transformer. Solo se incrusta la descripci\u00f3n, no el nombre cr\u00edptico, y eso es lo que hace que una pregunta en lenguaje sencillo coincida con el <em>significado<\/em> de una columna en lugar de su etiqueta.<\/li>\n\n\n\n<li><strong>Construir un \u00edndice vectorial<\/strong> sobre esos embeddings (similitud de coseno) para que las b\u00fasquedas sean r\u00e1pidas.<\/li>\n\n\n\n<li><strong>Obtener las relaciones de uni\u00f3n<\/strong> y gu\u00e1rdalos como un conjunto de predicados de uni\u00f3n deduplicados, por ejemplo: bureau.SK_ID_CURR = application_train.SK_ID_CURR.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Cada cat\u00e1logo deriva esas uniones de su propio modelo nativo \u2014DataHub a partir del linaje a nivel de columna, OpenMetadata a partir de restricciones de clave externa\u2014, pero ambos producen las cadenas de predicado id\u00e9nticas que el motor de consultas espera. Cabe destacar que el sistema <strong>no precalcula un grafo de uni\u00f3n r\u00edgido<\/strong>; conserva los predicados sin procesar y permite que el modelo en tiempo de consulta ensamble la ruta de uni\u00f3n v\u00e1lida m\u00ednima bajo demanda.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">consulta a SQL++<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Responder a una pregunta se realiza en tres etapas:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"229\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Screenshot-2026-08-03-at-1.40.48-PM-1024x229.png\" alt=\"\" class=\"wp-image-5588\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Screenshot-2026-08-03-at-1.40.48-PM-1024x229.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Screenshot-2026-08-03-at-1.40.48-PM-300x67.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Screenshot-2026-08-03-at-1.40.48-PM-768x172.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Screenshot-2026-08-03-at-1.40.48-PM-18x4.png 18w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Screenshot-2026-08-03-at-1.40.48-PM.png 1144w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Comprender<\/strong> \u2013 La pregunta se divide en subconsultas enfocadas para que cada concepto pueda coincidir de forma independiente.<\/li>\n\n\n\n<li><strong>Recuperar<\/strong> \u2013 Cada subconsulta se incrusta y se ejecuta a trav\u00e9s de una b\u00fasqueda vectorial sobre los metadatos de las columnas en Couchbase, conservando solo las coincidencias m\u00e1s cercanas por distancia de coseno. Aqu\u00ed es donde EXT_SOURCE_2 emerge para una pregunta sobre <em>puntajes de riesgo<\/em>, puramente porque su <strong>descripci\u00f3n<\/strong> coincidencias \u2013 nunca su nombre.<\/li>\n\n\n\n<li><strong>Refinar<\/strong> \u2013 La b\u00fasqueda vectorial arroja una red amplia, por lo que un modelo de lenguaje reduce los candidatos a las columnas que realmente se necesitan para responder a la pregunta, inclin\u00e1ndose por conservar cualquier cosa \u00fatil.<\/li>\n\n\n\n<li><strong>Generar<\/strong> \u2013 Finalmente, la pregunta, las columnas elegidas y las relaciones de uni\u00f3n van a un modelo de Claude en <strong>AWS Bedrock<\/strong>, el cual est\u00e1 limitado a usar \u00fanicamente las uniones proporcionadas y el camino m\u00ednimo que conecta las tablas requeridas. El resultado es SQL++ ejecutable.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Debido a que las claves de combinaci\u00f3n viajan por separado como predicados, el generador a\u00fan puede conectar combinaciones de m\u00faltiples tablas correctamente incluso cuando esas columnas de identificadores se eliminaron durante el refinamiento.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mantenerse al d\u00eda: sincronizaci\u00f3n de metadatos en vivo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Los cat\u00e1logos cambian; por ejemplo, se renombran columnas, se corrigen descripciones y las tablas aparecen y desaparecen. Un escucha opcional de larga duraci\u00f3n mantiene a Couchbase sincronizado sin volver a ejecutar la configuraci\u00f3n. Cada cat\u00e1logo observa su fuente de forma nativa \u2014DataHub consume un flujo de eventos de registro de cambios, OpenMetadata sondea su extremo de eventos\u2014 y ambos traducen lo que ven en el <strong>mismos seis eventos de cambio normalizados<\/strong>. Un grupo de trabajadores compartidos aplica luego cada evento a los metadatos almacenados:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Cambiar<\/strong><\/td><td><strong>Qu\u00e9 pasa en Couchbase<\/strong><\/td><td><strong>\u00bfVolver a integrar?<\/strong><\/td><\/tr><tr><td>Nueva tabla agregada<\/td><td>Almacenar un registro para cada columna nueva<\/td><td>S\u00ed<\/td><\/tr><tr><td>Columna agregada<\/td><td>Guardar la nueva columna<\/td><td>S\u00ed<\/td><\/tr><tr><td>Descripci\u00f3n actualizada<\/td><td>Actualizar la descripci\u00f3n <strong>y<\/strong> es un vector<\/td><td>S\u00ed<\/td><\/tr><tr><td>Tipo de dato cambiado<\/td><td>Actualizar solo el tipo<\/td><td>No<\/td><\/tr><tr><td>Columna eliminada<\/td><td>Elimina el registro de esa columna<\/td><td>No<\/td><\/tr><tr><td>Tabla eliminada<\/td><td>Elimina todos los registros de esa tabla<\/td><td>No<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ejecuciones de reincorporaci\u00f3n de incrustaciones <strong>solo cuando el texto detr\u00e1s del vector realmente cambia<\/strong> \u2013 una nueva columna o una descripci\u00f3n editada. Un cambio exclusivo de tipo de dato lo omite, por lo que no se recalcula nada sin motivo.<br>Por qu\u00e9 importa<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las pruebas en los datos de Home Credit confirmaron la tesis central: <strong>metadata-enhanced NL2SQL++ supera significativamente a un enfoque basado \u00fanicamente en el esquema.<\/strong> Frente a nombres de columnas opacos, proporcionar las descripciones del cat\u00e1logo produjo SQL++ correcto; sin ellas, el modelo cometi\u00f3 errores sistem\u00e1ticos en qu\u00e9 campos mapeaba y c\u00f3mo filtraba.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El beneficio m\u00e1s amplio es arquitect\u00f3nico. Al separar <em>de d\u00f3nde provienen los metadatos<\/em> \u2013 el cat\u00e1logo \u2013 de <em>c\u00f3mo se usa<\/em> \u2013 incrustar, buscar, generar \u2013 cualquier cliente de Couchbase puede conectar su cat\u00e1logo existente a la generaci\u00f3n de consultas impulsada por IA y obtener resultados con conocimiento del esquema sin necesidad de mantener un esquema manualmente. El dise\u00f1o conectable significa que el pr\u00f3ximo cat\u00e1logo es una adici\u00f3n peque\u00f1a y aut\u00f3noma en lugar de una reescritura.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dos ejemplos, uno al lado del otro<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La brecha es m\u00e1s f\u00e1cil de ver en SQL++. Ambas consultas a continuaci\u00f3n son <em>sint\u00e1cticamente v\u00e1lido y se ejecuta limpiamente<\/em> \u2013 la versi\u00f3n solo de esquema simplemente devuelve el <strong>respuesta incorrecta<\/strong>, porque el modelo adivin\u00f3 el significado de una columna a partir de su nombre.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejemplo A <\/strong>\u2013<strong> un valor que el nombre no puede revelar: <\/strong><strong>ESTADO<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u201c\u00bfCu\u00e1ntos registros mensuales del bur\u00f3 muestran un pr\u00e9stamo que fue dado de baja o con m\u00e1s de 120 d\u00edas de atraso?\u201d<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">STATUS en bureau_balance parece explicarse por s\u00ed solo, pero almacena un solo car\u00e1cter <strong>c\u00f3digos<\/strong>, etiquetas ilegibles. La descripci\u00f3n del cat\u00e1logo detalla la codificaci\u00f3n: <em>\u201cC significa cerrado, X significa estado desconocido, 0 significa sin DPD, 1 significa DPD m\u00e1ximo durante el mes entre 1 y 30, 2 significa DPD de 31 a 60, 5 significa DPD de 120+ o vendido o castigado.\u201d<\/em> \u201cCastigado o con m\u00e1s de 120 d\u00edas de atraso\u201d es el c\u00f3digo \u20185\u2019, y no hay forma de saber eso por el nombre.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sin el cat\u00e1logo, el modelo inventa valores de cadena de texto de apariencia plausible que no coinciden con nada en los datos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Sin cat\u00e1logo: se ejecuta bien, devuelve 0 \u2014 las etiquetas adivinadas no existen\nSELECT COUNT(*) AS num_records\nFROM creditrisk.sampleScope.bureau_balance AS bb\nWHERE bb.STATUS IN ['WRITTEN_OFF', 'DPD_120_PLUS', 'written_off'];\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Con el cat\u00e1logo, la codificaci\u00f3n est\u00e1 en la descripci\u00f3n, por lo que se mapea al c\u00f3digo real:<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Con cat\u00e1logo: correcto \u2014 '5' = DPD 120+ \/ vendido \/ castigado\nSELECT COUNT(*) AS num_records\nFROM creditrisk.sampleScope.bureau_balance AS bb\nWHERE bb.STATUS = '5';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejemplo B <\/strong>\u2013<strong> un sufijo que no significa nada por s\u00ed solo: <\/strong><strong>SK_DPD<\/strong><strong> vs <\/strong><strong>SK_DPD_DEF<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u201c\u00bfQu\u00e9 pr\u00e9stamos de POS\/efectivo estuvieron vencidos durante un mes, ignorando las deudas triviales de bajo monto?\u201d<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dos columnas casi id\u00e9nticas se ubican una al lado de la otra en POS_CASH_balance. SK_DPD es <em>\u201cDPD (d\u00edas de atraso) durante el mes del cr\u00e9dito anterior.\u201d<\/em> SK_DPD_DEF es <em>\u201cDPD durante el mes con tolerancia (se ignoran las deudas con montos de pr\u00e9stamo bajos).\u201d<\/em> La \u00fanica pista es el sufijo _DEF, que no tiene significado por su nombre. \u201cIgnorar deudas triviales de bajo monto\u201d es precisamente SK_DPD_DEF, pero nada en el nombre lo indica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sin el cat\u00e1logo, el modelo elige la columna con el nombre m\u00e1s simple y cuenta silenciosamente las deudas que la pregunta ped\u00eda excluir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Sin cat\u00e1logo: se ejecuta bien, pero SK_DPD NO ignora las deudas de bajo monto\nSELECT pc.SK_ID_PREV,\n       pc.MONTHS_BALANCE,\n       pc.SK_DPD\nFROM creditrisk.sampleScope.POS_CASH_balance AS pc\nWHERE pc.SK_DPD &gt; 0;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Con el cat\u00e1logo, la cl\u00e1usula de tolerancia en la descripci\u00f3n apunta a la columna derecha:<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Con cat\u00e1logo: correcto \u2014 SK_DPD_DEF aplica la tolerancia para montos bajos\nSELECT pc.SK_ID_PREV,\n       pc.MONTHS_BALANCE,\n       pc.SK_DPD_DEF\nFROM creditrisk.sampleScope.POS_CASH_balance AS pc\nWHERE pc.SK_DPD_DEF &gt; 0;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En ambos casos, el fallo es invisible a nivel de SQL: nada produce errores y nada parece extra\u00f1o. Solo la columna <strong>descripci\u00f3n<\/strong> separa una consulta correcta de una con errores pero segura de s\u00ed misma.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los metadatos enriquecidos ya existen en la empresa, este proyecto simplemente le ense\u00f1a a la base de datos a entenderlos. \u00bfTienes curiosidad por saber hacia d\u00f3nde se dirige esto? Ponte en contacto con Couchbase para hablar sobre consultas conversacionales en tus datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>The Problem Natural Language to SQL++ (NL2SQL++) is only as good as the schema knowledge behind it. Give a large language model (LLM) a question like &#8220;How many customers with an active previous application defaulted?&#8221; and it has to know which tables exist, what each column means, and how the tables relate. Most systems solve [&hellip;]<\/p>\n","protected":false},"author":85728,"featured_media":5591,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"_acf":"","footnotes":""},"categories":[18],"tags":[],"ppma_author":[1047],"class_list":["post-5585","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-n1ql-query"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.3 (Yoast SEO v28.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>When Column Names Lie: Bringing External Catalogs to NL2SQL++ - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"When Column Names Lie: Bringing External Catalogs to NL2SQL++\" \/>\n<meta property=\"og:description\" content=\"The Problem Natural Language to SQL++ (NL2SQL++) is only as good as the schema knowledge behind it. Give a large language model (LLM) a question like &#8220;How many customers with an active previous application defaulted?&#8221; and it has to know which tables exist, what each column means, and how the tables relate. Most systems solve [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-03T20:47:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-07T16:05:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/When-Column-Names-Lie-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Pranav Maiya, Software Engineer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Pranav Maiya, Software Engineer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/\"},\"author\":{\"name\":\"Pranav Maiya, Software Engineer\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/6a9f3903d607e56b54e9e157d7772ebb\"},\"headline\":\"When Column Names Lie: Bringing External Catalogs to NL2SQL++\",\"datePublished\":\"2026-08-03T20:47:19+00:00\",\"dateModified\":\"2026-08-07T16:05:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/\"},\"wordCount\":1583,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/08\\\/When-Column-Names-Lie-1.png\",\"articleSection\":[\"SQL++ \\\/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/\",\"name\":\"When Column Names Lie: Bringing External Catalogs to NL2SQL++ - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/08\\\/When-Column-Names-Lie-1.png\",\"datePublished\":\"2026-08-03T20:47:19+00:00\",\"dateModified\":\"2026-08-07T16:05:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/08\\\/When-Column-Names-Lie-1.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/08\\\/When-Column-Names-Lie-1.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"When Column Names Lie: Bringing External Catalogs to NL2SQL++\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"width\":\"1024\",\"height\":\"1024\",\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/6a9f3903d607e56b54e9e157d7772ebb\",\"name\":\"Pranav Maiya, Software Engineer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/08\\\/Pranav-Maiya.pngc0cfaac8facc9339f2a396737603102f\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/08\\\/Pranav-Maiya.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/08\\\/Pranav-Maiya.png\",\"caption\":\"Pranav Maiya, Software Engineer\"},\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/es\\\/author\\\/pranavmaiya\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"When Column Names Lie: Bringing External Catalogs to NL2SQL++ - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/","og_locale":"es_MX","og_type":"article","og_title":"When Column Names Lie: Bringing External Catalogs to NL2SQL++","og_description":"The Problem Natural Language to SQL++ (NL2SQL++) is only as good as the schema knowledge behind it. Give a large language model (LLM) a question like &#8220;How many customers with an active previous application defaulted?&#8221; and it has to know which tables exist, what each column means, and how the tables relate. Most systems solve [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/","og_site_name":"The Couchbase Blog","article_published_time":"2026-08-03T20:47:19+00:00","article_modified_time":"2026-08-07T16:05:04+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/When-Column-Names-Lie-1.png","type":"image\/png"}],"author":"Pranav Maiya, Software Engineer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Pranav Maiya, Software Engineer","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/"},"author":{"name":"Pranav Maiya, Software Engineer","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/6a9f3903d607e56b54e9e157d7772ebb"},"headline":"When Column Names Lie: Bringing External Catalogs to NL2SQL++","datePublished":"2026-08-03T20:47:19+00:00","dateModified":"2026-08-07T16:05:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/"},"wordCount":1583,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/When-Column-Names-Lie-1.png","articleSection":["SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/","url":"https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/","name":"When Column Names Lie: Bringing External Catalogs to NL2SQL++ - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/When-Column-Names-Lie-1.png","datePublished":"2026-08-03T20:47:19+00:00","dateModified":"2026-08-07T16:05:04+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/When-Column-Names-Lie-1.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/When-Column-Names-Lie-1.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/when-column-names-lie-bringing-external-catalogs-to-nl2sql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"When Column Names Lie: Bringing External Catalogs to NL2SQL++"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","width":"1024","height":"1024","caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/6a9f3903d607e56b54e9e157d7772ebb","name":"Pranav Maiya, Ingeniero de Software","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Pranav-Maiya.pngc0cfaac8facc9339f2a396737603102f","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Pranav-Maiya.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Pranav-Maiya.png","caption":"Pranav Maiya, Software Engineer"},"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/pranavmaiya\/"}]}},"acf":[],"authors":[{"term_id":1047,"user_id":85728,"is_guest":0,"slug":"pranavmaiya","display_name":"Pranav Maiya, Software Engineer","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Pranav-Maiya.png","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/08\/Pranav-Maiya.png"},"author_category":"1","first_name":"Pranav","last_name":"Maiya","user_url":"","job_title":"Software Engineer","description":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5585","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/85728"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=5585"}],"version-history":[{"count":1,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5585\/revisions"}],"predecessor-version":[{"id":5590,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5585\/revisions\/5590"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/5591"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=5585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=5585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=5585"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=5585"}],"curies":[{"name":"\u00a1Bien jugado!","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}