Parece que você tomou uma decisão técnica de armazenamento de dados de curto prazo essencialmente válida para o seu aplicativo - você optou por escrever uma ferramenta de gerenciamento de armazenamento de dados personalizada.
Você está sentado em um continuum, com opções para se mover em qualquer direção.
A longo prazo, você provavelmente (quase, mas não 100% com certeza) se deparará com problemas e poderá ser melhor mudar o uso das soluções de armazenamento de dados existentes. Existem problemas de desempenho específicos, muito comuns, previsíveis, com os quais você será forçado a lidar, e é melhor usar as ferramentas existentes em vez de usar as suas.
Parece que você escreveu um banco de dados (pequeno) personalizado, incorporado e usado diretamente pelo seu aplicativo. Suponho que você esteja confiando em um sistema operacional e sistema de arquivos para gerenciar a gravação e a leitura reais do disco e tratar a combinação como um armazenamento de dados.
Quando fazer o que você fez
Você está sentado em um ponto ideal para armazenamento de dados. Um armazenamento de dados do sistema operacional e do sistema de arquivos é incrivelmente conveniente, acessível e portátil para várias plataformas. A combinação existe há tanto tempo que você certamente terá suporte e executará seu aplicativo em quase todas as configurações de implantação padrão.
Também é uma combinação fácil de escrever código - a API é bastante direta e básica, e são necessárias poucas linhas de código para fazê-lo funcionar.
Geralmente, é ideal fazer o que você fez quando:
- Prototipagem de novas idéias
- Criando aplicativos que dificilmente precisam ser dimensionados, em termos de desempenho
- Restringido por circunstâncias incomuns, como falta de recursos para instalar um banco de dados
Alternativas
Você está em um continuum de opções, e há duas 'direções' que você pode seguir a partir daqui, o que eu penso como 'abaixo' e 'acima':
Baixa
Esta é a opção menos provável de aplicar, mas está aqui por uma questão de integridade:
Você pode, se quiser, ficar inativo , ou seja, ignorar completamente o sistema operacional e o sistema de arquivos e realmente escrever e ler diretamente do disco. Essa escolha geralmente é relevante apenas nos casos em que é necessária extrema eficiência - pense, por exemplo, em um dispositivo MP3 / minúsculo / minúsculo , sem RAM suficiente para um sistema operacional totalmente funcional ou em algo como o Wayback Machine , que requer massa incrivelmente eficiente operações de gravação de dados (a maioria dos armazenamentos de dados troca gravações mais lentas para leituras mais rápidas, pois esse é o caso de uso mais comum para quase todos os aplicativos).
Acima
Existem várias subcategorias aqui - elas não são exatamente exclusivas. Algumas ferramentas abrangem as duas, fornecendo alguma funcionalidade em cada uma, algumas podem mudar completamente de trabalhar em um modo para trabalhar no outro, e algumas podem ser colocadas em camadas umas sobre as outras, fornecendo funcionalidades diferentes para diferentes partes do seu aplicativo.
Armazéns de dados mais poderosos
Você pode precisar armazenar volumes cada vez mais altos de dados, enquanto ainda conta com seu próprio aplicativo para gerenciar a complexidade da manipulação de dados. Está disponível uma grande variedade de armazenamentos de valores-chave, com extensões variadas de suporte para funções relacionadas. As ferramentas NoSQL se enquadram nessa categoria e em outras.
Esse é o caminho óbvio para expandir quando o seguinte descreve seu aplicativo:
- É invulgarmente dependente de leitura pesada
- Você concorda com a troca de desempenho superior por garantias de consistência mais baixa (a curto prazo) (muitas oferecem "consistência eventual").
- Está gerenciando "diretamente" a maior parte da manipulação de dados e a falta de consistência (na prática, você provavelmente acabará usando uma ferramenta de terceiros no início, embora eventualmente a leve para o seu aplicativo ou para uma camada intermediária personalizada escrita) .
- Você está procurando escalar massivamente a quantidade de dados que está armazenando e / ou sua capacidade de pesquisá-los, com requisitos de manipulação de dados "relativamente simples".
Há espaço de manobra aqui - você pode forçar uma melhor consistência de leitura, para leituras mais lentas. Várias ferramentas e opções fornecem APIs de manipulação de dados, indexação e outras opções, que podem ser mais ou menos adequadas para escrever facilmente seu aplicativo específico. Portanto, se os pontos acima descrevem quase completamente seu aplicativo, você pode estar "próximo o suficiente" para trabalhar com uma solução mais poderosa de armazenamento de dados.
Exemplos conhecidos: CouchDB , MongoDB , Redis , soluções de armazenamento em nuvem como o Azure da Microsoft , o Google App Data Store e o ECE da Amazon.
Mecanismos de manipulação de dados mais complexos
A família "SQL" de aplicativos de armazenamento de dados, bem como vários outros, são melhor descritos como ferramentas de manipulação de dados do que os mecanismos de armazenamento puro. Eles fornecem uma ampla gama de funcionalidades adicionais, além do armazenamento de dados e, muitas vezes, além do que está disponível no armazenamento de valores-chave. Você deseja seguir esse caminho quando:
- Você absolutamente precisa ter consistência de leitura, mesmo que isso signifique que você sofrerá um impacto no desempenho.
- Você deseja executar com eficiência manipulação de dados altamente complexa - pense em operações JOIN e UPDATE muito complexas, cubos e fatias de dados , etc.
- Você concorda com a rigidez do desempenho (pense em formatos de armazenamento de dados fixos e forçados, como tabelas, que não podem ser alteradas com facilidade e / ou eficiência).
- Você tem os recursos para lidar com um conjunto de ferramentas e interfaces muitas vezes mais complexo.
Essa é a maneira mais "tradicional" de pensar em um banco de dados ou repositório de dados e existe há muito mais tempo - portanto, há muito disponível aqui e muitas vezes há muita complexidade para lidar. É possível, embora exija alguma experiência e conhecimento e construa soluções simples / evite grande parte da complexidade - você provavelmente acabará usando ferramentas e bibliotecas de terceiros para gerenciar a maior parte disso para você.
Exemplos bem conhecidos são MySQL , SQL Server , Oracle's Database e DB2 .
Terceirize o trabalho
Existem várias ferramentas e bibliotecas modernas de terceiros, que se interpõem entre suas ferramentas de armazenamento de dados e seu aplicativo, para ajudá-lo a gerenciar a complexidade.
Eles tentam inicialmente retirar a maior parte ou todo o trabalho necessário para gerenciar e manipular armazenamentos de dados e, idealmente, permitem que você faça uma transição suave para a complexidade apenas quando e se for necessário. Esta é uma área ativa de empreendedorismo e pesquisa, com alguns resultados recentes que são imediatamente acessíveis e utilizáveis.
Exemplos bem conhecidos são as ferramentas MVC ( Django , Yii ), Ruby on Rails e Datomic . É difícil ser justo aqui, pois existem literalmente dezenas de ferramentas e bibliotecas que atuam como invólucros nas APIs de vários armazenamentos de dados.
PS: se você prefere vídeos ao texto, pode assistir a alguns vídeos relacionados ao banco de dados de Rich Hickey; ele faz um bom trabalho para elucidar a maior parte do pensamento necessário para escolher, projetar e usar um armazenamento de dados.