mi valor de 2 centavos. Un poco de nostalgia pero ... Tenía un requisito similar en uno de mis proyectos de incubación. Al igual que el suyo, mis requisitos clave eran una base de datos de documentos (xml en mi caso), con versiones de documentos. Fue para un sistema multiusuario con muchos casos de uso de colaboración. Mi preferencia fue utilizar las soluciones de código abierto disponibles que admitan la mayoría de los requisitos clave.
Para ir al grano, no pude encontrar ningún producto que proporcionara ambos, de una manera que fuera lo suficientemente escalable (número de usuarios, volúmenes de uso, recursos de almacenamiento y computación). Estaba predispuesto a git por toda la capacidad prometedora, y (probables) soluciones que uno podría elaborar a partir de él. A medida que jugaba más con la opción git, pasar de la perspectiva de un solo usuario a una perspectiva de múltiples (mili) usuarios se convirtió en un desafío obvio. Desafortunadamente, no pude hacer un análisis de rendimiento sustancial como lo hizo usted. (.. perezoso / salir temprano .... para la versión 2, mantra) ¡Poder para ti !. De todos modos, mi idea sesgada se ha transformado desde entonces en la siguiente alternativa (aún sesgada): una combinación de herramientas que son las mejores en sus esferas separadas, bases de datos y control de versiones.
Aunque todavía se está trabajando (... y un poco descuidado), la versión transformada es simplemente esto.
- en la interfaz: (cara al usuario) use una base de datos para el almacenamiento de primer nivel (interactuando con las aplicaciones del usuario)
- en el backend, use un sistema de control de versiones (VCS) (como git) para realizar el control de versiones de los objetos de datos en la base de datos
En esencia, equivaldría a agregar un complemento de control de versiones a la base de datos, con algo de pegamento de integración, que puede que tenga que desarrollar, pero que puede ser mucho más fácil.
Cómo funcionaría (se supone que funciona) es que los intercambios de datos de la interfaz multiusuario principal se realizan a través de la base de datos. El DBMS manejará todos los temas divertidos y complejos como multiusuario, concurrencia e, operaciones atómicas, etc. En el backend, el VCS realizaría el control de versiones en un solo conjunto de objetos de datos (sin concurrencia o problemas de multiusuario). Para cada transacción efectiva en la base de datos, el control de versiones solo se realiza en los registros de datos que efectivamente habrían cambiado.
En cuanto al pegamento de interfaz, tendrá la forma de una función de interfuncionamiento simple entre la base de datos y el VCS. En términos de diseño, un enfoque simple sería una interfaz impulsada por eventos, con actualizaciones de datos de la base de datos que activan los procedimientos de control de versiones (pista: asumiendo Mysql, uso de disparadores y sys_exec () bla bla ...) En términos de complejidad de implementación, variará desde lo simple y efectivo (por ejemplo, scripting) hasta lo complejo y maravilloso (alguna interfaz de conector programada). Todo depende de cuán loco quieras ir con él y de cuánto capital de sudor estés dispuesto a gastar. Creo que las secuencias de comandos simples deberían hacer la magia. Y para acceder al resultado final, las diversas versiones de datos, una alternativa simple es poblar un clon de la base de datos (más un clon de la estructura de la base de datos) con los datos referenciados por la etiqueta de versión / id / hash en el VCS. de nuevo, este bit será un simple trabajo de consulta / traducción / mapa de una interfaz.
Aún quedan algunos desafíos e incógnitas que abordar, pero supongo que el impacto y la relevancia de la mayoría de ellos dependerán en gran medida de los requisitos de su aplicación y los casos de uso. Algunos pueden terminar siendo un problema. Algunos de los problemas incluyen la coincidencia de rendimiento entre los 2 módulos clave, la base de datos y el VCS, para una aplicación con actividad de actualización de datos de alta frecuencia, escalado de recursos (capacidad de almacenamiento y procesamiento) a lo largo del tiempo en el lado de git como los datos y los usuarios crecer: estable, exponencial o eventualmente meseta
Del cóctel de arriba, esto es lo que estoy preparando actualmente.
- usando Git para el VCS (inicialmente considerado un buen CVS antiguo debido al uso de solo conjuntos de cambios o deltas entre la versión 2)
- usando mysql (debido a la naturaleza altamente estructurada de mis datos, xml con esquemas xml estrictos)
- jugando con MongoDB (para probar una base de datos NoSQl, que se asemeja mucho a la estructura de la base de datos nativa utilizada en git)
Algunos datos divertidos: git en realidad hace cosas claras para optimizar el almacenamiento, como la compresión y el almacenamiento de solo deltas entre revisiones de objetos: SÍ, git solo almacena conjuntos de cambios o deltas entre revisiones de objetos de datos, dónde es aplicable (lo sabe cuando y cómo) . Referencia: packfiles, en lo más profundo de las entrañas de Git
: revisión del almacenamiento de objetos de git (sistema de archivos direccionable por contenido), muestra similitudes sorprendentes (desde la perspectiva del concepto) con bases de datos noSQL como mongoDB. Nuevamente, a expensas del capital de sudor, puede proporcionar posibilidades más interesantes para integrar el 2 y ajustar el rendimiento
Si llegó hasta aquí, permítame si lo anterior puede ser aplicable a su caso, y suponiendo que lo sea, cómo encajaría con algunos de los aspectos de su último análisis integral de desempeño.