Temos diferentes maneiras de armazenar dados do programa (salvar arquivos em jogos, bancos de dados de funcionários, configuração de programas etc.):
- Texto simples (pense
.ini
e.conf
) - XML
- Bancos de dados (MySQL, SQLite ...)
.zip
e similares contendo vários arquivos (com diferentes formatos)- Arquivos binários (pense
.doc
etc., por exemplo, criados por uma ferramenta de serialização)
Quais são os diferentes casos de uso dos formatos listados acima e quais são suas vantagens em relação às desvantagens (velocidade, flexibilidade, tamanho do arquivo, facilidade de uso ...)? Como decidir entre eles para diferentes tarefas?
Sobre o formato de zipagem: usado apenas para conter outros arquivos. Poderia ser outro formato de compactação também. Isso permite uma estrutura de vários arquivos, incluindo arquivos de imagem, arquivos de som e arquivos de texto. Como exemplo, digamos que você tenha um formato de armazenamento para mensagens, que pode conter arquivos. Você pode ter os seguintes arquivos em um arquivo compactado:
message.txt (containing the message)
attachments (folder containing attachments)
audio.wav
picture.jpg
Respostas:
Eu uso da seguinte maneira:
Texto simples
Para configuração - geralmente usando YAML ou .ini. Preterido por mim na maioria dos usos, exceto quando um arquivo de texto é o resultado desejado (por exemplo, imprimir em texto, salvar em texto etc.)
XML
Para configuração e transporte de dados; por exemplo, exportação, formato via XSLT etc. Bom como um formato de arquivo portátil (por exemplo, SVG). Excelentes ferramentas e filtros de manipulação.
Bases de dados
Armazenamento de dados principal de dentro do app / webapp. Use-o o tempo todo como armazenamento de escolha. É confiável, robusto e você cria muito (transações, integridade referencial, exclusão / atualização em cascata, índices, velocidade). Melhor usado com uma camada ou ORM (IMO).
Arquivo único (por exemplo, zip)
Adequado para armazenar múltiplos fluxos binários relacionados compactamente, por exemplo, imagens de ROM para um emulador. Melhor para coisas que muitas vezes nem precisam ser atualizadas. É pesado, lento e difícil de manipular;
Binário
Somente quando um banco de dados não está disponível para armazenar dados do aplicativo. Mais fácil com serialização (C ++). Um formato binário altamente ajustado superará todo o resto em velocidade e tamanho.
fonte
Não há bala de prata. Em minha experiência:
O texto sem formatação como meio de armazenamento é um não automático. Os poucos casos que eu consideraria seriam melhor cobertos por um arquivo .config em que eu tenho um esquema e digite segurança. Parece que a necessidade de segurança de tipo e extração de dados quase sempre surge. O texto sem formatação torna esse processo um pesadelo.
XML : Digite segurança, validação de dados, baixo volume e, em alguns casos, eu o uso porque o .NET possui um poderoso suporte interno para serialização XML de objetos.
Bancos de dados : Meu padrão. Digite segurança, velocidade, transações, seja confiável e difícil de culpar por escolher um banco de dados como meio de armazenamento, se algo não ocorrer conforme o planejado.
.zip é um formato de compactação, não sabe como isso se encaixa na persistência ..?
Binário : só uso binário quando preciso criar um fluxo de memória temporário. O binário não agrega valor em termos de capacidade de consulta em comparação com um banco de dados ou XML em que meus dados são organizados com esquema.
A facilidade de uso é relativa e depende do que você deseja realizar especificamente. A velocidade é semelhante fora do que eu disse acima em relação ao volume. Se o tamanho do arquivo for uma preocupação e a normalização adequada for aplicada, eu o compactarei via zip ou outro formato de compactação, mas esse é um processo separado.
fonte
Eu os uso da seguinte maneira:
Texto simples
Se essa categoria incluir formatos um pouco mais elaborados, como YAML ou arquivos de propriedades, é a melhor opção para o que você espera que as pessoas leiam e editem manualmente. Outra grande vantagem é a simplicidade de modificá-lo através de um pequeno script (por exemplo, sed).
Nada supera a simplicidade e facilidade de uso. Quando a equipe de suporte precisar configurar algo em uma máquina remota (por exemplo, resolver o problema de um cliente), ou a TI precisar reconfigurar vários servidores que executam seu software, eles agradecerão por escolher esse formato. Isso também evita que você escreva um software único que faz isso por eles.
XML
Concordo com o @Ingo aqui - ao contrário do texto simples, o XML é mais difícil de processar por meio de scripts e um pesadelo para editar manualmente.
Ainda assim, se você possui dados com alguma estrutura elaborada em que o YAML se torna indecifrável e ainda deseja que seja legível por humanos e editável, o XML provavelmente é a melhor opção.
Banco de Dados Relacional
Uma ótima opção para quando você tem muitos dados (o que tornaria complicado o texto sem formatação e o XML) que você ainda pode permitir que terceiros editem manualmente - via comandos SQL e até GUIs.
Outra vantagem é que seu código que gerencia o conteúdo é muito legível. @ Richard-Harrison deu uma boa lista de outras vantagens em sua excelente resposta.
Banco de Dados NoSQL
Uma vantagem sobre o RDBMS é a escalabilidade por meio da distribuição, o que provavelmente não é muito relevante para a sua pergunta. As vantagens provavelmente mais relevantes são a simplicidade de um armazenamento de valores-chave e a flexibilidade da falta de esquema (isso é uma palavra?). Quando você se encontra quebrando o paradigma relacional: apenas armazena blobs no banco de dados, acessa-os por chave e processa-os através do código, e considere esta opção. Algumas opções (por exemplo, o CouchDB) são muito portáteis, ocupam pouco espaço e também podem ser dimensionadas para oferecer uma boa alternativa não relacional ao MySQL e SQLite.
Binário
A vantagem do binário é que ele é rápido e compacto. Quando a única coisa que precisa ler e modificar seu arquivo é um programa e os dados não se encaixam no paradigma relacional ou na velocidade é realmente importante, essa pode ser uma boa escolha. Provavelmente, o melhor ajuste para arquivos de mídia.
Devo salientar, no entanto, que ainda não encontrei um caso em que o acesso simples aos dados do programa não seja necessário em algum momento por razões que não foram consideradas durante o design inicial. Atualmente, eu pessoalmente busco a opção de banco de dados para qualquer outra coisa que não os arquivos que tenham formatos padrão e precisam ser codificados / decodificados por outro software (por exemplo, áudio, vídeo).
Nota: há um equívoco comum de que o binário é opaco e, portanto, de alguma forma mais seguro. Sem proteção adicional, não é - se alguém quiser invadir seu software, simplesmente armazenar suas configurações ou o que quer que seja em binário não as impedirá.
Arquivo compactado
Não é realmente uma alternativa ao acima, mas sim uma medida extra.
Vantajoso quando você precisa transmitir coisas pela rede ou quando armazena muitos dados e deseja economizar espaço. Observe que o espaço de armazenamento geralmente é abundante atualmente, portanto, considere sua plataforma de destino.
Atualmente, executa muito rapidamente quase tudo (lei de Moore em ação, bebê), portanto, o único motivo para não usá-lo é que ele adiciona complexidade ao seu código. Não é muita complexidade, mas ainda é uma violação do princípio do KISS. Especialmente complicado para arquivos de configuração que precisam ser editados manualmente ou via script - e se você realmente precisar economizar espaço, provavelmente deverá usar a opção de banco de dados.
fonte
Eu os usaria da seguinte maneira:
fonte
Ouvi dizer que o XML combina os piores recursos de texto (difícil / lento para processar) e binário (ilegível).
fonte