{"id":15705,"date":"2024-05-09T10:03:54","date_gmt":"2024-05-09T17:03:54","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=15705"},"modified":"2024-05-22T13:47:54","modified_gmt":"2024-05-22T20:47:54","slug":"query-graph-recursive-cte","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/query-graph-recursive-cte\/","title":{"rendered":"Consulta de modelos gr\u00e1ficos con CTE recursivo de Couchbase"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Las expresiones comunes de tabla (CTE) recursivas y CONNECT BY de Oracle son construcciones SQL muy conocidas entre los usuarios de RDBMS, que facilitan la delegaci\u00f3n de la exploraci\u00f3n de estructuras de datos complejas e interdependientes a la capa de base de datos para mejorar la eficacia del procesamiento.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Estas construcciones son cruciales para consultar estructuras de datos interdependientes, un requisito com\u00fan en varios sectores, como las finanzas, la gesti\u00f3n de la cadena de suministro, la gesti\u00f3n de las relaciones con los clientes (CRM), las reservas de viajes y, m\u00e1s recientemente, las redes sociales. Conscientes de su importancia, los principales sistemas de gesti\u00f3n de bases de datos relacionales (RDBMS), como PostgreSQL, MySQL (a partir de la versi\u00f3n 8.0), SQL Server, Oracle y SQLite, ofrecen soporte para CTE recursivas.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Por el contrario, las bases de datos NoSQL, dise\u00f1adas para gestionar una amplia gama de modelos de datos como documentos, datos clave-valor, de columnas anchas y gr\u00e1ficos, dan prioridad a la escalabilidad, la alta disponibilidad, la flexibilidad y el rendimiento en sistemas distribuidos. En estos entornos, el concepto de CTE, recursivo o no, no se aborda directamente. Los usuarios suelen recurrir a soluciones especializadas, como las bases de datos de grafos (Cypher para Neo4J y AQL para ArangoDB, por ejemplo), para gestionar estructuras de datos complejas.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Couchbase se distingue con SQL para JSON, ofreciendo un enfoque \u00fanico a CTEs recursivos que tambi\u00e9n extienden su soporte multi modelo. Este blog profundizar\u00e1 en tres temas principales:<\/span><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">C\u00f3mo se puede aprovechar un \u00fanico DBMS como Couchbase para estructuras de datos complejas para una serie de casos de uso, de la misma manera que RDBMS podr\u00eda, pero sin la necesidad de una base de datos m\u00e1s dedicada.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">El uso del constructo Couchase SQL++ para consultar, transformar y proyectar estas relaciones complejas utilizando un constructo SQL que es familiar a los usuarios de RDBMS.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Mejores pr\u00e1cticas para gestionar el consumo de recursos con CTE recursivo.<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h2><span style=\"font-weight: 400;\">Lista de materiales<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">La lista de materiales es un componente fundamental en la fabricaci\u00f3n y la ingenier\u00eda, ya que detalla las materias primas, las piezas y los componentes necesarios para fabricar un producto. Suele tener una estructura jer\u00e1rquica, en la que las piezas se componen de otras piezas o materiales.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Este ejemplo incluir\u00e1 los componentes y subcomponentes b\u00e1sicos de un ordenador de sobremesa.<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Componente ID<\/b><\/td>\n<td><b>ComponentName<\/b><\/td>\n<td><b>ParentComponentID<\/b><\/td>\n<td><b>Cantidad<\/b><\/td>\n<\/tr>\n<tr>\n<td><span>1<\/span><\/td>\n<td><span>Ordenador de sobremesa<\/span><\/td>\n<td><span>null<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>2<\/span><\/td>\n<td><span>Placa base<\/span><\/td>\n<td><span>1<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>3<\/span><\/td>\n<td><span>CPU<\/span><\/td>\n<td><span>2<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>3<\/span><\/td>\n<td><span>Ventilador de la CPU<\/span><\/td>\n<td><span>3<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>4<\/span><\/td>\n<td><span>GPU<\/span><\/td>\n<td><span>2<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>5<\/span><\/td>\n<td><span>RAM<\/span><\/td>\n<td><span>2<\/span><\/td>\n<td><span>4<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>6<\/span><\/td>\n<td><span>Unidad M.2<\/span><\/td>\n<td><span>2<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>7<\/span><\/td>\n<td><span>SSD<\/span><\/td>\n<td><span>2<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>8<\/span><\/td>\n<td><span>Fuente de alimentaci\u00f3n<\/span><\/td>\n<td><span>1<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>9<\/span><\/td>\n<td><span>Caso<\/span><\/td>\n<td><span>1<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>10<\/span><\/td>\n<td><span>Ventiladores de refrigeraci\u00f3n de la carcasa<\/span><\/td>\n<td><span>1<\/span><\/td>\n<td><span>4<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">Supongamos que queremos enumerar todas las piezas y subpiezas necesarias para construir un ordenador de sobremesa, junto con las cantidades necesarias de cada una.<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">WITH RECURSIVE ComponentHierarchy AS (\r\n\u00a0 \u00a0 SELECT\r\n\u00a0 \u00a0 \u00a0 \u00a0 ComponentID,\r\n\u00a0 \u00a0 \u00a0 \u00a0 ComponentName,\r\n\u00a0 \u00a0 \u00a0 \u00a0 ParentComponentID,\r\n\u00a0 \u00a0 \u00a0 \u00a0 Quantity,\r\n\u00a0 \u00a0 \u00a0 \u00a0 1 AS Lvl -- Depth level in the hierarchy\r\n\u00a0 \u00a0 FROM\r\n\u00a0 \u00a0 \u00a0 \u00a0 components\r\n\u00a0 \u00a0 WHERE\r\n\u00a0 \u00a0 \u00a0 \u00a0 ParentComponentID IS NULL -- Starting point: the Desktop Computer itself\r\n\r\n\u00a0 \u00a0 UNION ALL\r\n\r\n\u00a0 \u00a0 SELECT\r\n\u00a0 \u00a0 \u00a0 \u00a0 c.ComponentID,\r\n\u00a0 \u00a0 \u00a0 \u00a0 c.ComponentName,\r\n\u00a0 \u00a0 \u00a0 \u00a0 c.ParentComponentID,\r\n\u00a0 \u00a0 \u00a0 \u00a0 ch.Quantity * c.Quantity AS Quantity, -- Calculate total quantity required at each level\r\n\u00a0 \u00a0 \u00a0 \u00a0 ch.lvl + 1 -- Increment level for each recursion step\r\n\u00a0 \u00a0 FROM\r\n\u00a0 \u00a0 \u00a0 \u00a0 components c\r\n\u00a0 \u00a0 JOIN\r\n\u00a0 \u00a0 \u00a0 \u00a0 ComponentHierarchy ch ON c.ParentComponentID = ch.ComponentID\r\n)\r\nSELECT * FROM ComponentHierarchy;<\/pre>\n<p><span style=\"font-weight: 400;\">Esta consulta inicializa la recursi\u00f3n con el elemento de nivel superior (el ordenador de sobremesa) y une recursivamente la tabla de componentes consigo misma para recorrer la jerarqu\u00eda en sentido descendente, ajustando las cantidades seg\u00fan sea necesario para cada componente y subcomponente.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">El resultado listar\u00e1 todas las piezas necesarias para el Ordenador de Sobremesa, incluyendo la cantidad de cada una y su nivel jer\u00e1rquico, lo que puede ser \u00fatil para entender la estructura de ensamblaje o para fines de inventario y pedidos.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Explicaci\u00f3n<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">El CTE comienza con la Bicicleta (donde ParentPartID es NULL) y luego busca recursivamente todos los componentes y subcomponentes.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">La cantidad se ajusta en cada nivel para reflejar el n\u00famero total necesario para una bicicleta.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">La columna Nivel, aunque no es estrictamente necesaria para todos los an\u00e1lisis de listas de materiales, ayuda a comprender la profundidad de cada pieza dentro de la jerarqu\u00eda.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Este enfoque permite un desglose detallado de todos los materiales y componentes necesarios para fabricar un producto, esencial para la gesti\u00f3n de inventarios, la estimaci\u00f3n de costes y la planificaci\u00f3n de la producci\u00f3n en las operaciones de fabricaci\u00f3n.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Redes sociales<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Una aplicaci\u00f3n com\u00fan en un caso de uso de redes sociales es encontrar los grados de conexi\u00f3n entre dos usuarios -esencialmente, c\u00f3mo est\u00e1n conectados los usuarios a trav\u00e9s de una cadena de amigos comunes. Digamos que necesitamos determinar el camino m\u00e1s corto (en t\u00e9rminos de grados de conexi\u00f3n) entre dos usuarios en una red social. Esto puede ayudar en funciones como sugerir amistades o comprender la din\u00e1mica de la red.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Consideremos que tenemos los siguientes usuarios y c\u00f3mo son amigos entre s\u00ed, por ejemplo, Alice es amiga de Bob, y tambi\u00e9n de Charlie. Pero Alice no es amiga de Dana.<\/span><\/p>\n<p><br style=\"font-weight: 400;\" \/><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-15706\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/05\/image1.png\" alt=\"\" width=\"624\" height=\"129\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/image1.png 624w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/image1-300x62.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><br style=\"font-weight: 400;\" \/><br style=\"font-weight: 400;\" \/><\/p>\n<p><span style=\"font-weight: 400;\">En esta red ampliada, los usuarios se conectan de diversas maneras, creando m\u00faltiples v\u00edas a trav\u00e9s de las cuales pueden conectarse.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Vamos a encontrar los grados de conexi\u00f3n entre Alice[1] y Frank[6], incluyendo los nombres de los usuarios a lo largo del camino.<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">WITH RECURSIVE ConnectionPath AS (\r\n\u00a0 \u00a0 SELECT\r\n\u00a0 \u00a0 \u00a0 \u00a0 u1.UserID,\r\n\u00a0 \u00a0 \u00a0 \u00a0 u1.UserName AS StartUser,\r\n\u00a0 \u00a0 \u00a0 \u00a0 u2.UserID AS FriendID,\r\n\u00a0 \u00a0 \u00a0 \u00a0 u2.UserName AS FriendName,\r\n\u00a0 \u00a0 \u00a0 \u00a0 1 AS Degree\r\n\u00a0 \u00a0 FROM\r\n\u00a0 \u00a0 \u00a0 \u00a0 user_connections uc\r\n\u00a0 \u00a0 JOIN\r\n\u00a0 \u00a0 \u00a0 \u00a0 users u1 ON uc.UserID = u1.UserID\r\n\u00a0 \u00a0 JOIN\r\n\u00a0 \u00a0 \u00a0 \u00a0 users u2 ON uc.FriendID = u2.UserID\r\n\u00a0 \u00a0 WHERE\r\n\u00a0 \u00a0 \u00a0 \u00a0 u1.UserID = 1 -- Starting user (Alice)\r\n\u00a0 \u00a0 \r\n\u00a0 \u00a0 UNION ALL\r\n\u00a0 \u00a0 \r\n\u00a0 \u00a0 SELECT\r\n\u00a0 \u00a0 \u00a0 \u00a0 cp.UserID,\r\n\u00a0 \u00a0 \u00a0 \u00a0 cp.StartUser,\r\n\u00a0 \u00a0 \u00a0 \u00a0 u.UserID AS FriendID,\r\n\u00a0 \u00a0 \u00a0 \u00a0 u.UserName AS FriendName,\r\n\u00a0 \u00a0 \u00a0 \u00a0 cp.Degree + 1\r\n\u00a0 \u00a0 FROM\r\n\u00a0 \u00a0 \u00a0 \u00a0 ConnectionPath cp\r\n\u00a0 \u00a0 JOIN\r\n\u00a0 \u00a0 \u00a0 \u00a0 user_connections uc ON cp.FriendID = uc.UserID\r\n\u00a0 \u00a0 JOIN\r\n\u00a0 \u00a0 \u00a0 \u00a0 users u ON uc.FriendID = u.UserID\r\n\u00a0 \u00a0 WHERE\r\n\u00a0 \u00a0 \u00a0 \u00a0 uc.FriendID NOT IN (cp.UserID) -- Avoid loops by not revisiting the start user\r\n)\r\nSELECT * FROM ConnectionPath\r\nWHERE FriendID = 6 -- Target user (Frank)\r\nORDER BY Degree ASC;<\/pre>\n<h3><span style=\"font-weight: 400;\">Explicaci\u00f3n<\/span><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Caso base: El CTE comienza identificando las conexiones directas de Alice (UserID 1), incluyendo los nombres de usuario para facilitar la lectura.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Paso recursivo: A continuaci\u00f3n, busca recursivamente los amigos de esas conexiones, ampliando la b\u00fasqueda y rastreando el grado de conexi\u00f3n. Los JOIN garantizan que se incluyan los nombres de usuario tanto del usuario inicial como de sus amigos en cada paso.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Terminaci\u00f3n y filtrado: La recursi\u00f3n contin\u00faa hasta que encuentra conexiones con Frank (UserID 6). La consulta filtra los caminos que llevan a Frank y ordena los resultados por el grado de conexi\u00f3n para identificar los caminos m\u00e1s cortos.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Esta consulta demuestra c\u00f3mo trazar y enumerar rutas a trav\u00e9s de una red social, incluyendo nombres de usuario para mayor claridad. Proporciona una base para an\u00e1lisis m\u00e1s complejos, como la identificaci\u00f3n de todas las conexiones mutuas o la exploraci\u00f3n de estructuras de red.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Caso pr\u00e1ctico de navegaci\u00f3n por redes de grafos<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Para este caso de uso, utilizar\u00e9 una versi\u00f3n resumida de los datos de rutas de America Airlines. N\u00f3tese que esto no es de la muestra de viajes de Couchbase. En este ejemplo usamos Couchbase SQL++ Recursive CTE query para encontrar todos los vuelos de LAX a MAD con &lt; 2 paradas de este conjunto de datos de muestra. <\/span><i><span style=\"font-weight: 400;\">Note that this sample data is not based on the `travel-sample`, but\u00a0 a simplified version of the AA routes for 2008.\u00a0<\/span><\/i><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>c\u00f3digo_aeropuerto_fuente<\/b><\/td>\n<td><b>c\u00f3digo_aeropuerto_destino<\/b><\/td>\n<td><b>aerol\u00ednea<\/b><\/td>\n<\/tr>\n<tr>\n<td><span>LAX<\/span><\/td>\n<td><span>MAD<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>LAX<\/span><\/td>\n<td><span>LHR<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>LHR<\/span><\/td>\n<td><span>MAD<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>LAX<\/span><\/td>\n<td><span>OPO<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>OPO<\/span><\/td>\n<td><span>MAD<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>MAD<\/span><\/td>\n<td><span>OPO<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table>\n<tbody>\n<tr>\n<td><b>Consulta SQL<\/b><\/td>\n<td><b>Resultados<\/b><\/td>\n<\/tr>\n<tr>\n<td><i><span>\/* Lista de todas las rutas de LAX a MAD con &lt; 2 paradas *\/<\/span><\/i><span><br \/>\n<\/span><span>CON RouteCTE RECURSIVO COMO (<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>SELECCIONE<\/b><span> [r.source_airport_code,\u00a0\u00a0\u00a0<\/span><\/p>\n<p><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0r.destination_airport_code] <\/span><b>AS<\/b><span> ruta,<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 r.c\u00f3digo_aeropuerto_destino <\/span><b>AS<\/b><span> \u00faltimaParada,<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span>1<\/span> <b>AS<\/b><span> profundidad<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>DESDE<\/b><span> rutas r<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>DONDE<\/b><span> r.source_airport_code = <\/span><span>LAX<\/span><span><br \/>\n<\/span><b>UNI\u00d3N<\/b> <b>TODOS<\/b><span><br \/>\n<\/span><span>\u00a0 <\/span><b>SELECCIONE<\/b> <span>ARRAY_APPEND<\/span><span>(r.ruta,f.c\u00f3digo_aeropuerto_destino) <\/span><b>como<\/b><span> ruta,<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 f.c\u00f3digo_aeropuerto_destino <\/span><b>AS<\/b><span> \u00faltimaParada,<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 r.profundidad + <\/span><span>1<\/span> <b>AS<\/b><span> profundidad<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>DESDE<\/b><span> RutaCTE r<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>\u00daNASE A<\/b><span> rutas f <\/span><b>EN<\/b><span> r.ultimaParada = f.codigo_aereo_fuente<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>DONDE<\/b><span> f.c\u00f3digo_aeropuerto_destino != <\/span><span>LAX<\/span> <b>Y<\/b><span> r.profundidad &lt; <\/span><span>3<\/span><span><br \/>\n<\/span><span>)<\/span><\/p>\n<p><b>OPCIONES<\/b><span> {\"niveles\":3}<\/span><span><br \/>\n<\/span><b>SELECCIONE<\/b><span> r.*<\/span><span><br \/>\n<\/span><b>DESDE<\/b><span> RouteCTE <\/span><b>AS<\/b><span> r<\/span><span><br \/>\n<\/span><b>DONDE<\/b><span> r.\u00faltimaParada = <\/span><span>MAD<\/span><span><br \/>\n<\/span><span>AND r.depth &lt; 3;<\/span><\/td>\n<td><span>[ <\/span><span><br \/>\n<\/span><span>\u00a0 {<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \"ruta\": [<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 <\/span> <span>\"LAX\",<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 <\/span> <span>\"MAD\"<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ]<\/span><span><br \/>\n<\/span><span>\u00a0 },<\/span><span><br \/>\n<\/span><span>\u00a0 {<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \"ruta\": [<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 <\/span> <span> \"LAX\",<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 <\/span> <span> \"LHR\",<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 <\/span> <span> \"MAD\"<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ]<\/span><span><br \/>\n<\/span><span>\u00a0 },<\/span><span><br \/>\n<\/span><span>\u00a0 {<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \"ruta\": [<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 <\/span> <span>\"LAX\",<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 <\/span> <span>\"OPO\",<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 <\/span> <span>\"MAD\"<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ]<\/span><span><br \/>\n<\/span><span>\u00a0 }<\/span><span><br \/>\n<\/span><span>]<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><span style=\"font-weight: 400;\">Explicaci\u00f3n<\/span><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">La rutaCTE comienza con todos los vuelos que salen de LAX.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">La parte recursiva de routeCTE busca vuelos que conecten desde la \u00faltima parada de la ruta actual con otros aeropuertos, evitando las rutas que vuelven a LAX.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">La matriz de rutas acumula la secuencia de c\u00f3digos de aeropuerto para mostrar la ruta tomada.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">La consulta muestra todas las rutas que terminan en MAD, detallando las rutas encontradas.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2><span style=\"font-weight: 400;\">Buenas pr\u00e1cticas CTE recursivo<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Al utilizar expresiones de tabla comunes (CTE) recursivas en SQL++, los desarrolladores deben ser conscientes de las implicaciones de la naturaleza recursiva y del coste para el procesamiento de consultas. He aqu\u00ed las mejores pr\u00e1cticas:<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Establecer l\u00edmites para la profundidad de recursi\u00f3n<\/b><span style=\"font-weight: 400;\"> - Establezca siempre un l\u00edmite en la profundidad de la recursi\u00f3n para evitar bucles infinitos y un consumo excesivo de recursos. Utilice un contador o una condici\u00f3n dentro de la CTE recursiva para controlar la profundidad a la que puede llegar la recursi\u00f3n, incluya las opciones l\u00edmites.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Supervisar el rendimiento <\/b><span style=\"font-weight: 400;\">- Las CTE recursivas pueden consumir muchos recursos. Controla de cerca el rendimiento, especialmente en el caso de consultas largas o complejas, y optim\u00edzalas si es necesario. Esto puede implicar la indexaci\u00f3n o la descomposici\u00f3n de CTE demasiado complejas.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Evite complejidades innecesarias<\/b><span style=\"font-weight: 400;\"> - Mantenga la l\u00f3gica dentro de la parte recursiva del CTE tan simple como sea posible. Las condiciones o c\u00e1lculos demasiado complejos pueden reducir considerablemente el rendimiento. Compruebe que la condici\u00f3n JOIN es correcta.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Garantizar una estructura de datos correcta<\/b><span style=\"font-weight: 400;\"> - Compruebe que sus datos est\u00e1n estructurados correctamente para la recursi\u00f3n. Los datos incorrectos o mal formados pueden dar lugar a resultados err\u00f3neos o consultas ineficaces.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Pruebas exhaustivas<\/b><span style=\"font-weight: 400;\"> - Pruebe a fondo los CTE recursivos con varios conjuntos de datos, incluidos los casos extremos. Esto ayuda a detectar problemas de bucles infinitos, resultados incorrectos o cuellos de botella en el rendimiento.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Establecer la cuota de memoria<\/b><span style=\"font-weight: 400;\"> - Establezca la cuota de memoria a nivel de petici\u00f3n o de nodo para evitar un uso excesivo de memoria en la consulta recursiva.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Limitaciones<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Los CTEs recursivos son una caracter\u00edstica poderosa en Couchbase SQL++, que se encuentran com\u00fanmente en otros RDBMS. Permiten la ejecuci\u00f3n de consultas complejas, como atravesar datos jer\u00e1rquicos y de grafos o realizar c\u00e1lculos iterativos que son dif\u00edciles de expresar con SQL est\u00e1ndar. Sin embargo, existen limitaciones y consideraciones a tener en cuenta cuando se utilizan CTE recursivas. Estas limitaciones suelen estar relacionadas con el rendimiento, las restricciones sint\u00e1cticas y la complejidad de las consultas. A continuaci\u00f3n se detallan algunas de ellas:<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Agregados:<\/b><span style=\"font-weight: 400;\"> Los CTE recursivos no suelen permitir funciones de agregaci\u00f3n (MIN(), MAX(), SUM(), AVG(), etc.) o DISTINCT dentro de la parte recursiva del CTE. Estas operaciones no tienen sentido en el contexto de la adici\u00f3n recursiva de filas porque implican un conjunto de resultados final despu\u00e9s de que se haya resuelto toda la recursividad.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Funciones de ventana<\/b><span style=\"font-weight: 400;\">: Al igual que las funciones de agregado, las funciones de ventana (ROW_NUMBER(), RANK(), etc.) no suelen utilizarse dentro de la parte recursiva de la CTE. Est\u00e1n pensadas para su uso en un conjunto de filas devueltas por la consulta, lo que las hace adecuadas para el t\u00e9rmino no recursivo o en una consulta que seleccione desde la CTE recursiva.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>LIMITAR \/ PEDIR POR<\/b><span style=\"font-weight: 400;\">: Estas cl\u00e1usulas no est\u00e1n permitidas dentro del miembro recursivo del CTE. El razonamiento es que pertenecen a la ordenaci\u00f3n del conjunto de resultados final y no tiene sentido en el contexto de la construcci\u00f3n del conjunto recursivo, donde los resultados intermedios se construyen acumulativamente a trav\u00e9s de cada iteraci\u00f3n.<\/span><\/p>\n<h2>Pr\u00f3ximos pasos<\/h2>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>M\u00e1s informaci\u00f3n <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/n1ql\/\">Couchbase SQL<\/a><\/li>\n<li>M\u00e1s ejemplos de CTE en el blog: <a href=\"https:\/\/www.couchbase.com\/blog\/es\/recursive-query-processing-in-sql-n1ql\/\">Procesamiento recursivo de consultas en SQL<\/a> (N1QL)<\/li>\n<li>Empieza con un <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/capella\/\">prueba gratuita de Couchbase Capella<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Recursive Common Table Expressions (CTEs) and Oracle&#8217;s CONNECT BY are well-known SQL constructs among RDBMS users, facilitating the delegation of complex, interdependent data structure exploration to the database layer for enhanced processing efficiency. These constructs are crucial for querying interdependent [&hellip;]<\/p>","protected":false},"author":26326,"featured_media":15707,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,2225,1816,1812],"tags":[9945,1726],"ppma_author":[8919],"class_list":["post-15705","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-cloud","category-couchbase-server","category-n1ql-query","tag-couchbase-7-6","tag-graph-database"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Query Graph Models With Couchbase Recursive CTE - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Couchbase sets itself apart with SQL for JSON, offering a unique approach to Recursive CTEs that also extend its multi model support.\" \/>\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\/query-graph-recursive-cte\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Query Graph Models With Couchbase Recursive CTE\" \/>\n<meta property=\"og:description\" content=\"Couchbase sets itself apart with SQL for JSON, offering a unique approach to Recursive CTEs that also extend its multi model support.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/query-graph-recursive-cte\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-05-09T17:03:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-22T20:47:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/05\/graph-network-query-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1707\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Binh Le\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Binh Le\" \/>\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\/query-graph-recursive-cte\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/\"},\"author\":{\"name\":\"Binh Le\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63\"},\"headline\":\"Query Graph Models With Couchbase Recursive CTE\",\"datePublished\":\"2024-05-09T17:03:54+00:00\",\"dateModified\":\"2024-05-22T20:47:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/\"},\"wordCount\":1549,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg\",\"keywords\":[\"Couchbase 7.6\",\"graph database\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Capella\",\"Couchbase Server\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/\",\"name\":\"Query Graph Models With Couchbase Recursive CTE - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg\",\"datePublished\":\"2024-05-09T17:03:54+00:00\",\"dateModified\":\"2024-05-22T20:47:54+00:00\",\"description\":\"Couchbase sets itself apart with SQL for JSON, offering a unique approach to Recursive CTEs that also extend its multi model support.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg\",\"width\":2560,\"height\":1707},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Query Graph Models With Couchbase Recursive CTE\"}]},{\"@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\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63\",\"name\":\"Binh Le\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5b68c37e30928a9d7b2c8470b1a303b7\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g\",\"caption\":\"Binh Le\"},\"description\":\"Binh Le is a Principal Product Manager for Couchbase Query service. Prior to Couchbase, he worked at Oracle and led the product management team for Sales Cloud Analytics and CRM OnDemand. Binh holds a Bachelor's Degree in Computer Science from the University of Brighton, UK.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/binh-le-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Query Graph Models With Couchbase Recursive CTE - The Couchbase Blog","description":"Couchbase se diferencia con SQL para JSON, ofreciendo un enfoque \u00fanico para CTEs recursivos que tambi\u00e9n ampl\u00edan su soporte multi modelo.","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\/query-graph-recursive-cte\/","og_locale":"es_MX","og_type":"article","og_title":"Query Graph Models With Couchbase Recursive CTE","og_description":"Couchbase sets itself apart with SQL for JSON, offering a unique approach to Recursive CTEs that also extend its multi model support.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/query-graph-recursive-cte\/","og_site_name":"The Couchbase Blog","article_published_time":"2024-05-09T17:03:54+00:00","article_modified_time":"2024-05-22T20:47:54+00:00","og_image":[{"width":2560,"height":1707,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/05\/graph-network-query-scaled.jpg","type":"image\/jpeg"}],"author":"Binh Le","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Binh Le","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/"},"author":{"name":"Binh Le","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63"},"headline":"Query Graph Models With Couchbase Recursive CTE","datePublished":"2024-05-09T17:03:54+00:00","dateModified":"2024-05-22T20:47:54+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/"},"wordCount":1549,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg","keywords":["Couchbase 7.6","graph database"],"articleSection":["Best Practices and Tutorials","Couchbase Capella","Couchbase Server","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/","url":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/","name":"Query Graph Models With Couchbase Recursive CTE - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg","datePublished":"2024-05-09T17:03:54+00:00","dateModified":"2024-05-22T20:47:54+00:00","description":"Couchbase se diferencia con SQL para JSON, ofreciendo un enfoque \u00fanico para CTEs recursivos que tambi\u00e9n ampl\u00edan su soporte multi modelo.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg","width":2560,"height":1707},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Query Graph Models With Couchbase Recursive CTE"}]},{"@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\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63","name":"Binh Le","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5b68c37e30928a9d7b2c8470b1a303b7","url":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","caption":"Binh Le"},"description":"Binh Le is a Principal Product Manager for Couchbase Query service. Prior to Couchbase, he worked at Oracle and led the product management team for Sales Cloud Analytics and CRM OnDemand. Binh holds a Bachelor's Degree in Computer Science from the University of Brighton, UK.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/binh-le-2\/"}]}},"authors":[{"term_id":8919,"user_id":26326,"is_guest":0,"slug":"binh-le-2","display_name":"Binh Le","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","author_category":"","last_name":"Le","first_name":"Binh","job_title":"","user_url":"","description":"Binh Le es director de producto principal del servicio de consultas de Couchbase. Antes de Couchbase, trabaj\u00f3 en Oracle y dirigi\u00f3 el equipo de gesti\u00f3n de productos para Sales Clould Analytics y CRM OnDemand. Binh es licenciado en Inform\u00e1tica por la Universidad de Brighton, Reino Unido."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/15705","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\/26326"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=15705"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/15705\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/15707"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=15705"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=15705"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=15705"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=15705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}