Índices en Couchbase
Los índices en Couchbase son un medio flexible de realizar procesamiento back-end. Al utilizar índices es posible crear agregaciones de tipo árbol de decisión y funcionalidad de selectividad, como las que se encuentran en un sistema de control de inventario. Usando un modelo de datos bien definido y flexible en conjunción con el subsistema de indexación de Couchbase, es posible construir aplicaciones que ofrecen un alto grado de selectividad. Couchbase ofrece la posibilidad de pasar parámetros para una experiencia de consulta dinámica. Una rápida revisión de los parámetros disponibles es la siguiente:
- Clave=""
- Teclas=[]
- startkey/endkey=""
- startkey_docID/endkey_docID=""
- stale=[false,update_after,true]
- grupo/grupo_por
- include_docs=[true]
Construir la selectividad
En el siguiente ejemplo, se utilizará un sistema de control de inventario para demostrar el poder de selectividad de los índices en Couchbase. El ejemplo es para una tienda de ropa que necesita poder realizar consultas con selectividad para:
- por categoría de artículo
- por proveedor de artículos
- descuento por artículo
El formato JSON para los elementos almacenados en el bucket de inventario se simplifica para este ejemplo y utiliza un pequeño conjunto de datos de prueba de Siete documentos. Un documento de muestra es el siguiente:
"artículo": "KS-00114629 Gafas Gris Oscuro",
"vendor": "kate spade",
"categoría": "gafas"
}
Con este cubo podemos construir un índice llamado "catálogo" de la siguiente manera:
if(doc.item){
if(doc.vendor){
emit(doc.vendor, doc.item);
}
if(doc.category){
emit(doc.category, doc.item);
}
if(doc.descuento){
emit(doc.descuento,doc.articulo);
}
}
}
Este índice realiza algunas funciones interesantes que permiten la selectividad en la consulta. El flujo de trabajo de este índice es el siguiente:
- if(doc.item){ // Comprueba si un documento tiene un campo llamado "item"
- if(doc.vendor){ //Comprueba si un documento tiene un campo llamado vendor, y si lo tiene emite el nombre del vendor como clave, y el campo item como valor
- if(doc.category){ //Comprueba si un documento tiene un campo llamado categoría, y si lo tiene emite el nombre de la categoría como clave, y el campo artículo como valor
- if(doc.descuento){ //Comprueba si un documento tiene un campo llamado descuento, y si lo tiene emite el importe del descuento como clave, y el campo artículo como valor
Este índice puede emitir potencialmente tres filas dentro de cada documento, suponiendo que un documento tenga un proveedor, una categoría y un descuento.
Una vez desplegado, si este índice se llama desde cualquier punto final en el clúster (para este ejemplo se utiliza un nodo de clúster con ip de 192.168.60.101) con:
Se devuelven 16 filas:
{"id": "0000000007″, "key": "10″, "value": "CH-44308670 Bolso Kremlin Amarillo Dos Tonos"},
{"id": "0000000006″, "key": "15″, "value": "IH-00884501 Bolso bandolera triple anilla"},
{"id": "0000000007″, "key": "Chrome", "value": "CH-44308670 Bolso Kremlin Amarillo Dos Tonos"},
{"id": "0000000001″, "key": "gafas", "value": "KS-00114629 Gafas Gris Oscuro"},
{"id": "0000000003″, "key": "gafas", "value": "RL-00657038 Gafas de sol Rodeo azules"},
{"id": "0000000002″, "key": "bolso", "value": "KS-00113108 Bolso Bandolera Azul"},
{"id": "0000000004″, "key": "bolso", "value": "RL-00332567 Bolso Mensajero Amarillo"},
{"id": "0000000006″, "key": "bolso", "value": "IH-00884501 Bolso bandolera triple anilla"},
{"id": "0000000007″, "key": "bolso", "value": "CH-44308670 Bolso Kremlin Amarillo Dos Tonos"},
{"id": "0000000005″, "key": "corazón de hierro", "value": "IH-00130628 Slim Cut Denim"},
{"id": "0000000006″, "key": "corazón de hierro", "value": "IH-00884501 Bolso bandolera triple anilla"},
{"id": "0000000001″, "key": "kate spade", "value": "KS-00114629 Gafas Gris Oscuro"},
{"id": "0000000002″, "key": "kate spade", "value": "KS-00113108 Bolso Bandolera Azul"},
{"id": "0000000005″, "key": "pantalones", "value": "IH-00130628 Slim Cut Denim"},
{"id": "0000000003″, "key": "ralph lauren", "value": "RL-00657038 Gafas de sol Rodeo Azul"},
{"id": "0000000004″, "key": "ralph lauren", "value": "RL-00332567 Bolso Mensajero Amarillo"}
]
}
Selectividad en la consulta
Con la flexibilidad definida en el modelo de datos y desplegada en el índice, éste puede utilizarse para realizar consultas en la base de datos con un alto grado de selectividad. Se puede utilizar una consulta de rango para seleccionar todos los artículos de un proveedor específico. Por ejemplo, para ver todos los artículos del cubo de Kate Spade, se podría introducir una clave inicial y final de "kate spade" de la siguiente manera:
Aunque el índice contenga 16 filas, sólo se devolverán dos a la aplicación cliente:
{"id": "0000000001″, "key": "kate spade", "value": "KS-00114629 Gafas Gris Oscuro"},
{"id": "0000000002″, "key": "kate spade", "value": "KS-00113108 Bolso Bandolera Azul"}
]
}
En este punto también existe la opción de devolver el documento completo con esta consulta, no sólo los elementos emitidos en el índice. Si esta misma consulta se ejecuta de nuevo, con el parámetro "include_docs" ajustado a "true" lo siguiente:
Se devuelven los mismos dos id, esta vez con el documento completo para cada fila del índice que coincida con el rango:
{"id": "0000000001″, "key": "kate spade", "value": "KS-00114629 Gafas Gris Oscuro", "doc":{"meta":{"id": "0000000001″, "rev":”6-00002ec467e06f2a0000000000000000″,”expiration”:0,”flags”:0},”json”:{“item”:”KS-00114629 Dark Grey Glasses”,”vendor”:”kate spade”,”category”:”glasses”}}},
{"id": "0000000002″, "key": "kate spade", "value": "KS-00113108 Bolso Bandolera Azul", "doc":{"meta":{"id": "0000000002″, "rev":"6-00002ec9a2088ad70000000000000000″, "expiration":0, "flags":0}, "json":{"item": "KS-00113108 Bolso Bandolera Azul", "vendor": "kate spade", "category": "bolso"}}}.
]
}
La potencia de este modelo de datos puede explicarse mejor ejecutando una consulta para ver los artículos que actualmente tienen un descuento asociado. Se puede hacer una consulta con una clave final de "a" debido al orden de clasificación unicode que utiliza Couchbase y se devolverán todos los valores de clave numérica:
Se devuelven las dos filas del índice que se han emitido debido a la presencia de un descuento en el documento para el artículo
{"id": "0000000007″, "key": "10″, "value": "CH-44308670 Bolso Kremlin Amarillo Dos Tonos"},
{"id": "0000000006″, "key": "15″, "value": "IH-00884501 Bolso bandolera triple anilla"}
]
}