Parece que mais sistemas de controle de origem ainda usam arquivos como meio de armazenar os dados da versão. O Vault e o TFS usam o Sql Server como armazenamento de dados, o que eu acho que seria melhor para a consistência dos dados e a velocidade.
Então, por que o SVN, acredito que o GIT, o CVS, etc ainda usa o sistema de arquivos como essencialmente um banco de dados? MSSQL, Oracle, Postgre, etc)?
Edição: Eu acho que outra maneira de fazer minha pergunta é "por que os desenvolvedores de VCS lançam seu próprio sistema estruturado de armazenamento de dados em vez de usar um existente?"
version-control
Andy
fonte
fonte
Respostas:
TL; DR: Poucos sistemas de controle de versão usam um banco de dados porque não é necessário.
Como pergunta para resposta a uma pergunta, por que não? Quais benefícios os sistemas de banco de dados "reais" oferecem sobre um sistema de arquivos nesse contexto?
Considere que o controle de revisão geralmente monitora alguns metadados e muitas diferenças de texto. O texto não é armazenado em bancos de dados com mais eficiência e a indexabilidade do conteúdo não será um fator.
Vamos supor que o Git (por uma questão de argumento) tenha usado um BDB ou SQLite DB como back-end para armazenar dados. O que seria mais confiável nisso? Qualquer coisa que possa corromper arquivos simples também pode corromper o banco de dados (já que também é um arquivo simples com uma codificação mais complexa).
Do paradigma do programador de não otimizar, a menos que seja necessário, se o sistema de controle de revisão é rápido o suficiente e funciona de maneira confiável, por que alterar todo o design para usar um sistema mais complexo?
fonte
TL;DR
são a versão resumida das respostas, não uma declaração de que a pergunta é muito longa e que ele não a leu antes de responder.Você parece estar fazendo muitas suposições, possivelmente com base em sua experiência com SVN e CVS.
Git e Mercurial são basicamente como SVN e CVS
Comparar git e CVS é como comparar um iPad e um Atari. O CVS foi criado quando dinossauros vagavam pela Terra . O Subversion é basicamente uma versão aprimorada do CVS. Assumir que sistemas modernos de controle de versão como git e Mercurial funcionem como eles faz muito pouco sentido.
Um banco de dados relacional é mais eficiente que um banco de dados de propósito único
Por quê? Os bancos de dados relacionais são realmente complicados e podem não ser tão eficientes quanto os de uso único. Algumas diferenças em cima da minha cabeça:
Bancos de dados relacionais são mais seguros
Novamente, por que? Você parece supor que, como os dados são armazenados em arquivos, sistemas de controle de versão como git e Mercurial não possuem confirmações atômicas , mas possuem . Os bancos de dados relacionais também armazenam seus bancos de dados como arquivos. É notável aqui que o CVS não realiza confirmações atômicas, mas isso é provável porque é da idade das trevas, não porque eles não usam bancos de dados relacionais.
Há também a questão de proteger os dados contra corrupção, uma vez que estejam no banco de dados, e novamente a resposta é a mesma. Se o sistema de arquivos estiver corrompido, não importa qual banco de dados você está usando. Se o sistema de arquivos não estiver corrompido, seu mecanismo de banco de dados poderá estar quebrado. Não vejo por que um banco de dados de controle de versão seria mais propenso a isso do que um banco de dados relacional.
Eu diria que os sistemas distribuídos de controle de versão (como git e Mercurial) são melhores para proteger seu banco de dados do que o controle centralizado de versão, pois você pode restaurar o repositório inteiro de qualquer clone. Portanto, se o servidor central combinar espontaneamente, juntamente com todos os seus backups, você poderá restaurá-lo executando
git init
no novo servidor e na máquinagit push
de qualquer desenvolvedor .Reinventar a roda é ruim
Só porque você pode usar um banco de dados relacional para qualquer problema de armazenamento não significa que você deveria . Por que você usa arquivos de configuração em vez de um banco de dados relacional? Por que armazenar imagens no sistema de arquivos quando você pode armazenar os dados em um banco de dados relacional? Por que manter seu código no sistema de arquivos quando você pode armazenar tudo em um banco de dados relacional?
"Se tudo que você tem é um martelo, tudo parece um prego."
Há também o fato de que os projetos de código aberto podem se reinventar sempre que for conveniente, já que você não possui os mesmos tipos de restrições de recursos que os projetos comerciais. Se você tem um voluntário especialista em escrever bancos de dados, por que não usá-los?
Quanto ao motivo pelo qual confiaríamos aos escritores dos sistemas de controle de revisão para saber o que estão fazendo. Não posso falar por outros VCs, mas estou bastante confiante de que Linus Torvalds entende sistemas de arquivos .
Por que alguns sistemas comerciais de controle de versão usam um banco de dados relacional?
Provavelmente, alguma combinação do seguinte:
fonte
svn
onde diferentes diretórios em seu diretório de trabalho podem estar emsvn
revisões diferentes e a verdadeira atomicidade ampla do repositório que você obtém comgit
ouhg
.Na verdade, é
svn
usado para usar o BDB para repositórios. Eventualmente, isso foi eliminado porque estava propenso a quebrar.Outro VCS que atualmente usa um banco de dados (SQLite) é
fossil
. Ele também integra um rastreador de erros.Meu palpite sobre o verdadeiro motivo é que os VCS funcionam com muitos arquivos. Os sistemas de arquivos são apenas outro tipo de banco de dados (hierárquico, focado na eficiência do armazenamento CLOB / BLOB). Bancos de dados normais não lidam bem com isso porque não há razão para + sistemas de arquivos já existirem.
fonte
Um sistema de arquivos é um banco de dados. Não é um banco de dados relacional, é claro, mas a maioria é um armazenamento de chave / valor muito eficiente. E se seus padrões de acesso foram bem projetados para um armazenamento de valores-chave (por exemplo, o formato de repositório git), o uso de um banco de dados provavelmente não oferece vantagens significativas em relação ao uso do sistema de arquivos. (De fato, é apenas mais uma camada de abstração para atrapalhar.)
Muitos dos recursos do banco de dados são apenas bagagem extra. Pesquisa de texto completo? A pesquisa de texto completo faz sentido para o código-fonte? Ou você precisa tokenizá-lo de maneira diferente? Isso também requer que você armazene arquivos completos a cada revisão, o que é incomum. Muitos sistemas de controle de versão armazenam deltas entre revisões do mesmo arquivo para economizar espaço, por exemplo, Subversion e Git (pelo menos ao usar arquivos de pacote).
Os requisitos de plataforma cruzada tornam o uso de um banco de dados mais desafiador.
A maioria das ferramentas de controle de versão é criada para executar em várias plataformas. Para ferramentas centralizadas de controle de versão, isso afeta apenas o componente do servidor, mas ainda é difícil confiar em um único servidor de banco de dados, pois os usuários do Unix não podem instalar o Microsoft SQL Server e os usuários do Windows podem não querer instalar o PostgreSQL ou MySQL. O sistema de arquivos é o denominador menos comum. No entanto, existem várias ferramentas nas quais o servidor deve ser instalado em uma máquina Windows e, portanto, requer o SQL Server, por exemplo, SourceGear Vault e Microsoft Team Foundation Server .
Os sistemas distribuídos de controle de versão tornam isso ainda mais desafiador, pois cada usuário recebe uma cópia do repositório. Isso significa que todo usuário precisa de um banco de dados para colocar o repositório. Isso implica que o software:
A maioria dos sistemas de controle de versão distribuídos, portanto, apenas usa o sistema de arquivos. Uma exceção notável é o Veracity do SourceGear , que pode armazenar em um banco de dados SQLite (útil para repositórios locais) ou em um banco de dados relacional como o SQL Server (possivelmente útil para um servidor). A oferta hospedada na nuvem pode usar um back-end de armazenamento não relacional como o Amazon SimpleDB , mas não sei se isso é verdade.
fonte
Até onde eu já vi em muitas ofertas, parece que os arquivos são "bons o suficiente" para o trabalho, algo razoável, levando em consideração que no final do dia a saída do VCSes também é arquivos.
Existem muitas empresas que oferecem um back-end RDBMS com uma interface svn / git / etc, portanto, o que você está pedindo basicamente já existe.
fonte
Eu diria que é porque a estrutura de dados primária de um sistema de controle de versão é um DAG, que mapeia muito mal os bancos de dados. Muitos dados também são endereçáveis, o que também mapeia muito mal os bancos de dados.
A integridade dos dados não é a única preocupação de um VCS, eles também se preocupam com a integridade do histórico de versões , nas quais os bancos de dados não são muito bons. Em outras palavras, ao recuperar uma versão, você precisa não apenas garantir que a versão não tenha falhas atuais, mas também que nada em toda a sua história tenha sido sub-repticiamente alterado.
VCS também são um produto de consumo, além de um produto corporativo. As pessoas as usam em pequenos projetos de hobby individuais. Se você adicionar o incômodo de instalar e configurar um servidor de banco de dados, irá alienar grande parte dessa parte do mercado. Acho que você não vê muitas instalações do Vault e TFS em casa. É a mesma razão pela qual planilhas e processadores de texto não usam bancos de dados.
Além disso, esse é mais um motivo para o DVCS, mas o não uso de um banco de dados o torna extremamente portátil. Posso copiar minha árvore de origem em um pen drive e reutilizá-la em qualquer máquina, sem precisar configurar um processo do servidor de banco de dados.
Tanto quanto corromper durante commits, VCS usa as mesmas técnicas exatas como bancos de dados para impedir o acesso simultâneo, as transações make atômicas, etc. Corruptions em ambos são muito raros, mas eles não acontecer . Para todos os efeitos, um armazenamento de dados VCS é um banco de dados.
fonte
Melhor recuperação de desastre (pior cenário: analisaremos a olho nu, como nos velhos tempos)
Facilitando o rastreamento e a depuração desses desastres, possivelmente causados por falhas no sistema VCS.
Diminuindo o número de dependências. (não vamos esquecer que um desses sistemas está lidando com o kernel e o outro deveria)
Um editor de texto está sempre disponível. (Licenças do MS SQL Server ... nem tanto)
fonte
sqlite
é a única alternativa possível aos arquivos de texto, dada a grande quantidade de cenários distribuídos que o DVCS moderno atende. (idk, talvez você tenha perdido a parte "distribuída" do DVCS) Qualquer outra coisa seria muito complicada (configuração + firewall + licença) ou até boba para ser distribuída . Então, novamente, fazer o pior cenário pós-morte para um sqlite pode ser difícil.O Fossil é um excelente sistema de controle de versão distribuído (DVCS) e usa SQLite para armazenamento, sem arquivos de texto sem formatação.
Eu realmente gosto que ele tenha se integrado: rastreamento de bugs, Wiki e que ele esteja realmente distribuído. Quero dizer, você pode realmente trabalhar offline e corrigir bugs.
O Fossil usa o Sqlite como formato de arquivo do aplicativo. Na palestra da PgCon, o Dr. Richard Hipp explica quais são as vantagens do uso do sqlite como um sistema de arquivos de aplicativos e cria um argumento bastante convincente dos benefícios do uso de um banco de dados como sistema de arquivos.
Agora, o Dr. Hipp abordou as preocupações em salvar código em um banco de dados
fonte