meu valor de 2 pence. Um pouco de saudade, mas ... tive um requisito semelhante em um de meus projetos de incubação. Semelhante ao seu, meus principais requisitos eram um banco de dados de documentos (xml no meu caso), com versionamento de documentos. Era para um sistema multiusuário com muitos casos de uso de colaboração. Minha preferência era usar soluções de código aberto disponíveis que atendessem à maioria dos principais requisitos.
Para ir direto ao ponto, não consegui encontrar nenhum produto que fornecesse ambos, de uma forma que fosse escalonável o suficiente (número de usuários, volumes de uso, armazenamento e recursos de computação). Eu estava inclinado para o git por toda a capacidade promissora, e soluções (prováveis) que alguém poderia criar a partir dele. Conforme eu brincava mais com a opção git, mudar de uma perspectiva de usuário único para uma perspectiva de vários (milli) usuários tornou-se um desafio óbvio. Infelizmente, não consegui fazer uma análise de desempenho substancial como você fez. (.. preguiçoso / saia cedo .... para a versão 2, mantra) Poder para você !. De qualquer forma, minha ideia tendenciosa se transformou na próxima alternativa (ainda tendenciosa): uma malha de ferramentas que são as melhores em suas esferas separadas, bancos de dados e controle de versão.
Enquanto ainda está em andamento (... e ligeiramente negligenciado), a versão transformada é simplesmente esta.
- no frontend: (userfacing) use um banco de dados para o armazenamento de primeiro nível (interface com os aplicativos do usuário)
- no back-end, use um sistema de controle de versão (VCS) (como git) para realizar o controle de versão dos objetos de dados no banco de dados
Em essência, isso equivaleria a adicionar um plugin de controle de versão ao banco de dados, com alguma cola de integração, que você pode ter que desenvolver, mas pode ser muito mais fácil.
Como isso (deveria) funcionar é que as trocas de dados da interface multiusuário primária são feitas por meio do banco de dados. O SGBD tratará de todas as questões divertidas e complexas, como multiusuário, simultaneidade e, operações atômicas, etc. No backend, o VCS executaria o controle de versão em um único conjunto de objetos de dados (sem simultaneidade ou problemas com vários usuários). Para cada transação efetiva no banco de dados, o controle de versão é executado apenas nos registros de dados que teriam sido alterados efetivamente.
Quanto à cola de interface, ela terá a forma de uma função de interoperação simples entre o banco de dados e o VCS. Em termos de design, uma abordagem simples seria uma interface orientada a eventos, com atualizações de dados do banco de dados acionando os procedimentos de controle de versão (dica: assumindo Mysql, uso de triggers e sys_exec () blá blá ...). Em termos de complexidade de implementação, vai desde o simples e eficaz (por exemplo, scripts) até o complexo e maravilhoso (alguma interface de conector programada). Tudo depende de quão louco você quer ir com isso e quanto capital de suor você está disposto a gastar. Acho que um script simples deve fazer a mágica. E para acessar o resultado final, as várias versões de dados, uma alternativa simples é preencher um clone do banco de dados (mais um clone da estrutura do banco de dados) com os dados referenciados pela versão tag / id / hash no VCS. novamente, este bit será um simples trabalho de consulta / tradução / mapa de uma interface.
Ainda há alguns desafios e incógnitas a serem enfrentados, mas suponho que o impacto e a relevância da maioria deles dependerão em grande parte dos requisitos do aplicativo e dos casos de uso. Alguns podem acabar não sendo problemas. Alguns dos problemas incluem a correspondência de desempenho entre os 2 módulos principais, o banco de dados e o VCS, para um aplicativo com atividade de atualização de dados de alta frequência, escalonamento de recursos (armazenamento e poder de processamento) ao longo do tempo no lado git como os dados e usuários crescer: estável, exponencial ou eventualmente platô
Do coquetel acima, aqui está o que estou preparando no momento
- usando Git para o VCS (inicialmente considerado o bom e velho CVS devido ao uso de apenas changesets ou deltas entre as 2 versões)
- usando mysql (devido à natureza altamente estruturada de meus dados, xml com esquemas xml estritos)
- brincar com o MongoDB (para tentar um banco de dados NoSQl, que se aproxima muito da estrutura de banco de dados nativa usada no git)
Alguns fatos divertidos - git realmente faz coisas claras para otimizar o armazenamento, como compressão e armazenamento de apenas deltas entre a revisão de objetos - SIM, git armazena apenas changesets ou deltas entre revisões de objetos de dados, onde é aplicável (ele sabe quando e como) . Referência: packfiles, no fundo do interior do Git
- Revisão do armazenamento de objeto do git (sistema de arquivos endereçável por conteúdo), mostra semelhanças impressionantes (da perspectiva do conceito) com bancos de dados noSQL, como mongoDB. Novamente, às custas de suor de capital, pode fornecer possibilidades mais interessantes para integrar o 2 e ajustes de desempenho
Se você chegou até aqui, deixe-me se o acima pode ser aplicável ao seu caso, e supondo que seria, como se enquadraria em alguns dos aspectos em sua última análise de desempenho abrangente