il mio valore di 2 pence. Un po 'di nostalgia ma ... avevo un requisito simile in uno dei miei progetti di incubazione. Simile al tuo, i miei requisiti chiave dove un database di documenti (xml nel mio caso), con il controllo delle versioni dei documenti. Era per un sistema multiutente con molti casi d'uso di collaborazione. La mia preferenza era quella di utilizzare le soluzioni opensource disponibili che supportano la maggior parte dei requisiti chiave.
Per andare al sodo, non sono riuscito a trovare nessun prodotto che fornisse entrambi, in un modo sufficientemente scalabile (numero di utenti, volumi di utilizzo, risorse di archiviazione e di calcolo). soluzioni (probabili) che si potrebbero ricavare da esso. Mentre giocavo di più con l'opzione git, passare da una prospettiva per utente singolo a una prospettiva per utenti multipli (milli) è diventata una sfida ovvia. Sfortunatamente, non sono riuscito a fare un'analisi sostanziale delle prestazioni come hai fatto tu. (.. pigro / esci presto .... per la versione 2, mantra) Potere a te !. Ad ogni modo, la mia idea distorta da allora si è trasformata nella successiva alternativa (ancora parziale): un insieme di strumenti che sono i migliori nelle loro sfere separate, database e controllo delle versioni.
Mentre ancora work in progress (... e leggermente trascurato) la versione trasformata è semplicemente questa.
- sul frontend: (userfacing) utilizza un database per l'archiviazione di 1 ° livello (interfacciamento con applicazioni utente)
- sul backend, utilizza un sistema di controllo della versione (VCS) (come git) per eseguire il controllo delle versioni degli oggetti dati nel database
In sostanza, equivarrebbe ad aggiungere un plug-in per il controllo della versione al database, con un po 'di colla per l'integrazione, che potresti dover sviluppare, ma potrebbe essere molto più semplice.
Il modo in cui dovrebbe (dovrebbe funzionare) è che gli scambi di dati dell'interfaccia multiutente primaria avvengano attraverso il database. Il DBMS gestirà tutte le questioni divertenti e complesse come multiutente, concorrenza e operazioni atomiche, ecc. Sul backend il VCS eseguirà il controllo della versione su un singolo set di oggetti dati (nessuna concorrenza o problemi multiutente). Per ogni transazione effettiva sul database, il controllo della versione viene eseguito solo sui record di dati che sarebbero stati effettivamente modificati.
Per quanto riguarda la colla di interfaccia, sarà sotto forma di una semplice funzione di interazione tra il database e il VCS. In termini di progettazione, un approccio semplice sarebbe un'interfaccia guidata dagli eventi, con gli aggiornamenti dei dati dal database che attivano le procedure di controllo della versione (suggerimento: assumendo Mysql, uso di trigger e sys_exec () blah blah ...). In termini di complessità di implementazione, si va dal semplice ed efficace (es. scripting) al complesso e meraviglioso (qualche interfaccia di connettore programmato). Tutto dipende da quanto pazzo vuoi andare con esso e quanto capitale di sudore sei disposto a spendere. Penso che un semplice scripting dovrebbe fare la magia. E per accedere al risultato finale, alle varie versioni dei dati, una semplice alternativa è popolare un clone del database (più un clone della struttura del database) con i dati referenziati dal tag di versione / id / hash nel VCS. ancora una volta questo bit sarà un semplice lavoro di query / traduzione / mappatura di un'interfaccia.
Ci sono ancora alcune sfide e incognite da affrontare, ma suppongo che l'impatto e la rilevanza della maggior parte di questi dipenderanno in gran parte dai requisiti dell'applicazione e dai casi d'uso. Alcuni potrebbero finire per non essere problemi. Alcuni dei problemi includono la corrispondenza delle prestazioni tra i 2 moduli chiave, il database e il VCS, per un'applicazione con attività di aggiornamento dei dati ad alta frequenza, il ridimensionamento delle risorse (archiviazione e potenza di elaborazione) nel tempo sul lato git come i dati e gli utenti crescere: costante, esponenziale o eventualmente plateau
Del cocktail sopra, ecco cosa sto preparando al momento
- utilizzando Git per il VCS (inizialmente considerato il buon vecchio CVS per via dell'uso solo di changeset o delta tra 2 versioni)
- utilizzando mysql (a causa della natura altamente strutturata dei miei dati, xml con schemi xml rigorosi)
- giocherellare con MongoDB (per provare un database NoSQl, che corrisponde strettamente alla struttura del database nativa utilizzata in git)
Alcuni fatti divertenti: git in realtà fa cose chiare per ottimizzare l'archiviazione, come la compressione e l'archiviazione dei soli delta tra le revisioni degli oggetti - SÌ, git memorizza solo i changeset o i delta tra le revisioni degli oggetti dati, dove è applicabile (sa quando e come) . Riferimento: packfiles, nel profondo delle viscere degli interni di Git
- Revisione dell'object storage di git (file system indirizzabile dal contenuto), mostra strette somiglianze (dal punto di vista concettuale) con database noSQL come mongoDB. Ancora una volta, a scapito del capitale del sudore, potrebbe fornire possibilità più interessanti per l'integrazione del 2 e il miglioramento delle prestazioni
Se sei arrivato a questo punto, lasciami se quanto sopra può essere applicabile al tuo caso, e supponendo che lo sarebbe, come si sarebbe allineato ad alcuni degli aspetti nella tua ultima analisi completa delle prestazioni