Quando o uso do banco de dados deve ser preferido em vez de analisar dados de um arquivo de texto?

13

Eu estava criando um programa Python para medir o crescimento do codereview.SE . Minha abordagem foi obter as "Estatísticas do site" mostradas na primeira página e armazená-las no meu disco rígido. Eu pretendo fazer isso uma vez por dia. Até agora, eu fiz o suficiente para obter as estatísticas e anexá-las a um arquivo de texto. O script python pode ser visualizado no github . O formato que estou usando é o seguinte

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

Eu apenas executei o script duas vezes para obter o formato que eu usaria no arquivo. Inicialmente, isso me pareceu bom, porque eu mesmo o armazenaria e o formato seria o mesmo para que fosse analisado facilmente, mas não tenho certeza. Parece que o uso de um banco de dados deve ser melhor aqui, porque a recuperação de dados deve ser mais fácil. Apenas uma observação: nunca usei nenhum banco de dados e não tenho conhecimento de SQL, MySQL ou qualquer outra variante do RDBMS.

Então isso me leva à pergunta. Quando um banco de dados deve ser preferido para armazenar os dados em vez de armazená-los em um arquivo de texto? Existem alguns indicadores que posso procurar ao tomar decisões sobre se preciso de um banco de dados ou de arquivos de texto simples?

PS: Se etiquetas melhores puderem ser adicionadas, faça isso. Eu tinha algumas dúvidas sobre as tags que poderiam ser adicionadas.

Aseem Bansal
fonte
"Toda ferramenta é uma obrigação até você aprender como usá-la."
Jeffo
1
Um banco de dados pode ou não ser apropriado para o seu projeto. Você pode, no entanto, achar que usar um formato mais simples seria útil. Há um módulo CSV padrão no Python que você pode considerar usar. Ter um CSV simplificaria a exportação dos dados para outros programas (por exemplo - em uma planilha para que você possa fazer um gráfico).
Sean McSomething

Respostas:

13

Quando um banco de dados deve ser preferido para armazenar os dados em vez de armazená-los em um arquivo de texto?

A Wikipedia nos diz que um banco de dados é uma coleção organizada de dados . Por essa medida, seu arquivo de texto é um banco de dados. Ele continua dizendo:

Os dados são normalmente organizados para modelar aspectos relevantes da realidade de uma maneira que ofereça suporte aos processos que exigem essas informações. Por exemplo, modelar a disponibilidade de quartos em hotéis de uma maneira que permita encontrar um hotel com vagas.

Essa parte é subjetiva - não nos diz especificamente como os dados devem ser modelados ou que operações precisam ser otimizadas. Seu arquivo de texto consiste em vários registros distintos, um para cada dia, para que você modele um aspecto da realidade de maneira relevante para o seu problema.

Sei que quando você diz "banco de dados" provavelmente está pensando em algum tipo de sistema de gerenciamento de banco de dados relacional, mas pensar no seu arquivo de texto como um banco de dados muda sua pergunta de "quando devo usar um banco de dados?" para "que tipo de banco de dados devo usar?" Ver as coisas sob essa luz facilita a resposta: use um banco de dados melhor quando o que você possui não atender mais aos seus requisitos.

Se o seu script Python e o arquivo de texto simples funcionarem bem o suficiente, não há necessidade de mudar. Com apenas um novo registro por dia e os computadores ficando mais rápidos a cada ano, suspeito que sua solução atual possa ser viável por muito tempo. Os dados de uma década forneceriam apenas 3650 registros que, uma vez analisados, provavelmente exigiriam menos de 75 kilobytes.

Imagine que, em vez de um pequeno registro por dia, você decidiu registrar todas as perguntas feitas no CodeReview, quem fez e quando. Além disso, você também coleta todas as respostas e os metadados relevantes. Você pode armazenar tudo isso em um arquivo de texto, mas um arquivo simples dificulta a localização de informações quando você precisar. Havia muitos dados para ler a coisa toda na memória; portanto, sempre que você quisesse encontrar uma pergunta ou resposta, teria que verificar o arquivo até encontrar o que estava procurando. Quando você quisesse encontrar todas as perguntas feitas por um determinado usuário, teria que verificar o arquivo inteiro. Se você deseja encontrar todas as perguntas que possuem "bugs" como tag, é necessário verificar o arquivo.

Isso seria terrivelmente lento, então você pode decidir acelerar as coisas criando alguns índices que informam onde procurar no arquivo para encontrar um determinado registro. Você pode ter um índice para perguntas, outro para usuários, um terceiro para respostas e assim por diante. Quando você queria encontrar uma pergunta, pesquisava no índice (muito menor), obtinha a posição da pergunta no arquivo de dados principal e saltava rapidamente para o local certo no arquivo. Isso seria uma grande melhoria de desempenho. Na verdade, isso é basicamente o que é um sistema de gerenciamento de banco de dados.

Portanto, use um DBMS quando for o que você precisa. Use-o quando você tiver muitos dados, quando precisar acessar esses dados rapidamente e talvez de maneiras que você não pode prever completamente desde o início. Se você tiver diferentes tipos de dados - diferentes tipos de registros - conectados entre si, use um RDBMS para poder relacionar os vários registros adequadamente.

Caleb
fonte
3
"pensar no seu arquivo de texto como um banco de dados muda" Muito perspicaz. Também a parte sobre eu ter apenas 3650 entradas foi útil. Isso ajudou a obter uma perspectiva real do problema.
Aseem Bansal
1
Resposta altamente subestimada, é a segunda vez que volto a ela.
Hashim
6

Bases de dados tem muitas vantagens, mas tornando o acesso mais fácil não é um deles. Mais rápido, padronizado, interpretável como um comando incorporado, sub-linguagem, mais seguro, sim - mas não mais fácil. Não importa quanto açúcar sintático o seu idioma e a biblioteca padrão proporcionem, você precisa ter um banco de dados em primeiro lugar, abrir uma conexão a ele e encaminhar os dados do seu programa para algo completamente diferente. Desde que não haja problemas com o que você faz e a facilidade de programação seja sua prioridade, nunca mude para um banco de dados apenas porque você acha que é uma "boa prática".

Minha opinião sobre quando fazer a troca é seguir o desenvolvimento histórico. Afinal, as pessoas armazenavam dados em arquivos por um longo tempo antes da criação do banco de dados relacional e, de fato, um monte de modelos inferiores de banco de dados (banco de dados hierárquico, banco de dados da rede ...) foram inventados antes disso. Eles começaram a escrever bases de dados e as usaram quando ficou claro que isso economizaria um grande esforço de processamento, aumentaria a confiabilidade etc. em geral e a longo prazo . Contanto que esse não seja o seu caso, e você não preveja que isso aconteça tão cedo, a comutação seria um excesso de engenharia.

Kilian Foth
fonte
A coesão não é melhor oferecida de acordo com o design geral? por exemplo, no meu caso, estou armazenando 5 valores correspondentes a cada data. No estado atual, não há coesão entre os dados.
Aseem Bansal
Você está certo, garantir que todos os registros tenham um conjunto consistente de campos e valores é outra dessas vantagens. (Estritamente falando, é apenas relacionais bases de dados que garantia que as pessoas utilizadas bases de dados não-relacionais em produção por um longo tempo, e atualmente eles estão ganhando força novamente com o movimento "NoSQL"..)
Kilian Foth
3

É claro que isso será um julgamento, mas os três principais critérios que eu consideraria são: ele precisa ser compatível com ACID , quão complexos são os dados e, finalmente, quantas coisas precisam ser lidas / escritas. Contanto que você esteja simplesmente lendo e escrevendo uma linha por e seu aplicativo seja o único a ler ou escrever, provavelmente você poderá pular o banco de dados. Depois que você começa a ter vários aplicativos de leitura ou gravação ou sua estrutura de dados se torna complexa (principalmente se tiver relações entre linhas separadas), um banco de dados começa a parecer realmente atraente.

jmoreno
fonte
"quantas coisas precisam ler / escrever" - Isso ajudou.
Aseem Bansal
2

Os bancos de dados são usados ​​não apenas para armazenar, mas também para manipular e consultar dados, portanto, você deve tomar uma decisão fundamentada:

Um grande fator é o benefício que você obtém da instalação de um banco de dados na máquina versus a funcionalidade que ela traz

Obviamente, se você precisar consultar e manipular os dados e desejar que o acesso seja rápido - além disso, você pode estar pensando em usar um banco de dados para outras funções, então pode ser uma boa idéia. Os modelos de armazenamento de bancos de dados permitem que os dados sejam pesquisados ​​por valores-chave muito rapidamente, e posso imaginar que a análise de um arquivo pode ser lenta (dependendo de como você o está fazendo)

Se você quiser brincar com o SQL e o que ele pode fazer, o SQLFiddle.com possui alguns modelos RDBMS diferentes com os quais você pode brincar (executar consultas, criar esquemas etc.)

Charleh
fonte
O Python possui uma interface de biblioteca padrão integrada para sqlite3. Portanto, instalar um banco de dados não é um problema. Minha consideração é que, se eu continuar armazenando dados, a menos que eu tenha algum tipo de indexação, pode ficar lento. Um banco de dados pode cuidar disso, eu acho. Eu baixei o sqlite3 separadamente para aprender, descobri que precisava aprender sobre modelos de banco de dados antes de usá-lo, tentei. Eu posso aprender o sqlite3 usando exemplos da Internet, mas atualmente estou tendo problemas para aprender os modelos de banco de dados. Então me veio à mente se valia a pena o trabalho?
Aseem Bansal
2

Como sempre, usar ou não um banco de dados depende do que você precisa fazer. Se você possui uma quantidade enorme de dados e precisa realizar muitas consultas diferentes, provavelmente um banco de dados pode ajudá-lo.

No seu caso, eu manteria o armazenamento em um arquivo de teste até que o desempenho seja aceitável. Normalmente, ler um arquivo de texto (mesmo grande) não leva tanto tempo. Se você precisar de mais, sempre poderá adicionar o banco de dados posteriormente.

Pela minha experiência, se você é completamente novo em bancos de dados, pode achar mais fácil usar algo como couchdb: http://couchdb.apache.org/, que não é sql, e você pode usar diretamente javascript ou python etc. para consultas.

Lorenzo Baracchi
fonte