Observação: esta é uma postagem de convidado de Mike Howard, da Simba Technologies.
N1QL DML
O suporte à manipulação de dados N1QL facilita a inserção, atualização e exclusão de dados JSON, sem a sobrecarga de ter que ler o documento primeiro. Essas instruções N1QL podem executar uma operação em um bucket inteiro com uma única solicitação de rede. As consultas N1QL não são vinculadas ao esquema e, portanto, podem ser usadas para manipular dados fora das restrições do esquema. Além disso, as consultas N1QL não são restritas a uma única tabela e são perfeitas para manipular dados em várias tabelas simultaneamente. O driver Simba Couchbase permite que você execute essas consultas diretamente por meio do driver.
INSERIR
O N1QL INSERT permite a inserção de um novo documento JSON. Embora esse método possa ser usado para a simples tarefa de adicionar uma linha a uma tabela existente, ele é particularmente útil ao adicionar dados que não correspondem a um esquema existente. A capacidade de adicionar dados não relacionados ao esquema permite que você manipule o esquema: Adicione um documento de tipo existente com novos atributos ou adicione um documento de novo tipo para criar novas tabelas. E você obterá novas colunas no esquema. No entanto, você terá de fazer uma nova amostragem do banco de dados (usando SQL) para visualizar qualquer novo dado não relacionado ao esquema.
Usando o bucket gamesim-sample como exemplo, digamos que queremos adicionar um recurso "Bosses" ao nosso jogo. Use um INSERT N1QL para criar uma tabela Bosses, adicionando um novo documento do tipo "boss":
INSERT INTO gamesim-sample
(KEY, VALUE) VALUES ("Blue Dragon", {"type": "boss", "hitpoints": 70000})
Refaça a amostragem com o driver para criar uma nova tabela de chefes com essas informações. Se optarmos por estender nossa tabela de chefes para incluir pontos de experiência semelhantes aos da tabela de monstros, poderemos usar o N1QL INSERT para inserir novos documentos em uma tabela existente que não corresponda ao esquema atual da tabela:
INSERT INTO gamesim-sample
(KEY, VALUE) VALUES ("Golden Griffin", {"type": "boss", "hitpoints": 80000, "experienceWhenKilled": 37000})
Como no primeiro caso acima, essa alteração de esquema não entrará em vigor até que a tabela seja reamostrada. Entretanto, quaisquer valores que correspondam ao esquema existente ainda estarão disponíveis:
Tabela de chefes após INSERT antes da reamostragem
PK | pontos de vida |
Dragão azul | 70000 |
Grifo dourado | 80000 |
Tabela de chefes após a reamostragem
PK | pontos de vida | experienceWhenKilled (experiência quando morto) |
Dragão azul | 70000 | NULL |
Grifo dourado | 80000 | 37000 |
ATUALIZAÇÃO
Você pode usar o N1QL UPDATE para modificar diretamente os documentos JSON. Assim como o SQL UPDATE, essa operação pode ser usada para modificar atributos individuais em uma tabela; no entanto, o verdadeiro poder do UPDATE vem de seu escopo em todo o bucket. Usando o N1QL UPDATE, você pode modificar todos os documentos correspondentes no bucket por meio de uma única consulta, em uma única solicitação de rede, sem precisar ler todos os dados primeiro.
Aqui está um exemplo de cenário: Atualizar um videogame para aumentar os pontos de vida de todos os jogadores e monstros em um multiplicador fixo. Normalmente, isso exigiria duas consultas: uma para atualizar os jogadores e outra para os monstros:
Tabela de jogadores antes do UPDATE
PK | pontos de vida |
Aaron0 | 20210 |
Aaron1 | 23832 |
Aaron2 | 10 |
Aliaksey0 | 10 |
Tabela de monstros antes do UPDATE
PK | pontos de vida |
Bauchan0 | 3754 |
Bauchan1 | 3627 |
Bauchan2 | 4999 |
Bauchan3 | 4699 |
Bauchan4 | 3070 |
Porém, com o N1QL, podemos emitir uma única atualização de todo o bucket para concluir essa tarefa:
ATUALIZAÇÃO gamesim-sample
SET hitpoints = hitpoints*2
Essa consulta duplica o valor de cada atributo de pontos de acesso no bucket em uma única operação.
Tabela de jogadores após o UPDATE
PK | pontos de vida |
Aaron0 | 40420 |
Aaron1 | 47664 |
Aaron2 | 20 |
Aliaksey0 | 20 |
Tabela de monstros após a atualização
PK | pontos de vida |
Bauchan0 | 7508 |
Bauchan1 | 7254 |
Bauchan2 | 9998 |
Bauchan3 | 9398 |
Bauchan4 | 6140 |
DELETE
O N1QL delete remove todos os documentos do bucket que correspondem a uma condição especificada. Isso pode ser útil para realizar exclusões em lote. Um exemplo de operação poderia ser a remoção de uma cervejaria no bucket de amostras de cerveja. Para remover uma cervejaria e todas as cervejas associado com ele, poderíamos emitir a seguinte consulta:
DELETE FROM amostra de cerveja
WHERE name = "21st Amendment Brewery Cafe" OR brewery_id = "21st_amendment_brewery_cafe"
Isso remove todos os dados relacionados ao "21st Amendment Brewery Cafe" no bucket em uma única operação. Usando SQL, isso exigiria três consultas: uma para remover a cervejaria da tabela brewery, uma segunda para remover o endereço da tabela brewery_address e uma terceira para remover as cervejas associadas à cervejaria da tabela beer.
SQL DML
O Simba Couchbase Driver também permite que você manipule tabelas usando a sintaxe SQL. Você pode conectar o Couchbase Driver via ODBC ou JDBC a ferramentas de gravação baseadas em SQL, como aplicativos ETL. Ele também permite que você emita mais facilmente consultas com escopo no nível da tabela.
INSERIR
O SQL INSERT adiciona um documento a um intervalo que corresponde ao esquema da tabela à qual ele está sendo adicionado. Ao contrário do N1QL, o SQL INSERT aplicará ativamente o esquema definido no mapa do esquema. Para executar operações de inserção que se destinam a corresponder ao esquema atual, o SQL INSERT é preferível, pois evita a modificação acidental do esquema.
Para continuar o exemplo da tabela de chefes, vamos adicionar um novo chefe à tabela. Para começar, emitimos o comando SQL:
INSERT INTO 'gamesim-sample'.boss (PK, hitpoints, experienceWhenKilled) VALUES ("Grey Wolf", 22000, 12000)
Isso adiciona a linha Wolf à tabela Boss. Observe como o atributo type não precisa ser especificado, pois está implícito no nome da tabela:
Tabela principal após o SQL INSERT
PK | Pontos de vida | experienceWhenKilled (experiência quando morto) |
Dragão azul | 70000 | NULL |
Grifo dourado | 80000 | 37000 |
Lobo cinza | 22000 | 12000 |
ATUALIZAÇÃO
O SQL UPDATE permite que você atualize uma única tabela. Isso é útil se você quiser restringir o escopo da atualização a essa única tabela. Para atualizações de tabelas específicas, o SQL UPDATE é preferível ao N1QL, pois seu escopo restrito evita a modificação não intencional de outros documentos.
Por exemplo, imagine se quiséssemos aumentar os pontos de vida dos monstros. Podemos fazer isso emitindo o comando SQL UPDATE:
UPDATE 'gamesim-sample'.monster SET hitpoints=hitpoints*1.5
Isso atualiza apenas os pontos de vida dos monstros, deixando a tabela do jogador intocada.
Tabela de monstros após a atualização
PK | pontos de vida |
Bauchan0 | 5631 |
Bauchan1 | 5440 |
Bauchan2 | 7498 |
Bauchan3 | 7048 |
Bauchan4 | 4605 |
DELETE
O SQL DELETE exclui uma única linha de uma tabela. Semelhante ao SQL UPDATE, isso é útil para limitar a operação a uma única tabela. Semelhante ao insert e atualização, o SQL DELETE é a operação preferida para remover documentos de uma única tabela, pois evita a remoção acidental de outro documento.
Por exemplo, podemos excluir todos os jogadores com menos de 100 pontos de vida. Emitimos o comando SQL DELETE:
DELETE FROM 'gamesim-sample'.player WHERE hitpoints < 100
Isso remove todos os jogadores que têm menos de 100 pontos de vida, mas deixa os monstros intactos.
Resumo: manipulação de dados N1QL/SQL flexível em nível de bucket ou de tabela
O driver Simba Couchbase oferece aos usuários a flexibilidade de manipular seus dados no nível do bucket ou da tabela usando N1QL ou SQL. O uso do N1QL permite executar operações em todo o bucket, como manipulação de esquema, atualizações em massa ou exclusões em massa em uma única operação. O uso do SQL lhe dá acesso às ferramentas tradicionais de ETL, bem como à manipulação de dados em nível de tabela. Você pode fazer o download e experimentar os drivers da simba em http://www.simba.com/drivers/couchbase-odbc-jdbc/.