Consulta SQL++ / N1QL

Consulta N1QL con Jerarquía Auto-referenciada

Una construcción de datos que aparece a menudo en las aplicaciones empresariales es la estructura jerárquica de datos. La jerarquía captura la relación padre-hijo que a menudo existe entre el mismo objeto. Por ejemplo, la estructura de una empresa refleja la línea jerárquica entre los empleados. La organización empresarial captura la relación entre empresas matrices y filiales. Jerarquías territoriales en Ventas. Libro de cuentas en aplicaciones financieras.

Debido a la naturaleza de auto-referencia de la jerarquía, la consulta de la estructura de manera eficiente junto con sus datos asociados puede ser un reto para RDBMS, en particular desde una perspectiva de rendimiento. En este artículo, hablaré de cómo los SGBDR tradicionales gestionan las consultas jerárquicas. Los retos con los que tiene que lidiar, y cómo este problema puede ser abordado de manera similar con Couchbase N1QL y Couchbase GSI.

Estructura jerárquica en las aplicaciones

La principal razón para reunir la información en una estructura jerárquica es mejorar la comprensión de la información. La estructura jerárquica de la empresa está diseñada no sólo para ayudar a gestionar la organización, sino también para proporcionar una estructura que permita medir y optimizar la eficacia de cada grupo. En una gran organización, el rendimiento de las ventas suele evaluarse, no sólo a nivel individual, sino a nivel de equipo de ventas. En resumen, las empresas organizan la información en una estructura jerárquica para poder comprender mejor el rendimiento comercial. Para lograr ese objetivo, las empresas necesitan un medio eficaz para consultar los datos jerárquicos.

Representación de la jerarquía de la empresa

Aunque el modelo de datos de la base de datos es capaz de capturar eficazmente la estructura jerárquica, la dificultad surge cuando es necesario consultar los datos jerárquicos y la información relacionada.

Considere este requisito: Obtenga el valor total de los pedidos de venta de todos los representantes de ventas que dependen de ThomasH-Vicepresidente de Ventas.

Aunque el modelo de datos es relativamente sencillo. La naturaleza jerárquica de la organización de ventas sugiere una estructura dinámica inherente en la jerarquía de informes. AjayW, que dirige el territorio de la Región1, también gestiona directamente a los miembros del equipo de ventas. Mientras que, en la Región2, Liz L dirige a dos Gerentes, que a su vez dirigen al equipo de ventas. Esto es típico en la mayoría de las jerarquías de datos de aplicación.

Enfoque RDMBS

Para consultar datos jerárquicos, los RDBMS más consolidados como Oracle y SQLSever proporcionan la construcción CONNECT BY / START WITH para permitir que una sola consulta recorra recursivamente la estructura de empleados de la jerarquía.

Aunque la consulta anterior puede parecer sencilla, el rendimiento de la consulta es difícil de mejorar con índices debido a la naturaleza recursiva de la implementación de CONNECT BY. Por este motivo, esta técnica no es popular en el desarrollo de aplicaciones para sistemas con un gran volumen de datos. En su lugar, las aplicaciones empresariales confían en una estructura de objetos previamente aplanada para obtener un rendimiento de consulta más predecible. La técnica de jerarquía aplanada se describe en la sección de Couchbase N1QL más abajo.

Couchbase N1QL

Para obtener el mejor rendimiento de consulta, las aplicaciones N1QL deben utilizar la estructura jerárquica aplanada. El enfoque proporciona un rendimiento más predecible, así como un mejor aprovechamiento de Couchbase GSI. El diagrama de abajo muestra un ejemplo de la transformación flattening de una estructura jerárquica autorreferenciada, como el objeto empleado. También incluyo un fragmento de código python que puedes usar para aplanar la estructura jerárquica. El aplanar_jerarquía toma un objeto JSON jerárquico auto-referenciado y genera dos nuevos objetos en el mismo espacio de claves pero con diferentes valores de tipo

  • En objeto_hier funciona con consultas BI agregadas, en las que los resultados de la consulta se pueden acumular para cada nivel.
  • En objeto_nivel_superior proporciona el mismo resultado que la cláusula CONNECT BY/START WITH, que devuelve todos los objetos hijo de un nodo determinado. Este es el objeto que utilizaremos en nuestra consulta N1QL para proporcionar la solución de consulta.

Índice GS recomendado:

Notas:

  1. La consulta principal recupera todos los pedidos de cliente de la base de datos crm cubo con tipo valor = 'pedido'
  2. La consulta realiza un HASH JOIN con otra consulta (función de N1QL 6.5) que recupera todos los ID de los empleados que dependen del usuario101, es decir, ThomasH-SalesVP
  3. Los índices de cobertura adicionales también pueden mejorar el rendimiento de las consultas
  4. La consulta utiliza N1QL 6.5 ANSI JOIN Soporte para Expresión y Subconsulta Término

Recursos

Nos encantaría que nos dijera qué le han parecido las funciones de la versión 6.5 y en qué beneficiarán a su empresa en el futuro. Por favor, comparta su opinión a través de los comentarios o en el foro.

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Binh Le

Binh Le es director de producto principal del servicio de consultas de Couchbase. Antes de Couchbase, trabajó en Oracle y dirigió el equipo de gestión de productos para Sales Clould Analytics y CRM OnDemand. Binh es licenciado en Informática por la Universidad de Brighton, Reino Unido.

5 Comentarios

  1. La consulta N1QL con INNER JOIN ya no funciona en CB6 tal y como está escrita.

    [
    {
    "código": 3000,
    "msg": "ANSI JOIN debe realizarse en un espacio de claves. - at where \n Error al analizar: error de ejecución: dirección de memoria no válida o desviación de puntero nulo - at where",
    "query_from_user": "SELECT uhl.id FROM test uhl \r\nINNER JOIN (SELECT e.id,sum(a.valor)\r\nFROM test a\r\n WHERE a.type='sales_order' ) e ON a.owner = e.id\r\nwhere uhl.type ='_employee_hier_level'\r\n AND uhl.parent='101'\r\nGROUP BY e.id"
    }
    ]

    También la palabra clave valor necesita ser citado o error de sintaxis. Algo como

    SELECT e.id,suma(a.valor), (SELECT uhl.id FROM test uhl WHERE uhl.type ='_employee_hier_level')
    AND uhl.parent='101′) e
    FROM prueba a
    WHERE a.type='pedido_venta' and a.owner = e.id
    GROUP BY e.id

    funciona pero no estoy seguro del USE HASH...

    1. La consulta utiliza una nueva característica de N1QL 6.5 - Soporte ANSI JOIN para Término de Expresión y Término de Subconsulta. La versión beta de 6.5 está prevista para finales de mayo. Por favor, hágamelo saber si usted está interesado en una versión temprana para probar esto. También estoy buscando una manera de hacer que el conjunto de datos esté disponible.

      Gracias,
      -binh

  2. Sugerir algunos datos JSON de muestra también estaría bien

  3. Bueno, tanto Oracle ATP - como MS SQL Server ofrecen una función de jerarquía y un tipo de datos de jerarquía especial, también. ¿Podría aclarar las diferencias con CouchBase? ¿Añade ANSI SQL y/o CouchBase estas palabras clave de SQL: ¿"CONNECT BY" y "LEVEL"? TIA.

  4. Hola CM27,

    Couchbase query no soporta la palabra clave "CONNECT BY". La capacidad de atravesar relaciones está en nuestro plan. En esa misma nota, CONNECT BY es una característica específica de Oracle, mientras que Recursive CTE es el enfoque ANSI para la consulta de relaciones.

    -binh

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.