Paulo Henrique Rodrigues Pinheiro

Um blog sobre programação para programadores!


Introdução ao unqlite - o que é?

Quais são as características do unqlite?

UnqLite

UnQLite is a in-process software library which implements a self-contained, serverless, zero-configuration, transactional NoSQL database engine. UnQLite is a document store database similar to MongoDB, Redis, CouchDB etc. as well a standard Key/Value store similar to BerkeleyDB, LevelDB, etc. http://unqlite.org/

Motivação

Após muitos anos administrando bancos de dados MySQL e eventualmente PostgreSQL, além de ter sido um "usuário" de MSSQL e Oracle, eu comecei a me questionar se eu realmente precisava de um banco de dados.

Sim, eu preciso colocar meus dados em algum lugar seguro e acessá-los de forma simples e eficiente. Agora, eu realmente preciso de um servidor dedicado a isso? Preciso de um processo dedicado a isso? Preciso ficar liberando permissões e lidando com configurações de autenticação?

É muito trabalho inútil. Em um ambiente em que a informação é armazenada e processada de múltiplas origens com diferentes níveis de acesso, com necessidade de replicação e alta disponibilidade, parece ser mais adequado usar isso.

Por mais complicados que fossem os sistemas que eu trabalhei, nunca cheguei a esse tipo de requisito. Aplicações WEB, em geral, podem muito bem existir sem uma máquina ou processo dedicado aos dados.

Muito tardiamente, fazendo um caminho inverso, descobri o SqLite, e ele me serviu bravamente. Rápido, estável, descomplicado. Nas linguagens que uso, seu uso é facilitado. Python, por exemplo, vem com ele por padrão.

O SqLite, ao contrário do que se pensa, aguenta um tranco pesado, no site tem algumas informações interessantes. Em geral, alguma configuração é necessária para um máximo desempenho, basta ler a documentação. RTFM antes de declarar que ele não é adequado para usar em de produção!

Mas ainda é SQL... SQL é um coisa legal, poderosa, mas não gosto. Uso mas não gosto. Salva minha vida mas não gosto. Garante meu sustento mas não gosto!

Uma das bibliotecas que mais me fascinou foi o BerkeleyDB, agora um produto Oracle. Não precisa de um servidor, não é SQL, difícil uma linguagem não implementar acesso a ele, e ainda tem features de alta disponibilidade.

Há muito tempo, li um paper que explicava como toda autenticação do google funcionava usando as features de replicação e alta disponibilidade do BerkekeyDB. Infelizmente esse paper parece ter sido banido da Internet...

E, mais recentemente, descobri o MongoDB, um banco de dados NoSQL. Fantástico ele, com replicação, alta disponibilidade, sem esquemas fixos, qualquer linguagem acessa ele.

Mas, é um banco de dados tradicional no sentido de requerer processos e máquinas.

Descobrindo o unqlite

E não é que recentemente descobri o melhor desses mundos: uma forma de armazenar dados sem necessitar configurar um banco de dados, e sem usar SQL.

Inicialmente, ele provê um mecanismo de armazenamento key/value, ou seja, em um arquivo, ele gerencia os dados baseados em chaves e conteúdo, mas com transações, atomicidade, e tudo mais que temos direito.

Ele é escrito em ANSI C, primeiramente pensado para dispositivos com restrições de recursos, para ser uma alternativa NoSQL ao SqLite.

Tudo que eu queria!

Características interessantes

Além de ganharmos atomicidade e transações, sem a necessidade de um processo dedicado a isso, e de ter um código muito simples e otimizado, que compila em praticamente qualquer coisa, tem licença BSD.

Eu uso e recomendo tudo que o mundo GPL provê, mas sempre, quando procuro alguma biblioteca para usar, prefiro as com licença BSD. Penso que liberdade só é liberdade se não houver imposições. Mas isso é outra discussão. Para minha preferência, a licença adotada pela Symisc (empresa que desenvolve o unqlite) é a melhor.

Outra importante característica, é que existe uma outra biblioteca que implementa uma linguagem, a jx9 para interagir com bases unqlite usando JSON para armazenamento.

Aí a coisa ficou legal: temos uma biblioteca para persistência de dados que não usa SQL, mas que faz algo parecido com o MongoDB, que usa javascript como interface e trabalha com JSON.

Nos próximos posts, passarei a uma abordagem prática, com exemplos de uso.