- O arquivo de banco de dados SQLite é um formato baseado em arquivo único adequado para armazenar ou trocar o estado de uma aplicação
- É mais estruturado do que formatos customizados, conjuntos de arquivos (pile-of-files) e formatos baseados em ZIP, e pode ser claramente definido com um esquema SQL
- Com transações, índices e uma linguagem de consulta de alto nível, garante acessibilidade e confiabilidade no acesso aos dados, além de oferecer suporte a atualizações incrementais e acesso por múltiplos processos
- Compatibilidade multiplataforma, expansibilidade, desempenho e interfaces para várias linguagens melhoram a eficiência de desenvolvimento e a manutenção
- Com uma estrutura de dados clara e um design centrado em esquema, garante melhor qualidade da aplicação e preservação de dados no longo prazo
Conceito de formato de arquivo de aplicação
- Um formato de arquivo de aplicação é uma estrutura de arquivo para salvar o estado de um programa em disco ou trocar informações entre programas
- Exemplos: DOC, DWG, PDF, XLS, GIT, EPUB, ODT, PPT, ODP etc.
- Um formato de arquivo (file format) armazena um único objeto (ex.: JPEG, GIF, XHTML), enquanto um formato de aplicação (application format) armazena vários objetos junto com suas relações
- A maioria dos formatos de aplicação se enquadra em três tipos
- Formato customizado: estruturas binárias exclusivas de um app específico, como DOC, DWG e PDF, inacessíveis por ferramentas externas
- Conjunto de arquivos (pile-of-files): estrutura composta por vários arquivos, como o Git; alguns são fáceis de ler, mas a portabilidade e a consistência são difíceis de gerenciar
- Formato baseado em ZIP (wrapped pile-of-files): conjunto de arquivos compactado em ZIP, como EPUB, ODT e ODP; é um arquivo único, mas qualquer modificação exige regravar tudo
SQLite como um novo formato de arquivo de aplicação
- Um banco de dados SQLite pode substituir uma estrutura de conjunto de arquivos mesmo com um esquema simples de chave/valor (
CREATE TABLE files(filename TEXT PRIMARY KEY, content BLOB);)
- Quando comprimido, a diferença de tamanho fica dentro de ±1% em relação a um arquivo ZIP
- É possível modificar arquivos individualmente, sem precisar regravar tudo
- O SQLite pode incluir múltiplas tabelas, campos, tipos de dados, restrições e índices, permitindo representar relações de dados complexas com eficiência
- Mantém o poder de expressão de um formato customizado, mas com especificação e volume de código muito mais simples, além de ser acessível sem ferramentas dedicadas
Principais vantagens do formato SQLite
-
1. Simplificação do desenvolvimento
- Basta incluir a biblioteca SQLite ou um único arquivo-fonte (
sqlite3.c) para ter recursos completos de entrada e saída de arquivos
- Reduz milhares de linhas de código e o custo de manutenção
- Dezenas de bilhões de arquivos SQLite já estão em uso no mundo, com estabilidade amplamente testada
-
2. Estrutura de documento em arquivo único
- Todos os dados ficam em um único arquivo, facilitando mover, copiar e anexar
- O Application ID no cabeçalho do arquivo permite identificar o tipo de documento
-
3. Linguagem de consulta de alto nível
- O SQL simplifica a lógica de acesso aos dados, e o desenvolvedor só precisa definir “o que” quer consultar
- Em comparação com arquivos baseados em chave/valor, o suporte a transações, índices e esquema reduz a chance de erros
-
4. Conteúdo acessível
- Arquivos SQLite usam um formato público claramente documentado e podem ser acessados diretamente por ferramentas de linha de comando
- A Biblioteca do Congresso dos EUA o recomenda como formato para preservação digital de longo prazo
- A compatibilidade retroativa mantida desde 2004 garante acessibilidade no longo prazo
-
5. Compatibilidade multiplataforma
- Compatibilidade total entre 32/64 bits, diferenças de endianness e sistemas Windows/Unix
- Suporte à conversão automática de texto entre UTF-8 e UTF-16LE/BE
-
6. Transações atômicas
- Mesmo em caso de falha do sistema ou queda de energia, garante gravações completas sem corrupção de dados
- É possível agrupar alterações para rollback e validação; o Fossil DVCS usa esse recurso
-
7. Atualizações incrementais e contínuas
- Apenas as partes alteradas são gravadas em disco, o que melhora a velocidade e reduz o desgaste de SSDs
- Possibilita salvamento automático e manutenção da pilha de desfazer/refazer entre sessões
-
8. Expansibilidade fácil
- É possível expandir funcionalidades apenas adicionando novas tabelas ou colunas, mantendo a compatibilidade com consultas existentes
- Mudanças estruturais são muito mais fáceis do que em formatos customizados
-
9. Desempenho
- Pode oferecer leitura/gravação mais rápida do que um conjunto de arquivos, especialmente no tratamento de BLOBs com menos de 100 KB
- O desempenho pode ser melhorado apenas com a adição de índices ou a execução de
ANALYZE
- Em formatos customizados, resolver o mesmo problema exige modificar o código
-
10. Acesso simultâneo por múltiplos processos
- O SQLite coordena automaticamente o acesso concorrente
- Vários processos podem ler ao mesmo tempo, enquanto a escrita é tratada em sequência
- A prevenção de corrupção do formato é garantida automaticamente
-
11. Suporte a várias linguagens de programação
- Oferece interfaces para a maioria das linguagens, como C, C++, C#, Java, Python, Ruby e JavaScript
- Diferentes linguagens e equipes podem colaborar usando um esquema comum
-
12. Melhor estrutura de aplicação
- O próprio esquema SQLite funciona como documentação completa do formato de arquivo
- Um formato customizado pode exigir uma especificação de centenas de páginas, enquanto um esquema SQL é conciso e claro
- As citações de Fred Brooks, Rob Pike e Linus Torvalds reforçam a importância de um design centrado na estrutura de dados
Conclusão
- O SQLite não é perfeito para todos os casos, mas, na maioria das aplicações, é uma opção superior a formatos customizados, conjuntos de arquivos e formatos ZIP
- Como um formato de arquivo de alto nível que reúne confiabilidade, expansibilidade, desempenho, acessibilidade e compatibilidade,
vale a pena considerá-lo como candidato a formato padrão de arquivo no projeto de aplicações da próxima geração
1 comentários
Comentários do Hacker News
Na época, estavam pesquisando mapas offline para iPad, e era muito incômodo transferir pela USB ou pela rede inúmeros pequenos tiles PNG (256px)
Então passaram a armazenar os tiles agrupados em SQLite, o que facilitou o transporte e também simplificou o gerenciamento de checksums
Os tiles eram indexados por X, Y e Z (nível de zoom), então eram fáceis de lidar em um banco de dados relacional, e no iPad dava até para associar ícones de app usando a extensão do arquivo e os metadados
Criar um formato de arquivo do zero parecia assustador, mas como já tinham familiaridade com banco de dados, conseguiram criar uma ferramenta de CLI para lidar com isso facilmente em várias linguagens
.zip,.tar, sqlite e sistema de arquivos, e sqlite teve a melhor taxa de compressão e o menor overheadInúmeras ferramentas conseguem ler dados em SQLite, e trabalhar com os dados só com a CLI também é muito prático
Existe há mais de 20 anos e é um dos softwares mais testados do mundo
Por ser simples, poderoso e altamente confiável, acho que usar SQLite como formato de arquivo é a melhor escolha para preservação de dados no longo prazo
No projeto Internet-Places-Database, usei uma UI em HTML, e graças aos componentes do Bootstrap qualquer pessoa conseguia acessar sem instalação separada
Todos os dados são lidos e retornados a partir de um único arquivo SQLite
O banco é grande e a navegação fica lenta, mas estou pensando em uma forma de navegação eficiente que limite o escopo da busca
Eu montava a estrutura básica do blog e entregava como arquivo para a família, e eles só precisavam escrever e publicar os posts
O conteúdo relacionado está organizado neste post de blog
Se for uma estrutura em árvore, também dá para armazenar JSON como blob, mas nesse caso as vantagens diminuem
Ainda assim, se houver imagens ou dados binários junto, SQLite é muito mais vantajoso — mais fácil de lidar do que ZIP
Como SQLite também suporta consultas recursivas, até dados autorreferentes podem ser representados de forma limpa
Colocar um blob JSON em um campo TEXT é simples, mas aí se perdem as vantagens do SQL, como migração e indexação
A maior parte dos dados parece hierárquica por fora, mas quando você os corta em várias seções, eles viram uma estrutura relacional
Só é uma pena que linguagens de programação não representem tão bem tipos relacionais
SQLite também oferece suporte a consultas sobre objetos semelhantes a JSON
Mas senti que a CLI é minimalista demais, então talvez eu devesse ter usado uma ferramenta melhor
É possível até fazer referências recursivas
Com DuckDB, reuni os arquivos de saída de um modelo hierárquico em um único arquivo consultável por SQL, e isso simplificou o pipeline de armazenamento e análise
Quando a preservação de dados de longo prazo é importante, SQLite parece especialmente ideal
Como as configurações já ficam armazenadas em tabelas Postgres, basta mover algumas delas para um arquivo SQLite para distribuir de forma simples
Por ser um formato binário, também reduz o risco de alterações acidentais
E, no sentido inverso, quando precisamos exportar dados de produção para testes, também dá para codificar facilmente em um arquivo SQLite
Sempre me perguntei como as pessoas conseguem vender tão bem uma ideia ou produto