Como decidir entre os formatos de armazenamento e quais são exemplos de casos de uso para alguns deles?

10

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 .inie .conf)
  • XML
  • Bancos de dados (MySQL, SQLite ...)
  • .zip e similares contendo vários arquivos (com diferentes formatos)
  • Arquivos binários (pense .docetc., 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
Anto
fonte
binário wrt, considere o Google Protocol Buffer. A capacidade de desserialização lenta é incrível, e você sempre tem a possibilidade de extraí-la e salvá-la novamente como texto formatado (em várias linguagens C ++ / Java / Python).
Matthieu M.

Respostas:

6

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.

Richard Harrison
fonte
4

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.

P.Brian.Mackey
fonte
3

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.

Elad
fonte
2

Eu os usaria da seguinte maneira:

  • Texto sem formatação : O aplicativo possui um tamanho pequeno de dados simplesmente estruturados (pares de valores de nome para ex.). Os dados não são modificados simultaneamente por vários usuários.
  • XML : tamanho pequeno de dados estruturados que não são modificados simultaneamente ou com frequência.
  • Banco de dados : dados estruturados grandes ou acesso simultâneo são necessários. A necessidade de consulta e pesquisa é essencial no aplicativo.
  • Dados binários : eu usaria isso apenas para transmitir objetos.
  • de compactação é a compressão que pode ser adicionado como um outro processo para qualquer um dos acima, excepto em bases de dados de servidores.
M.Sameer
fonte
1

Ouvi dizer que o XML combina os piores recursos de texto (difícil / lento para processar) e binário (ilegível).

Ingo
fonte
Não é uma resposta completa
Anto 16/04