Come incorporare un database in un processo di controllo della versione per ramo?

6

Speriamo di passare a un nuovo processo branch-per-issue con lo sviluppo. Per prepararsi a questo, sono state fatte molte ricerche e sperimentazioni in termini di controllo di versione, CI e processo di promozione. L'unica cosa che non voglio cadere nel progetto è il database e il suo schema.

Il processo attuale che abbiamo in atto ci colloca in una posizione costosa. Abbiamo quattro box SQL Server, ognuno con il proprio valore di dati. C'è Staging (per lo sviluppo), Quality (per QA), Beta (per la prototipazione del client) e Produzione. Desideriamo iniziare a sostituire alcuni dei nostri modelli di database con MariaDB mentre implementiamo anche questo nuovo processo. Tuttavia, ho difficoltà a capire come implementeremo le nostre modifiche SQL nel controllo della versione.

Il nostro nuovo processo inizierà con un ramo principale, che sarà il nostro codice principale, seguito da un ramo di integrazione e rami di emissione. Ogni sviluppatore avrà la propria istanza Web installata per apportare le modifiche necessarie su qualsiasi ramo a cui sta lavorando in quel momento. Tuttavia, abbiamo sempre lavorato sul server globale di gestione temporanea per il nostro SQL. Questo non mi sembra praticabile nel nuovo processo che intendiamo fare. La mia ipotesi per questo è che ogni persona avrà una versione di un database (MariaDB) a cui apportare modifiche allo schema. Quindi, questa è la mia domanda principale.

Utilizzo un processo di solo commit e fusione delle modifiche dello schema? Non penserei che commettere un intero database sia una buona idea. E a quel punto, come sarebbe conservato nel controllo di versione (useremo Git come controllo della versione)? Ogni schema modificato sarebbe memorizzato come un file separato?

Per chiarezza, quello che stiamo pensando di usare è un server PHP / Apache per fornire i nostri contenuti web, un back-end API Java, un MariaDB (che sposteremo il server SQL da) e un repository Git per il controllo della versione sul codice web e il codice API.

    
posta CrystalBlue 22.05.2015 - 18:58
fonte

2 risposte

3

Propongo di esaminare in code migrations per la tua lingua o tecnologia. Possiedo uno stack .NET e posso utilizzare Entity Framework Migrations in cui ogni modifica dello schema è una singola migrazione che può essere automaticamente applicata al database quando necessario. Ciò che è anche possibile è il downgrade del database, quindi il pattern per la migrazione di db è che hai un metodo per Up() e Down() questo è davvero un risparmio di tempo quando devi affrontare test, staging, produzione per mantenere le modifiche in un posto e don Non preoccuparti di aggiornare le cose manualmente.

Ma potresti aggiornare la domanda con lo stack tecnologico che hai a disposizione, quindi qualcuno potrebbe fornirti i dettagli specifici della tua tecnologia.

    
risposta data 22.05.2015 - 20:59
fonte
3

L'approccio che seguo si basa sui seguenti presupposti:

  1. Gli sviluppatori non devono preoccuparsi dei dati di produzione. Questo è per il dipartimento delle operazioni di cui preoccuparsi.

  2. I file di configurazione xml, gli script, ecc. devono essere mantenuti al minimo.

  3. Tutto deve essere nel repository del codice sorgente.

  4. Il repository del codice sorgente deve contenere solo file di testo diffetti, niente binari.

  5. Gli RDBMS non sono altro che strumenti che utilizziamo per mantenere i nostri dati: esistono per servirci, non dovremmo perdere il nostro tempo per curarli.

Quindi, quello che faccio è che considero i file del database come qualcosa di completamente spendibile.

Ho una serie di classi che descrivono il mio "modello", da cui viene calcolato automaticamente lo schema del database, e dopo l'istanziazione il modello popola anche il database con tutti i dati predefiniti necessari se manca. Quindi, come sviluppatore, lavori sempre sul tuo database locale (che, per inciso, potrebbe essere HSQLDB per la velocità) e puoi in qualsiasi momento eliminare tutte le tabelle del tuo database, o anche l'intero catalogo, e eseguire l'applicazione, a quel punto l'applicazione ricreare tutto ciò che non trova esistere. Ciò significa che puoi tornare a qualsiasi revisione o passare a qualsiasi ramo in qualsiasi momento, e sei subito a posto.

I test creano anche i propri cataloghi a eliminazione diretta che compilano inoltre con i dati di esempio di cui hanno bisogno per essere eseguiti. Fanno uso delle classi del modello, quindi il database viene prima creato automaticamente per loro, e poi ognuno di essi aggiunge i dati di test di cui ha bisogno. Io uso il nome del pacchetto del test (nome dello spazio dei nomi in .Net parlance) come nome del catalogo per ciascun test, in modo che una suite di test non sporchi i dati di un'altra suite di test.

Il mantenimento dei dati aziendali effettivi per l'ambiente di produzione è responsabilità esclusiva del reparto operativo. Quando agli sviluppatori viene rilasciata una versione, sono le operazioni che devono convertire tutti i vecchi dati che hanno nel nuovo formato di database. Gli sviluppatori potrebbero in teoria aiutarli fornendo punti di ingresso che possono essere invocati per convertire una vecchia versione in una nuova versione, ma risulta che questo causa più problemi di quanti ne risparmia, quindi in realtà le operazioni vengono lasciate completamente da sole. Hanno ingegneri, sanno come scrivere script per l'RDBMS che usano, possono gestirlo bene. Sono anche quelli che hanno la conoscenza di come le vecchie informazioni dovrebbero essere convertite in nuove informazioni e quali tipi di valori sono adatti come valori predefiniti per le colonne introdotte di recente.

Da ciò segue che gli unici tipi di file che devono essere memorizzati nel sistema di controllo della versione sono il codice e una quantità minima di file di configurazione.

Un'altra cosa in più:

Potresti essere tentato di mantenere la struttura del tuo database come un file SQL contenente tutto il DDL necessario per descrivere il tuo schema e tutto il DML necessario per compilare il nuovo schema con dati predefiniti. Non farlo.

Le informazioni contenute nei file di configurazione e negli script non devono mai sovrapporsi o duplicare le informazioni rappresentate nel codice. Un file di schema che elenca le tabelle del database e le colonne di ogni tabella è malvagio, perché presumibilmente il tuo codice dovrà essere scritto per avere anche conoscenza di queste stesse entità, quindi alterare il file dello schema non ti farà bene a meno che il le modifiche corrispondenti sono fatte nel codice, e la modifica del codice è anche inutile senza riflettere le modifiche al file dello schema con scrupolosa attenzione a farlo esattamente nel modo giusto. Chiaramente, uno dei due deve andare. Non è possibile sbarazzarsi del codice, quindi il file dello schema è quello che deve andare.

Non solo "Codice prima", ma anche "Solo codice".

    
risposta data 22.05.2015 - 22:34
fonte

Leggi altre domande sui tag