Domanda

In base a leggere tutto il web, overflow dello stack, e per lo più questi articoli riguardanti db versioni che sono stati collegati a Coding horror, ho fatto una pugnalata a scrivere un piano per il controllo delle versioni del database di un vecchio sito web php mysql 8 anni.

Database Version Control plan
- Create a db as the "Master Database"
- Create a table db_version (id, script_name, version_number, author, comment, date_ran)   
- Create baseline script for schema+core data that creates this db from scratch, run this on Master Db
- Create a "test data" script to load any db with working data
- Modifications to the master db are ONLY to be made through the db versioning process
- Ensure everyone developing against the Master Db has a local db created by the baseline script
- Procedures for commiting and updating from the Master Db
    - Master Db Commit
        - Perform a schema diff between your local db and the master db
        - Perform a data diff on core data between your local db and master db
        - If there are changes in either or both cases, combine these changes into an update script
        - Collect the data to be added to a new row in db_version table, and add an insert for this into the script
            - new version number = latest master db version number +1
            - author
            - comment
        - The script must be named as changeScript_V.sql where V is the latest master db version +1
        - Run the script against the master db
        - If the script executed succesfully, add it to the svn repository
        - Add the new db_version record to your local db_version table      
    - Update from Master Db
        - Update your local svn checkout to have all the latest change scripts available
        - compares your local db_version table to the master db_version table to determine which change scripts to run
        - Run the required change scripts in order against your local db, which will also update your local db_version table

La mia prima domanda è, fa questo suono corretto?
La mia seconda domanda è, il commit processo sembra un po 'complicato a fare più di una volta al giorno. C'è un modo per automatizzare in modo affidabile esso? O dovrei non essere commettere base di dati cambia spesso sufficiente per la sua importanza?

È stato utile?

Soluzione

Guardando le vostre proposte, non sembra come qualcosa che è fattibile né pratico. Stavo lavorando in una società in cui abbiamo utilizzato più di 1k tabelle per database (sistema molto complesso), e tutto bene funzionava così:

  • avere una persona responsabile del DB (gli permette di chiamare DBPerson) - ogni cambio script / db deve passare attraverso di lui. Ciò eviterà eventuali modifiche non necessarie, e un po 'si affaccia' dei problemi (per esempio, se qualcuno si muove un indice di svolgere meglio per la sua interrogazione, hi potrebbe distruggere altre persone il lavoro, forse qualcuno sarà creare una tabella che è completamente ridondante e inutile , eccetera...). Ciò manterrà db pulito ed efficiente. Anche se sembra che questo è troppo lavoro per un ragazzo (o suo delegato), in realtà non lo è -. Il db di solito cambia raramente
  • Ogni script deve passare attraverso la convalida DBPerson
  • Quando lo script è stato approvato, il DBPerson assegna un numero e lo mette in 'update' cartella / svn (...), con la numerazione appropriata (come lei ha suggerito, i numeri incrementali per esempio).
  • Avanti, se avete qualche integrazione continua a posto, lo script viene raccolto e gli aggiornamenti del db (se non si dispone di integrazione continua, farlo manualmente).
  • Non conservare intero script di database, con tutti i dati di script. Conservare invece il database effettivo. Se si dispone di filiali della soluzione - avere ogni ramo con un proprio database, oppure si può sempre avere script di aggiornamento suddivisi per ciascuno dei comparti in modo da potreste rollback / ora di un altro ramo. Ma, vi consiglio davvero di avere un DB separato per ogni ramo.
  • Hanno un database sempre con i dati di default (intatto) - per le esigenze di unit test, test di regressione, ecc Ogni volta che fate i test, li fare sulla copia di questo database. Si potrebbe anche mettere una pulizia serale dei database di test con il principale (se del caso, ovviamente).

In un ambiente come questo avrete più versioni di base di dati:

  • sviluppatori di database (locale) - quello che il ragazzo dev sta usando per testare il suo lavoro. Egli può sempre copiare da master o Test master.
  • master database -. Quello con tutti i valori di default, forse semi-vuota se si sta facendo riutilizza a nuovi clienti
  • Prova Master Database - master database pieno di dati di test. Tutti gli script si hanno corse su Master è stato eseguito anche qui.
  • Prova nel database corso - copiato da test Maestro e utilizzato per testare -. Viene sovrascritta prima di ogni nuovo test
  • Se si dispone di filiali (database simile con leggera differenza per ciascuno dei clienti) che dovrete lo stesso come sopra per ogni ramo ...

Sarà certamente necessario apportare modifiche di questo per soddisfare la vostra situazione, ma in ogni caso penso che tenere la versione testuale della sceneggiatura creare per l'intero database è sbagliata in termini di manutenibilità, la fusione, l'aggiornamento, ecc ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top