Parece que más sistemas de control de código fuente todavía usan archivos como medio para almacenar los datos de la versión. Vault y TFS usan Sql Server como su almacén de datos, lo que creo que sería mejor para la consistencia de los datos y la velocidad.
Entonces, ¿por qué SVN, creo que GIT, CVS, etc. todavía usan el sistema de archivos como esencialmente una base de datos (hago esta pregunta porque nuestro servidor SVN simplemente se corrompió durante una confirmación normal) en lugar de usar el software de base de datos real ( MSSQL, Oracle, Postgre, etc.
EDITAR: Creo que otra forma de hacer mi pregunta es "¿por qué los desarrolladores de VCS implementan su propio sistema de almacenamiento de datos estructurado en lugar de utilizar uno existente?"
fuente
Respuestas:
TL; DR: Pocos sistemas de control de versiones usan una base de datos porque no es necesaria.
Como pregunta por respuesta, ¿por qué no lo harían? ¿Qué beneficios ofrecen los sistemas de bases de datos "reales" sobre un sistema de archivos en este contexto?
Tenga en cuenta que el control de revisión consiste principalmente en realizar un seguimiento de unos pequeños metadatos y una gran cantidad de diferencias de texto. El texto no se almacena en las bases de datos de manera más eficiente, y la indexabilidad de los contenidos no será un factor.
Supongamos que Git (por el bien del argumento) usó un BDB o SQLite DB para su back-end para almacenar datos. ¿Qué sería más confiable sobre eso? Cualquier cosa que pueda dañar archivos simples también puede dañar la base de datos (ya que también es un archivo simple con una codificación más compleja).
Desde el paradigma del programador de no optimizar a menos que sea necesario, si el sistema de control de revisión es lo suficientemente rápido y funciona de manera confiable, ¿por qué cambiar todo el diseño para utilizar un sistema más complejo?
fuente
TL;DR
son la versión resumida de las respuestas, no una declaración de que la pregunta es demasiado larga y que no la leyó antes de responder.Parece que está haciendo muchas suposiciones, posiblemente basadas en su experiencia con SVN y CVS.
Git y Mercurial son básicamente como SVN y CVS
Comparar git y CVS es como comparar un iPad y un Atari. CVS fue creado cuando los dinosaurios vagaban por la Tierra . Subversion es básicamente una versión mejorada de CVS. Asumir que los sistemas modernos de control de versiones como git y Mercurial funcionan como ellos tiene muy poco sentido.
Una base de datos relacional es más eficiente que una base de datos de un solo propósito.
¿Por qué? Las bases de datos relacionales son realmente complicadas y pueden no ser tan eficientes como las bases de datos de propósito único. Algunas diferencias en la parte superior de mi cabeza:
Las bases de datos relacionales son más seguras
De nuevo por qué? Parece suponer que debido a que los datos se almacenan en archivos, los sistemas de control de versiones como git y Mercurial no tienen compromisos atómicos , pero los tienen. Las bases de datos relacionales también almacenan sus bases de datos como archivos. Es notable aquí que CVS no realiza confirmaciones atómicas, pero eso es probablemente porque es de la Edad Media, no porque no usen bases de datos relacionales.
También está el problema de proteger los datos de la corrupción una vez que están en la base de datos, y nuevamente la respuesta es la misma. Si el sistema de archivos está dañado, no importa qué base de datos esté usando. Si el sistema de archivos no está dañado, entonces su motor de base de datos podría estar dañado. No veo por qué una base de datos de control de versiones sería más propensa a esto que una base de datos relacional.
Yo diría que los sistemas de control de versiones distribuidos (como git y Mercurial) son mejores para proteger su base de datos que el control de versiones centralizado, ya que puede restaurar todo el repositorio desde cualquier clon. Por lo tanto, si su servidor central se quema espontáneamente, junto con todas sus copias de seguridad, puede restaurarlo ejecutándose
git init
en el nuevo servidor, y luegogit push
desde la máquina de cualquier desarrollador .Reinventar la rueda es malo
El hecho de que pueda usar una base de datos relacional para cualquier problema de almacenamiento no significa que deba hacerlo . ¿Por qué utiliza archivos de configuración en lugar de una base de datos relacional? ¿Por qué almacenar imágenes en el sistema de archivos cuando podría almacenar los datos en una base de datos relacional? ¿Por qué mantener su código en el sistema de archivos cuando podría almacenarlo todo en una base de datos relacional?
"Si todo lo que tienes es un martillo, todo parece un clavo".
También existe el hecho de que los proyectos de código abierto pueden permitirse reinventar la rueda siempre que sea conveniente, ya que no tiene los mismos tipos de limitaciones de recursos que los proyectos comerciales. Si tiene un voluntario experto en escribir bases de datos, ¿por qué no usarlo?
En cuanto a por qué confiaríamos en los escritores de sistemas de control de revisiones para saber lo que están haciendo ... No puedo hablar por otros VCS, pero estoy bastante seguro de que Linus Torvalds entiende los sistemas de archivos .
¿Por qué algunos sistemas de control de versiones comerciales usan una base de datos relacional entonces?
Lo más probable es una combinación de lo siguiente:
fuente
svn
diferentes directorios en su directorio de trabajo pueden estar en diferentessvn
revisiones y la verdadera atomicidad amplia del repositorio que obtiene congit
ohg
.Realmente
svn
solía usar BDB para repositorios. Esto finalmente se eliminó porque era propenso a la rotura.Otro VCS que actualmente usa un DB (SQLite) es
fossil
. También integra un rastreador de errores.Supongo que la verdadera razón es que los VCS funcionan con muchos archivos. Los sistemas de archivos son solo otro tipo de base de datos (jerárquica, enfocada en la eficiencia de almacenamiento CLOB / BLOB). Las bases de datos normales no se manejan tan bien porque no hay razón para hacerlo, ya existen sistemas de archivos.
fuente
Un sistema de archivos es una base de datos. No es una base de datos relacional, por supuesto, pero la mayoría son almacenes de clave / valor muy eficientes. Y si sus patrones de acceso están bien diseñados para un almacén de valores clave (por ejemplo, el formato de repositorio git), el uso de una base de datos probablemente no ofrezca ventajas significativas sobre el uso del sistema de archivos. (De hecho, es solo otra capa de abstracción que se interpone).
Muchas de las características de la base de datos son solo equipaje adicional. ¿Búsqueda de texto completo? ¿La búsqueda de texto completo tiene sentido para el código fuente? ¿O necesita tokenizarlo de manera diferente? Esto también requiere que almacene archivos completos en cada revisión, lo cual es poco común. Muchos sistemas de control de versiones almacenan deltas entre revisiones del mismo archivo para ahorrar espacio, por ejemplo, Subversion y Git (al menos, cuando se usan archivos de paquete).
Los requisitos multiplataforma hacen que el uso de una base de datos sea más desafiante.
La mayoría de las herramientas de control de versiones están diseñadas para ejecutarse en múltiples plataformas. Para las herramientas de control de versiones centralizadas, esto solo afecta al componente del servidor, pero aún es difícil confiar en un único servidor de base de datos ya que los usuarios de Unix no pueden instalar Microsoft SQL Server y los usuarios de Windows pueden no estar dispuestos a instalar PostgreSQL o MySQL. El sistema de archivos es el mínimo común denominador. Sin embargo, hay varias herramientas en las que el servidor debe instalarse en una máquina con Windows y, por lo tanto, requieren SQL Server, por ejemplo, SourceGear Vault y Microsoft Team Foundation Server .
Los sistemas de control de versiones distribuidos hacen que esto sea aún más desafiante, ya que cada usuario obtiene una copia del repositorio. Esto significa que cada usuario necesita una base de datos para colocar el repositorio. Esto implica que el software:
La mayoría de los sistemas de control de versiones distribuidos, por lo tanto, solo usan el sistema de archivos. Una notable excepción es SourceGear's Veracity , que puede almacenarse en una base de datos SQLite (útil para repositorios locales) o una base de datos relacional como SQL Server (posiblemente útil para un servidor). Su oferta alojada en la nube puede usar un back-end de almacenamiento no relacional como Amazon SimpleDB , pero no sé que esto sea cierto.
fuente
Por lo que he visto en muchas ofertas, parece que los archivos son "lo suficientemente buenos" para el trabajo, algo razonable, teniendo en cuenta que, al final del día, la salida de VCSes también son archivos.
Hay muchas compañías que ofrecen un back-end RDBMS con una interfaz svn / git / etc, por lo que lo que está pidiendo ya existe.
fuente
Diría que es porque la estructura de datos primaria de un sistema de control de versiones es un DAG, que se asigna muy mal a las bases de datos. Muchos de los datos también son direccionables por contenido, lo que también se asigna muy mal a las bases de datos.
La integridad de los datos no es la única preocupación de un VCS, también se preocupan por la integridad del historial de versiones , en las cuales las bases de datos no son muy buenas. En otras palabras, cuando recupera una versión, no solo necesita asegurarse de que la versión no tenga fallas actuales, sino también que nada en toda su historia ha sido alterado subrepticiamente.
Los VCS también son un producto de consumo además de un producto empresarial. La gente los usa en pequeños proyectos de pasatiempos de un solo hombre. Si agrega la molestia de instalar y configurar un servidor de base de datos, va a alienar gran parte de esa parte del mercado. Supongo que no ves muchas instalaciones de Vault y TFS en casa. Es la misma razón por la que las hojas de cálculo y los procesadores de texto no usan bases de datos.
Además, esta es una razón más para DVCS, pero no usar una base de datos lo hace extremadamente portátil. Puedo copiar mi árbol de origen en una memoria USB y reutilizarlo en cualquier máquina, sin tener que configurar un proceso de servidor de base de datos.
En lo que a corromper durante confirmaciones, VCS utiliza exactamente las mismas técnicas que las bases de datos para evitar el acceso simultáneo, maquillaje transacciones atómicas, etc. corrupciones en ambos son muy raros, pero no sucede . Para todos los efectos, un almacén de datos VCS es una base de datos.
fuente
Mejor recuperación ante desastres (peor de los casos: lo analizaremos a simple vista, como en los viejos tiempos)
Hacer más fácil el seguimiento y la depuración de tales desastres, posiblemente causados por fallas en el sistema VCS.
Bajar el número de dependencias. (no olvidemos que uno de esos sistemas está manejando el kernel, y se suponía que el otro debía hacerlo)
Un editor de texto siempre está disponible. (Licencias de MS SQL Server ... no tanto)
fuente
sqlite
es la única alternativa posible a los archivos de texto, dada la gran cantidad de escenarios distribuidos que sirven los DVCS modernos. (idk, tal vez te hayas perdido la parte "distribuida" de DVCS) Cualquier otra cosa sería demasiado engorrosa (configuración + firewall + licencia) o incluso tonta para ser distribuida . Entonces, una vez más, hacer el peor de los casos postmortem a un sqlite podría resultar difícil.Fossil es un excelente Sistema de control de versiones distribuido (DVCS) y utiliza SQLite para el almacenamiento, sin archivos de texto sin formato.
Realmente me gusta que haya integrado: seguimiento de errores, Wiki y que esté realmente distribuido. Quiero decir que realmente puedes trabajar sin conexión y corregir errores.
Fossil usa Sqlite como su formato de archivo de aplicación. En la conferencia magistral de PgCon, el Dr. Richard Hipp explica cuáles son las ventajas de usar sqlite como un Sistema de archivos de aplicación, y hace un argumento bastante convincente sobre los beneficios de usar una base de datos como sistema de archivos.
Ahora el Dr. Hipp ha abordado las inquietudes sobre guardar código en una base de datos
fuente