Nota: este artículo ha sido escrito por Mike Howard, de Simba Tecnologías.
N1QL DML
El soporte de manipulación de datos N1QL facilita la inserción, actualización y eliminación de datos JSON, sin la sobrecarga de tener que leer primero el documento. Estas sentencias N1QL pueden realizar una operación en todo un bucket con una única petición de red. Las consultas N1QL no están limitadas por el esquema, y por lo tanto pueden ser usadas para manipular datos fuera de las restricciones del esquema. Además, las consultas N1QL no están restringidas a una sola tabla, y son perfectas para manipular datos a través de múltiples tablas simultáneamente. El controlador Simba Couchbase le permite ejecutar estas consultas directamente a través del controlador.
INSERTAR
N1QL INSERT permite la inserción de un nuevo Documento JSON. Si bien este método podría utilizarse para la simple tarea de agregar una fila a una tabla existente, es particularmente útil cuando se agregan datos que no coinciden con un esquema existente. La posibilidad de añadir datos que no corresponden al esquema permite manipular el esquema: Añadir un documento de tipo existente con nuevos atributos, o añadir un documento de tipo nuevo para crear tablas nuevas. Y obtendrá nuevas columnas en el esquema. Sin embargo, tendrá que volver a muestrear la base de datos (mediante SQL) para ver cualquier dato nuevo no perteneciente al esquema.
Usando el cubo gamesim-sample como ejemplo, digamos que queremos añadir una característica "Jefes" a nuestro juego. Usa un N1QL INSERT para crear una tabla Bosses añadiendo un nuevo documento de tipo "boss":
INSERTAR EN gamesim-muestra
(KEY, VALUE) VALUES ("Dragón Azul", {"type": "boss", "hitpoints": 70000})
Volver a muestrear con el controlador para crear una nueva tabla de jefe con esta información. Si decidimos ampliar nuestra tabla de jefes para incluir puntos de experiencia similares a los de la tabla de monstruos, podemos utilizar N1QL INSERT para insertar nuevos documentos en una tabla existente que no coincidan con el esquema actual de la tabla:
INSERTAR EN gamesim-muestra
(KEY, VALUE) VALUES ("Grifo Dorado", {"type": "boss", "hitpoints": 80000, "experienceWhenKilled": 37000})
Como en el primer caso, este cambio de esquema no surtirá efecto hasta que se vuelva a muestrear la tabla. Sin embargo, los valores que coincidan con el esquema existente seguirán estando disponibles:
Tabla Boss después de INSERT antes de remuestrear
PK | puntos de golpe |
Dragón azul | 70000 |
Grifo de Oro | 80000 |
Tabla de jefes tras la remuestreo
PK | puntos de golpe | experienciaWhenKilled |
Dragón azul | 70000 | NULL |
Grifo de Oro | 80000 | 37000 |
ACTUALIZACIÓN
Puedes usar N1QL UPDATE para modificar documentos JSON directamente. Al igual que SQL UPDATE, esta operación puede ser usada para modificar atributos individuales en una tabla, sin embargo el verdadero poder de UPDATE proviene de su alcance en todo el bucket. Usando N1QL UPDATE, puedes modificar cada documento coincidente en el bucket a través de una sola consulta - en una sola petición de red, sin tener que leer todos los datos primero.
He aquí un ejemplo: Actualizar un videojuego para aumentar los puntos de vida de todos los jugadores y monstruos en un multiplicador fijo. Normalmente, esto requeriría dos consultas: una para actualizar los jugadores y otra para los monstruos:
Tabla de jugadores antes de la ACTUALIZACIÓN
PK | puntos de golpe |
Aaron0 | 20210 |
Aaron1 | 23832 |
Aaron2 | 10 |
Aliaksey0 | 10 |
Tabla de monstruos antes de ACTUALIZAR
PK | puntos de golpe |
Bauchan0 | 3754 |
Bauchan1 | 3627 |
Bauchan2 | 4999 |
Bauchan3 | 4699 |
Bauchan4 | 3070 |
Pero con N1QL, podemos emitir una única actualización de todo el bucket para completar esta tarea:
ACTUALIZACIÓN gamesim-muestra
SET hitpoints = hitpoints*2
Esta consulta duplica el valor de cada atributo hitpoints del bucket en una sola operación.
Tabla de jugadores tras la ACTUALIZACIÓN
PK | puntos de golpe |
Aaron0 | 40420 |
Aaron1 | 47664 |
Aaron2 | 20 |
Aliaksey0 | 20 |
Tabla de monstruos tras la actualización
PK | puntos de golpe |
Bauchan0 | 7508 |
Bauchan1 | 7254 |
Bauchan2 | 9998 |
Bauchan3 | 9398 |
Bauchan4 | 6140 |
BORRAR
N1QL delete elimina todos los documentos del bucket que coincidan con una condición especificada. Esto puede ser útil para realizar eliminaciones por lotes. Un ejemplo de operación podría ser la eliminación de una cervecería en el bucket de muestras de cerveza. Para eliminar una cervecería y todas las cervezas asociado con ella, podríamos emitir la siguiente consulta:
DELETE FROM muestra de cerveza
WHERE name = "21st Amendment Brewery Cafe" OR brewery_id = "21st_amendment_brewery_cafe"
Esto elimina todos los datos relacionados con "21st Amendment Brewery Cafe" del bucket en una sola operación. Utilizando SQL esto requeriría tres consultas, una para eliminar la cervecería de la tabla brewery, una segunda para eliminar la dirección de la tabla brewery_address y una tercera para eliminar las cervezas asociadas a la cervecería de la tabla beer.
SQL DML
El Simba Couchbase Driver también le permite manipular tablas utilizando sintaxis SQL. Puede conectar su controlador Couchbase a través de ODBC o JDBC a herramientas de escritura basadas en SQL, como aplicaciones ETL. También le permite realizar consultas más fácilmente a nivel de tabla.
INSERTAR
SQL INSERT añade un documento a un bucket que coincide con el esquema de la tabla a la que se está añadiendo. A diferencia de N1QL, SQL INSERT aplicará activamente el esquema definido en el mapa de esquema. Para realizar operaciones de inserción que deban coincidir con el esquema actual, es preferible utilizar SQL INSERT, ya que evita la modificación accidental del esquema.
Para continuar con el ejemplo de la Tabla de Jefes, vamos a añadir un nuevo jefe a la tabla. Para empezar, emitimos el comando SQL:
INSERT INTO 'gamesim-sample'.boss (PK, hitpoints, experienceWhenKilled) VALUES ("Lobo Gris", 22000, 12000)
Esto añade la fila Wolf a la tabla Boss. Observe que no es necesario especificar el atributo type, ya que está implícito en el nombre de la tabla:
Tabla Boss después de SQL INSERT
PK | Puntos de vida | experienciaWhenKilled |
Dragón azul | 70000 | NULL |
Grifo de Oro | 80000 | 37000 |
Lobo gris | 22000 | 12000 |
ACTUALIZACIÓN
SQL UPDATE permite actualizar una única tabla. Esto es útil si desea restringir el alcance de la actualización a esa única tabla. Para las actualizaciones de tablas específicas, se prefiere SQL UPDATE a N1QL, ya que su ámbito restringido evita la modificación involuntaria de otros documentos.
Por ejemplo, imaginemos que queremos aumentar los puntos de golpe de los monstruos. Podemos hacerlo emitiendo el comando SQL UPDATE:
UPDATE 'gamesim-sample'.monster SET hitpoints=puntos-de-hit*1.5
Esto actualiza sólo los puntos de golpe del monstruo, dejando la tabla del jugador intacta.
Tabla de monstruos tras la actualización
PK | puntos de golpe |
Bauchan0 | 5631 |
Bauchan1 | 5440 |
Bauchan2 | 7498 |
Bauchan3 | 7048 |
Bauchan4 | 4605 |
BORRAR
SQL DELETE elimina una sola fila de una tabla. Similar a SQL UPDATE, esto es útil para limitar la operación a una sola tabla. Similar a insert y update, SQL DELETE es la operación preferida para eliminar documentos de una misma tabla, ya que evita la eliminación accidental de otro documento.
Por ejemplo, podemos eliminar todos los jugadores con menos de 100 puntos de vida. Ejecutamos el comando SQL DELETE:
DELETE FROM 'gamesim-sample'.player WHERE hitpoints < 100
Esto elimina a todos los jugadores que tengan menos de 100 puntos de vida, dejando intactos a los monstruos.
Resumen: manipulación flexible de datos N1QL/SQL a nivel de cubo o de tabla
El controlador Simba Couchbase ofrece a los usuarios la flexibilidad de manipular sus datos a nivel de bucket o de tabla utilizando N1QL o SQL. El uso de N1QL le permite realizar operaciones en todo el bucket, como la manipulación de esquemas, actualizaciones masivas o eliminaciones masivas en una sola operación. El uso de SQL le da acceso a las herramientas ETL tradicionales, así como a la manipulación de datos a nivel de tabla. Puede descargar y probar los controladores simba en http://www.simba.com/drivers/couchbase-odbc-jdbc/.