Domanda

Essere bloccati con uno schema di database legacy che non riflette più il tuo modello di dati è l'incubo di ogni sviluppatore. Tuttavia, con tutto il discorso sul codice di refactoring per manutenibilità, non ho sentito molto di refactoring di schemi di database obsoleti.

Quali sono alcuni suggerimenti su come passare a uno schema migliore senza rompere tutto il codice che si basa su quello vecchio? Proporrò un problema specifico che devo illustrare il mio punto, ma mi sento libero di dare consigli su altre tecniche che si sono dimostrate utili - probabilmente anche quelle torneranno utili.


Il mio esempio:

La mia azienda riceve e spedisce prodotti. Ora una ricevuta del prodotto e una spedizione del prodotto hanno alcuni dati molto diversi ad essi associati, quindi i progettisti del database originale hanno creato una tabella separata per le ricevute e le spedizioni.

Nel mio anno di lavoro con questo sistema sono arrivato alla conclusione che l'attuale schema non ha senso. Dopotutto, sia una ricevuta che una spedizione sono fondamentalmente una transazione, ognuna implica la modifica della quantità di un prodotto, in fondo solo il segno +/- è diverso. In effetti, spesso abbiamo bisogno di trovare la quantità totale che il prodotto è cambiato nel corso di un periodo di tempo, un problema per il quale questo design è assolutamente intrattabile.

Ovviamente la progettazione appropriata sarebbe quella di avere una singola tabella Transazioni con l'ID come chiave esterna di una tabella ReceiptInfo o ShipmentInfo. Sfortunatamente, lo schema sbagliato è già in produzione da alcuni anni e ha centinaia di procedure memorizzate e migliaia di righe di codice cancellate. Come posso quindi trasferire lo schema per funzionare correttamente?

È stato utile?

Soluzione

Ecco un intero catalogo di refactoring di database:

http://databaserefactoring.com/

Altri suggerimenti

Questa è una cosa molto difficile da aggirare; Un paio di opzioni rapide dopo il refactoring del database sono:

  • Crea viste che corrispondono allo schema originale ma estraggono dal nuovo schema; Potresti aver bisogno di trigger qui in modo da poter gestire qualsiasi aggiornamento delle viste.
  • Crea il nuovo schema e metti i trigger su ciascun lato per mantenere l'altro lato.
  • Questo libro (Refactoring Database) è stato inviato da Dio a quando ho a che fare con schemi di database legacy, anche quando dovevo affrontare quasi lo stesso identico problema per il nostro database di inventario.

    Inoltre, avere un sistema in atto per tenere traccia delle modifiche allo schema del database (come una serie di script alter archiviati nel repository di controllo del codice sorgente) aiuta immensamente a capire le dipendenze da codice a database.

    Le procedure e le visualizzazioni memorizzate sono i tuoi amici qui. Anche se il sistema non li utilizza, cambiarlo per usarli, quindi rifattorizzare il database sottostante.

    Le entrate e le spedizioni diventano quindi visualizzazioni.

    Attenzione, le ricevute e le spedizioni sono in realtà due bestie molto diverse nella maggior parte dei sistemi con cui ho lavorato. Le ricevute sono collegate ai fornitori, mentre le spedizioni sono collegate ai clienti (o alle posizioni cliente / spedizione). A livello di inventario, sono spesso rappresentati allo stesso modo.

    L'accesso ai dati è limitato alle procedure memorizzate? In caso contrario, l'attività potrebbe essere quasi impossibile. In tal caso, devi solo assicurarti che i tuoi script di migrazione dei dati funzionino bene passando dal vecchio al nuovo schema, quindi assicurati che le tue procedure memorizzate rispettino gli input e gli output.

    Speriamo che nessuno di loro abbia " seleziona * " interrogazioni. In tal caso, usa 'sp_help tablename' per ottenere l'elenco completo delle colonne, copiarlo e sostituirlo * con l'elenco completo delle colonne, solo per assicurarti di non rompere il codice client.

    Vorrei raccomandare di apportare le modifiche gradualmente e fare molti test di integrazione. È difficile apportare una modifica significativa senza introdurre alcuni bug.

    La prima cosa è creare lo schema della tabella. L'ho già fatto per un database legacy usando Enterprise Architect. È possibile selezionare il DB e verrà creato ogni tabella / campo. Quindi, dovrai dividere tutto in categorie. Esemplare tutti i tuoi prodotti ricevuti e spediti insieme, roba del cliente in un'altra categoria. Una volta che tutto è stato chiarito, sarai in grado di refactificare il campo creando un nuovo tavolo, un nuovo rilascio e nuovi campi. Naturalmente, ciò richiederà molte modifiche se si accede a tutto senza Stored Procedure.

    Non credo sia ovvio che l'id della tabella delle transazioni debba essere una chiave esterna per ReceiptInfo o ShipmentInfo. Pensa al contrario. In un modello orientato agli oggetti è necessario disporre di una tabella delle transazioni e ReceiptInfo o ShipmentInfo devono disporre di una chiave esterna per la tabella delle transazioni. Se sei fortunato, ci saranno solo 1 o 2 punti nel codice in cui vengono creati nuovi record in ReceiptInfo o ShipmentInfo. Lì dovresti aggiungere il codice in cui aggiungi una voce nella tabella Transaction e successivamente creare la voce in ReceiptInfo o ShipmentInfo con la chiave esterna in Transaction.

    A volte puoi creare nuove tabelle con strutture migliori e quindi creare viste con i nomi delle tue vecchie tabelle ma basate sui dati nelle nuove tabelle. In questo modo, il codice non si interrompe mentre inizi a passare a una struttura migliore. Fai attenzione con questo, sebbene a volte passi da una tabella non relazionale a una struttura relazionale in cui hai più record mentre il codice si aspetta solo uno. Ciò è particolarmente vero se si dispone di sviluppatori che utilizzano subquery.

    Quindi, quando ogni cosa viene cambiata, si sposterà dalle viste alla tabella reale. Alla fine è possibile eliminare le visualizzazioni. Questo almeno ti consente di lavorare in modo incrementale per far funzionare le cose mentre sposti le cose, ma iniziare a sistemare le cose per usare un design migliore.

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