Come gestire al meglio il refactoring del database all'interno di una squadra?

7

Attualmente utilizziamo un approccio rollforward alle modifiche ai DB, simile a Migrations , in cui ogni sviluppatore crea e controlla uno script che promuove l'ultima versione del DB in un nuovo stato. I problemi sorgono quando più sviluppatori lavorano contemporaneamente su attività non banali e finiscono per apportare modifiche al DB che interferiscono tra loro. Il bit "non banale" è significativo perché se le attività richiedono abbastanza tempo e se le modifiche al DB si verificano abbastanza presto nel ciclo, nessuno dei due deve essere consapevole delle modifiche dell'altro e si finisce con un incubo di unione di DB ( caso preferito) o un database danneggiato inavvertitamente.

Queste situazioni possono essere facilmente evitate? Esistono strategie di refactoring del database che gestiscono efficacemente lo scenario di più sviluppatori che modificano attivamente lo schema?

Se è importante, utilizziamo SQL Server.

    
posta Michael Teper 08.07.2011 - 08:54
fonte

5 risposte

9

Martin Fowler e Pramod Sadalage hanno scritto un eccellente articolo su questo argomento:

Progetto di database evolutivo

Ti suggerisco di seguire il suo consiglio, ad es. che un DBA dedicato rivede le modifiche e le unisce al master del database, mentre ogni sviluppatore può testare le cose sul proprio database.

Nella mia stessa azienda, abbiamo anche scoperto che gli strumenti di confronto dei database possono essere di grande aiuto in questo processo, poiché possono creare automaticamente script di aggiornamento, ad es. per aggiornare gli ambienti di produzione.

    
risposta data 08.07.2011 - 09:12
fonte
2

Stabilisci un processo di revisione. tutti coloro che hanno implementato una migrazione devono esaminare le migrazioni successive. Controllare in un singolo file di documentazione di migrazione, in cui tutti coloro che modificano il database devono fornire una sinossi della nuova migrazione. Se due persone implementano modifiche di cui devono essere consapevoli, il conseguente conflitto di unione nel CVS le allarmerà.

    
risposta data 08.07.2011 - 09:09
fonte
1

link

Citazione dalla prima pagina:

You never develop code without version control, why do you develop your database without it?

Liquibase is an open source (Apache 2.0 Licensed), database-independent library for tracking, managing and applying database changes. It is built on a simple premise: All database changes are stored in a human readable yet trackable form and checked into source control.

    
risposta data 08.07.2011 - 12:48
fonte
1

L'unica soluzione che ho trovato è di avere uno strato funzionale tra il DB e l'applicazione. Le esigenze di dati nell'applicazione richiedono l'astrazione dallo schema DB e viceversa, per evitare che un cambio di schema diventi un intervento chirurgico massiccio. Questa non è la stessa cosa dell'utilizzo di un ORM.

Se lo schema DB deve essere modificato, la modifica deve essere accompagnata da cambiamenti nel livello di richiesta funzionale che estrae / spinga i dati. Allo stesso modo, le modifiche nella rappresentazione dei dati all'interno dell'applicazione devono essere accompagnate da cambiamenti nel livello dati che tira / spinge i dati.

Ciò che questo approccio aggiunge in termini di requisiti di codifica nel codice di chiamata all'astrazione dei dati che salva in enormi modifiche al tremolio del progetto da riscrivere al mondo. In particolare, impedisce a quei cambiamenti a livello di progetto di trasformarsi in funzionalità / creep e mettere la tua squadra in una situazione impossibile.

Un ulteriore vantaggio di questo approccio è che puoi implementare un tale livello ora e in incrementi senza diventare troppo selvaggio. Ad esempio, è possibile scrivere un livello di query tabella 1 per 1 che separa il codice chiamante dalla query DB e sostituire le precedenti query in-code (o chiamate di framework ORM o DB) con le chiamate a queste nuove funzioni che accettano e restituire esattamente qualunque cosa hai a che fare in questo momento. Questo è facile. Ora se hai bisogno di una modifica del DB, fallo con una modifica al codice del livello dati in modo che accetti e restituisca tutto ciò che fa ora, ma si occupa con garbo della modifica del DB. È quindi possibile modificare il codice chiamante stesso se questo ha senso.

A volte si scopre qualcosa di interessante sui dati non banali in questo processo - vale a dire che le traduzioni da oggetto a tabella sono non 1-per-1 e che la forma dei dati nel codice può non corrisponde mai alla sua forma in un DB relazionale, ma che un DB relazionale è il modo più ragionevole (a volte l'unico modo) per archiviare i dati se potrebbe mai servire direttamente più di una singola applicazione.

    
risposta data 11.09.2014 - 13:36
fonte
0

Considera l'utilizzo di un sistema di controllo della versione distribuito come git.

Crea un repository per gli script di modifica del database e usa un flusso di lavoro come "devi recuperare l'ultimo, unire i tuoi cambiamenti, commettere e spingere e solo dopo aver premuto e visto nessun rifiuto (perché altri lo spingono) dovresti eseguire il tuo script sul server db condiviso attuale. Fino ad allora ogni sviluppatore può avere una copia locale, solitamente ridotta a qualche dato di test.

    
risposta data 11.09.2014 - 14:24
fonte

Leggi altre domande sui tag