Il semble que davantage de systèmes de contrôle des sources utilisent encore des fichiers comme moyen de stockage des données de version. Vault et TFS utilisent Sql Server comme magasin de données, ce qui, à mon avis, serait meilleur pour la cohérence des données et la vitesse.
Alors pourquoi SVN, je crois que GIT, CVS, etc. utilisent toujours le système de fichiers comme une base de données essentiellement (je pose cette question car notre serveur SVN vient de se corrompre lors d'un commit normal) au lieu d'utiliser un logiciel de base de données réel ( MSSQL, Oracle, Postgre, etc.)?
EDIT: Je pense qu'une autre façon de poser ma question est "pourquoi les développeurs VCS roulent-ils leur propre système de stockage de données structuré au lieu d'utiliser un existant?"
la source
Réponses:
TL; DR: Peu de systèmes de contrôle de version utilisent une base de données car elle n'est pas nécessaire.
En tant que question pour une réponse à une question, pourquoi pas? Quels sont les avantages des "vrais" systèmes de base de données par rapport à un système de fichiers dans ce contexte?
Considérez que le contrôle de révision consiste principalement à garder une trace de petites métadonnées et de beaucoup de différences de texte. Le texte n'est pas stocké plus efficacement dans les bases de données, et l'indexabilité du contenu ne sera pas un facteur.
Supposons que Git (pour le bien de l'argument) utilise un BDB ou SQLite DB pour son back-end pour stocker des données. Quoi de plus fiable à ce sujet? Tout ce qui pourrait corrompre des fichiers simples peut également corrompre la base de données (car il s'agit également d'un fichier simple avec un codage plus complexe).
Du paradigme du programmeur de ne pas optimiser à moins que ce ne soit nécessaire, si le système de contrôle de révision est assez rapide et fonctionne de manière suffisamment fiable, pourquoi changer la conception entière pour utiliser un système plus complexe?
la source
TL;DR
sont la version abrégée des réponses, pas une déclaration que la question est trop longue et qu'il ne l'a pas lue avant de répondre.Vous semblez faire beaucoup d'hypothèses, peut-être basées sur votre expérience avec SVN et CVS.
Git et Mercurial sont fondamentalement comme SVN et CVS
Comparer Git et CVS, c'est comme comparer un iPad et un Atari. CVS a été créé à l'époque où les dinosaures parcouraient la Terre . Subversion est fondamentalement une version améliorée de CVS. En supposant que les systèmes de contrôle de version modernes comme git et Mercurial fonctionnent comme eux, cela n'a pas beaucoup de sens.
Une base de données relationnelle est plus efficace qu'une base de données à usage unique
Pourquoi? Les bases de données relationnelles sont vraiment compliquées et peuvent ne pas être aussi efficaces que les bases de données à usage unique. Quelques différences du haut de ma tête:
Les bases de données relationnelles sont plus sûres
Encore une fois, pourquoi? Vous semblez supposer que parce que les données sont stockées dans des fichiers, les systèmes de contrôle de version comme git et Mercurial n'ont pas de commits atomiques , mais ils en ont. Les bases de données relationnelles stockent également leurs bases de données sous forme de fichiers. Il est notable ici que CVS ne fait pas de commit atomique, mais c'est probablement parce qu'il vient des âges sombres, pas parce qu'ils n'utilisent pas de bases de données relationnelles.
Il y a aussi le problème de la protection des données contre la corruption une fois qu'elles sont dans la base de données, et là encore la réponse est la même. Si le système de fichiers est corrompu, peu importe la base de données que vous utilisez. Si le système de fichiers n'est pas corrompu, votre moteur de base de données peut être endommagé. Je ne vois pas pourquoi une base de données de contrôle de version serait plus sujette à cela qu'une base de données relationnelle.
Je dirais que les systèmes de contrôle de version distribués (comme git et Mercurial) sont meilleurs pour protéger votre base de données que le contrôle de version centralisé, car vous pouvez restaurer l'intégralité du référentiel à partir de n'importe quel clone. Donc, si votre serveur central brûle spontanément, avec toutes vos sauvegardes, vous pouvez le restaurer en l'exécutant
git init
sur le nouveau serveur, puisgit push
depuis n'importe quelle machine de développeur .Réinventer la roue est mauvais
Ce n'est pas parce que vous pouvez utiliser une base de données relationnelle pour tout problème de stockage que vous le devriez . Pourquoi utilisez-vous des fichiers de configuration au lieu d'une base de données relationnelle? Pourquoi stocker des images sur le système de fichiers alors que vous pouvez stocker les données dans une base de données relationnelle? Pourquoi garder votre code sur le système de fichiers alors que vous pouvez tout stocker dans une base de données relationnelle?
"Si tout ce que vous avez est un marteau, tout ressemble à un clou."
Il y a aussi le fait que les projets open source peuvent se permettre de réinventer la roue quand cela est pratique, car vous n'avez pas les mêmes types de contraintes de ressources que les projets commerciaux. Si vous avez un bénévole qui est un expert dans la rédaction de bases de données, alors pourquoi ne pas les utiliser?
Quant à savoir pourquoi nous ferions confiance aux auteurs de systèmes de contrôle des révisions pour savoir ce qu'ils font .. Je ne peux pas parler pour les autres VCS, mais je suis assez confiant que Linus Torvalds comprend les systèmes de fichiers .
Pourquoi certains systèmes de contrôle de version commerciaux utilisent-ils alors une base de données relationnelle?
Très probablement une combinaison des éléments suivants:
la source
svn
laquelle les différents répertoires de votre répertoire de travail peuvent se trouver à différentessvn
révisions et la véritable atomicité à l'échelle du référentiel avecgit
ouhg
.Actuellement
svn
utilisé pour utiliser BDB pour les référentiels. Cela a finalement été éliminé car il était susceptible de se casser.Un autre VCS qui utilise actuellement une base de données (SQLite) est
fossil
. Il intègre également un traqueur de bogues.Je suppose que la vraie raison est que les VCS fonctionnent avec beaucoup de fichiers. Les systèmes de fichiers ne sont qu'un autre type de base de données (hiérarchique, axé sur l'efficacité du stockage CLOB / BLOB). Les bases de données normales ne gèrent pas bien cela car il n'y a aucune raison - les systèmes de fichiers existent déjà.
la source
Un système de fichiers est une base de données. Pas une base de données relationnelle, bien sûr, mais la plupart sont des magasins de clés / valeurs très efficaces. Et si vos modèles d'accès sont bien conçus pour un magasin de valeurs-clés (par exemple, le format du référentiel git), l'utilisation d'une base de données n'offre probablement pas d'avantages significatifs par rapport à l'utilisation du système de fichiers. (En fait, c'est juste une autre couche d'abstraction pour se mettre en travers.)
De nombreuses fonctionnalités de la base de données ne sont que des bagages supplémentaires. Recherche en texte intégral? La recherche en texte intégral a-t-elle un sens pour le code source? Ou avez-vous besoin de le symboliser différemment? Cela nécessite également que vous stockiez des fichiers complets à chaque révision, ce qui est rare. De nombreux systèmes de contrôle de version stockent des deltas entre les révisions du même fichier afin d'économiser de l'espace, par exemple Subversion et Git (au moins, lors de l'utilisation de fichiers pack.)
Les exigences multiplateformes rendent l'utilisation d'une base de données plus difficile.
La plupart des outils de contrôle de version sont conçus pour fonctionner sur plusieurs plates-formes. Pour les outils de contrôle de version centralisés, cela n'affecte que le composant serveur, mais il est toujours difficile de s'appuyer sur un seul serveur de base de données car les utilisateurs Unix ne peuvent pas installer Microsoft SQL Server et les utilisateurs Windows peuvent ne pas vouloir installer PostgreSQL ou MySQL. Le système de fichiers est le dénominateur le moins commun. Cependant, il existe plusieurs outils dans lesquels le serveur doit être installé sur une machine Windows et nécessitent donc SQL Server, par exemple SourceGear Vault et Microsoft Team Foundation Server .
Les systèmes de contrôle de version distribués rendent cela encore plus difficile, car chaque utilisateur obtient une copie du référentiel. Cela signifie que chaque utilisateur a besoin d'une base de données dans laquelle placer le référentiel. Cela implique que le logiciel:
Par conséquent, la plupart des systèmes de contrôle de version distribués utilisent simplement le système de fichiers. Une exception notable est Veracity de SourceGear , qui peut stocker dans une base de données SQLite (utile pour les référentiels locaux) ou une base de données relationnelle comme SQL Server (peut-être utile pour un serveur). Leur offre hébergée dans le cloud peut utiliser un backend de stockage non relationnel comme Amazon SimpleDB , mais je ne sais pas si cela est vrai.
la source
Pour autant que je l'ai vu dans de nombreuses offres, il semble que les fichiers soient "assez bons" pour le travail, quelque chose de raisonnable, compte tenu du fait qu'en fin de compte, la sortie de VCS est également des fichiers.
De nombreuses entreprises proposent un back-end RDBMS avec une interface svn / git / etc, donc ce que vous demandez existe déjà.
la source
Je dirais que c'est parce que la structure de données principale d'un système de contrôle de version est un DAG, qui correspond très mal aux bases de données. De nombreuses données sont également adressables par contenu, ce qui correspond également très mal aux bases de données.
L'intégrité des données n'est pas la seule préoccupation d'un VCS, ils sont également concernés par l' intégrité de l' historique des versions , pour lesquelles les bases de données ne sont pas très bonnes. En d'autres termes, lorsque vous récupérez une version, vous devez non seulement vous assurer que cette version n'a pas de défauts actuels, mais aussi que rien dans son histoire entière n'a été subrepticement modifié.
Les VCS sont également un produit de consommation en plus d'un produit d'entreprise. Les gens les utilisent dans de petits projets de loisirs individuels. Si vous ajoutez les tracas de l'installation et de la configuration d'un serveur de base de données, vous allez aliéner une grande partie de cette partie du marché. Je suppose que vous ne voyez pas beaucoup d'installations Vault et TFS à la maison. C'est la même raison pour laquelle les feuilles de calcul et les traitements de texte n'utilisent pas de bases de données.
De plus, c'est plus une raison pour le DVCS, mais ne pas utiliser de base de données le rend extrêmement portable. Je peux copier mon arborescence source sur une clé USB et la réutiliser sur n'importe quelle machine, sans avoir à configurer un processus de serveur de base de données.
En ce qui corrompt pendant commits, VCS utilise les mêmes techniques exactes que les bases de données pour empêcher l' accès simultané, les transactions atomiques make, etc. corruptions dans les deux sont très rares, mais ils ne se produise . À toutes fins utiles, un magasin de données VCS est une base de données.
la source
Meilleure reprise après sinistre (pire scénario: nous l'analyserons à l'œil nu, comme autrefois)
Faciliter le suivi et le débogage de ces catastrophes, éventuellement causées par des défaillances du système VCS.
Réduire le nombre de dépendances. (n'oublions pas que l'un de ces systèmes gère le noyau et que l'autre était censé le faire)
Un éditeur de texte est toujours disponible. (Licences MS SQL Server ... pas tellement)
la source
sqlite
est la seule alternative possible aux fichiers texte, étant donné la grande quantité de scénarios distribués que DVCS modernes servent. (idk, peut-être que vous avez peut-être manqué la partie "distribuée" de DVCS) Tout le reste serait trop lourd (configuration + pare-feu + licence) ou même idiot pour être distribué . Ensuite, faire un scénario post-mortem pire scénario à un sqlite pourrait s'avérer difficile.Fossil est un excellent système de contrôle de version distribué (DVCS) et utilise SQLite pour le stockage, pas de fichiers en texte brut.
J'aime vraiment qu'il ait intégré: le suivi des bogues, le Wiki et qu'il soit vraiment distribué. Je veux dire que vous pouvez vraiment travailler hors ligne et corriger des bugs.
Fossil utilise Sqlite comme format de fichier d'application. Dans la keynote de PgCon, le Dr Richard Hipp explique quels sont les avantages de l'utilisation de sqlite comme système de fichiers d'application et fait un argument assez convaincant sur les avantages de l'utilisation d'une base de données comme système de fichiers.
Le Dr Hipp a maintenant répondu aux préoccupations concernant la sauvegarde du code dans une base de données
la source