Es scheint, dass immer noch mehr Versionsverwaltungssysteme Dateien als Mittel zum Speichern der Versionsdaten verwenden. Vault und TFS verwenden SQL Server als Datenspeicher, was meiner Meinung nach sowohl für die Datenkonsistenz als auch für die Geschwindigkeit besser wäre.
Warum verwendet SVN, glaube ich, GIT, CVS usw. das Dateisystem immer noch im Wesentlichen als Datenbank? MSSQL, Oracle, Postgre usw.)?
EDIT: Ich denke, eine andere Möglichkeit, meine Frage zu stellen, ist "Warum rollen VCS-Entwickler ihr eigenes strukturiertes Datenspeichersystem, anstatt ein vorhandenes zu verwenden?"
version-control
Andy
quelle
quelle
Antworten:
TL; DR: Nur wenige Versionskontrollsysteme verwenden eine Datenbank, da dies nicht erforderlich ist.
Warum sollten sie nicht eine Frage für eine Frage beantworten? Welche Vorteile bieten "echte" Datenbanksysteme in diesem Zusammenhang gegenüber einem Dateisystem?
Bedenken Sie, dass die Revisionskontrolle hauptsächlich ein paar Metadaten und viele Textunterschiede erfasst. Text wird nicht effizienter in Datenbanken gespeichert, und die Indizierbarkeit des Inhalts spielt keine Rolle.
Nehmen wir an, dass Git (aus Gründen des Arguments) eine BDB oder SQLite-DB als Back-End zum Speichern von Daten verwendet hat. Was wäre daran zuverlässiger? Alles, was einfache Dateien beschädigen könnte, kann auch die Datenbank beschädigen (da dies auch eine einfache Datei mit einer komplexeren Codierung ist).
Wenn das Revisionskontrollsystem schnell genug und zuverlässig genug ist und nicht optimiert werden muss, warum sollte dann das gesamte Design geändert werden, um ein komplexeres System zu verwenden?
quelle
TL;DR
sind die gekürzte Version der Antworten, keine Aussage, dass die Frage zu lang ist und er sie nicht gelesen hat, bevor er geantwortet hat.Sie scheinen viele Annahmen zu treffen, möglicherweise basierend auf Ihren Erfahrungen mit SVN und CVS.
Git und Mercurial sind im Grunde wie SVN und CVS
Das Vergleichen von Git und CVS ist wie das Vergleichen von iPad und Atari. CVS wurde erstellt, als Dinoaurier die Erde durchstreiften . Subversion ist im Grunde eine verbesserte Version von CVS. Unter der Annahme, dass moderne Versionskontrollsysteme wie git und Mercurial wie sie funktionieren, ergibt das wenig Sinn.
Eine relationale Datenbank ist effizienter als eine Einzweckdatenbank
Warum? Relationale Datenbanken sind sehr kompliziert und möglicherweise nicht so effizient wie Einzweckdatenbanken. Einige Unterschiede auf den ersten Blick:
Relationale Datenbanken sind sicherer
Nochmals, warum? Sie scheinen davon auszugehen, dass Versionskontrollsysteme wie git und Mercurial keine atomaren Commits haben, da Daten in Dateien gespeichert sind . Relationale Datenbanken auch speichern ihre Datenbanken als Dateien. Es ist hier bemerkenswert, dass CVS keine atomaren Commits ausführt, aber das liegt wahrscheinlich daran, dass es aus dem dunklen Zeitalter stammt, und nicht daran, dass sie keine relationalen Datenbanken verwenden.
Es gibt auch das Problem, die Daten vor Beschädigung zu schützen, sobald sie in der Datenbank sind, und die Antwort ist dieselbe. Wenn das Dateisystem beschädigt ist, spielt es keine Rolle, welche Datenbank Sie verwenden. Wenn das Dateisystem nicht beschädigt ist, ist möglicherweise Ihr Datenbankmodul defekt. Ich verstehe nicht, warum eine Versionskontrolldatenbank dafür anfälliger ist als eine relationale Datenbank.
Ich würde argumentieren, dass verteilte Versionskontrollsysteme (wie Git und Mercurial) besser zum Schutz Ihrer Datenbank geeignet sind als eine zentralisierte Versionskontrolle, da Sie das gesamte Repo von jedem Klon aus wiederherstellen können. Wenn also Ihr zentraler Server zusammen mit all Ihren Sicherungen spontan brennt, können Sie ihn wiederherstellen, indem Sie ihn
git init
auf dem neuen Server und danngit push
von einem beliebigen Entwicklercomputer ausführen .Das Rad neu zu erfinden ist schlecht
Gerade weil Sie können eine relationale Datenbank für jedes Speicherproblem verwenden bedeutet nicht , Sie sollten . Warum verwenden Sie Konfigurationsdateien anstelle einer relationalen Datenbank? Warum Bilder im Dateisystem speichern, wenn Sie die Daten in einer relationalen Datenbank speichern könnten? Warum sollten Sie Ihren Code im Dateisystem belassen, wenn Sie ihn alle in einer relationalen Datenbank speichern könnten?
"Wenn Sie nur einen Hammer haben, sieht alles aus wie ein Nagel."
Es gibt auch die Tatsache, dass Open-Source-Projekte es sich leisten können , das Rad immer dann neu zu erfinden, wenn es bequem ist, da Sie nicht die gleichen Ressourcenbeschränkungen haben wie kommerzielle Projekte. Wenn Sie einen Freiwilligen haben, der Experte für das Schreiben von Datenbanken ist, warum sollten Sie ihn dann nicht verwenden?
Was den Grund angeht, warum wir den Autoren von Revisionskontrollsystemen vertrauen, dass sie wissen, was sie tun. Ich kann nicht für andere VCS sprechen, aber ich bin ziemlich zuversichtlich, dass Linus Torvalds Dateisysteme versteht .
Warum verwenden einige kommerzielle Versionskontrollsysteme dann eine relationale Datenbank?
Höchstwahrscheinlich eine Kombination der folgenden:
quelle
svn
wenn sich verschiedene Verzeichnisse in Ihrem Arbeitsverzeichnis in verschiedenensvn
Revisionen befinden, und der tatsächlichen Repository-weiten Atomizität, die Sie mitgit
oder erhaltenhg
.Wird
svn
verwendet, um BDB für Repositorys zu verwenden. Dies wurde schließlich beseitigt, weil es anfällig für Brüche war.Ein anderes VCS, das derzeit eine DB (SQLite) verwendet, ist
fossil
. Es enthält auch einen Bug-Tracker.Ich vermute, der wahre Grund ist, dass VCS mit vielen Dateien arbeiten. Dateisysteme sind nur eine andere Art von Datenbank (hierarchisch, auf CLOB / BLOB-Speichereffizienz ausgerichtet). Normale Datenbanken kommen nicht so gut zurecht, weil es dafür keinen Grund gibt - es gibt bereits Dateisysteme.
quelle
Ein Dateisystem ist eine Datenbank. Natürlich keine relationale Datenbank, aber die meisten sind sehr effiziente Schlüssel- / Wertspeicher. Und wenn Ihre Zugriffsmuster für einen Schlüsselwertspeicher (z. B. das Git-Repository-Format) gut konzipiert sind, bietet die Verwendung einer Datenbank wahrscheinlich keine wesentlichen Vorteile gegenüber der Verwendung des Dateisystems. (Tatsächlich ist es nur eine weitere Abstraktionsebene, die sich in den Weg stellt.)
Viele der Datenbankfunktionen sind nur zusätzliches Gepäck. Volltextsuche? Ist die Volltextsuche für den Quellcode sinnvoll? Oder müssen Sie es anders kennzeichnen? Dies erfordert auch, dass Sie bei jeder Revision vollständige Dateien speichern, was ungewöhnlich ist. Viele Versionskontrollsysteme speichern Deltas zwischen Revisionen derselben Datei, um Speicherplatz zu sparen, z. B. Subversion und Git (zumindest bei Verwendung von Packdateien).
Die plattformübergreifenden Anforderungen machen die Verwendung einer Datenbank schwieriger.
Die meisten Tools zur Versionskontrolle können auf mehreren Plattformen ausgeführt werden. Bei zentralisierten Tools zur Versionskontrolle betrifft dies nur die Serverkomponente, es ist jedoch immer noch schwierig, sich auf einen einzelnen Datenbankserver zu verlassen, da Unix-Benutzer Microsoft SQL Server nicht installieren können und Windows-Benutzer möglicherweise nicht bereit sind, PostgreSQL oder MySQL zu installieren. Das Dateisystem ist der kleinste gemeinsame Nenner. Es gibt jedoch mehrere Tools, bei denen der Server auf einem Windows-Computer installiert werden muss und daher SQL Server erforderlich ist, z. B. SourceGear Vault und Microsoft Team Foundation Server .
Verteilte Versionskontrollsysteme machen dies noch schwieriger, da jeder Benutzer eine Kopie des Repository erhält. Dies bedeutet, dass jeder Benutzer eine Datenbank benötigt, um das Repository zu speichern. Dies impliziert, dass die Software:
Die meisten verteilten Versionskontrollsysteme verwenden daher nur das Dateisystem. Eine bemerkenswerte Ausnahme ist SourceGears Veracity , das in einer SQLite-Datenbank (nützlich für lokale Repositorys) oder einer relationalen Datenbank wie SQL Server (möglicherweise nützlich für einen Server) gespeichert werden kann. Ihr Cloud-gehostetes Angebot verwendet möglicherweise ein nicht relationales Speicher-Backend wie Amazon SimpleDB , aber ich weiß nicht, dass das wahr ist.
quelle
Soweit ich in vielen Angeboten gesehen habe, scheinen Dateien "gut genug" für den Job zu sein, was vernünftig ist, wenn man berücksichtigt, dass die Ausgabe von VCSes am Ende des Tages auch Dateien ist.
Es gibt viele Unternehmen, die ein RDBMS-Back-End mit einer svn / git / etc-Schnittstelle anbieten. Daher ist das, wonach Sie fragen, im Grunde bereits vorhanden.
quelle
Ich würde sagen, das liegt daran, dass die primäre Datenstruktur eines Versionskontrollsystems eine DAG ist, die Datenbanken sehr schlecht zugeordnet ist. Ein Großteil der Daten ist auch inhaltsadressierbar, wodurch auch die Zuordnung zu Datenbanken sehr mangelhaft ist.
Die Integrität der Daten ist nicht die einzige Sorge eines VCS, sie sind auch mit Version betroffen Geschichte Integrität, die Datenbanken sind nicht sehr gut. Mit anderen Worten, wenn Sie eine Version abrufen, müssen Sie nicht nur sicherstellen, dass die Version keine aktuellen Fehler aufweist, sondern auch, dass nichts in ihrer gesamten Historie verstohlen geändert wurde.
VCS sind neben einem Enterprise-Produkt auch ein Consumer-Produkt. Die Leute benutzen sie in kleinen Ein-Mann-Hobbyprojekten. Wenn Sie den Aufwand für die Installation und Konfiguration eines Datenbankservers erhöhen, entfremden Sie einen Großteil dieses Teils des Marktes. Vermutlich sehen Sie zu Hause nicht viele Vault- und TFS-Installationen. Aus dem gleichen Grund verwenden Tabellenkalkulationen und Textverarbeitungsprogramme keine Datenbanken.
Auch dies ist eher ein Grund für DVCS, aber die Nichtverwendung einer Datenbank macht es extrem portabel. Ich kann meinen Quellbaum auf ein USB-Stick kopieren und auf jedem Computer wiederverwenden, ohne einen Datenbankserverprozess konfigurieren zu müssen.
Soweit bei Commits korrumpieren verwendet VCS exakt die gleichen Techniken wie Datenbanken gleichzeitigen Zugriff zu verhindern, machen Transaktionen Atom usw. Verderbtheiten beide in sehr selten sind, aber sie tun passieren . Für alle Absichten und Zwecke, ein VCS - Datenspeicher ist eine Datenbank.
quelle
Besseres Disaster Recovery (Worst-Case-Szenario: Wir analysieren es wie in alten Zeiten per Auge)
Das Nachverfolgen und Debuggen solcher Katastrophen, die möglicherweise durch Fehler im VCS-System verursacht wurden, wird vereinfacht.
Verringerung der Anzahl der Abhängigkeiten. (Vergessen wir nicht, dass eines dieser Systeme den Kernel handhabt und das andere sollte)
Ein Texteditor ist immer verfügbar. (MS SQL Server Lizenzen ... nicht so sehr)
quelle
sqlite
ist die einzig mögliche Alternative zu Textdateien, angesichts der Vielzahl von verteilten Szenarien, die modernes DVCS bietet. (idk, vielleicht haben Sie den "verteilten" Teil von DVCS verpasst) Alles andere wäre zu umständlich (Konfiguration + Firewall + Lizenz) oder sogar albern, um verteilt zu werden . Andererseits könnte es sich als schwierig erweisen, ein Worst-Case-Szenario postmortem auf einem SQLite zu erstellen.Fossil ist ein hervorragendes verteiltes Versionskontrollsystem (Distributed Version Control System, DVCS) und verwendet SQLite zum Speichern, keine Nur-Text-Dateien.
Ich mag es wirklich, dass es integriert hat: Bug Tracking, Wiki und dass es wirklich verteilt ist. Ich meine, Sie können wirklich offline arbeiten und Fehler beheben.
Fossil verwendet Sqlite als Anwendungsdateiformat. In der Keynote bei PgCon erklärt Dr. Richard Hipp, welche Vorteile die Verwendung von sqlite als Anwendungsdateisystem hat, und macht ein ziemlich überzeugendes Argument für die Vorteile der Verwendung einer Datenbank als Dateisystem.
Jetzt hat Dr. Hipp die Bedenken zum Speichern von Code in einer Datenbank angesprochen
quelle