Lo scenario
Ho un progetto ASP classico con un back-end di SQL Server che devo portare su ASP.NET MVC.
Il sito legacy fa un uso liberale dell'analisi della definizione dello schema nell'applicazione stessa. Ad esempio, per eseguire un determinato report e consentire all'utente di fornire un ordinamento, l'applicazione leggerà lo schema e fornirà un elenco di campi basati su quello schema che l'utente può quindi scegliere (hey, NON il mio disegno!)
Questo fornisce uno scenario interessante. La migrazione alla nuova applicazione verrà eseguita per "Strangler Application" coniata da Fowler (costruiremo le funzionalità replicate pezzo per pezzo e lentamente la sposteremo). Tuttavia, insieme a questo ci sono alcuni requisiti per nuove funzionalità, che significano nuovi campi e nuove tabelle. A causa di ciò, sono riluttante ad andare semplicemente a lanciare nuovi campi nei tavoli esistenti, perché non voglio rovinare nulla nell'app legacy. Naturalmente, a causa del percorso di migrazione, dobbiamo essere in grado di utilizzare entrambi i sistemi contemporaneamente per un certo tempo.
Inoltre, la denominazione del database dell'app precedente è abbastanza orribile, compreso qualsiasi numero di parole riservate e caratteri speciali e così via. Inoltre, alcuni nomi di tabelle sono completamente non semantici (ad esempio, la loro tabella "Membri" primaria viene in effetti chiamata dopo il loro primo e principale client da circa 20 anni).
I miei pensieri
Quindi, abbiamo un database, chiamiamolo LegacyDB
Questo non può cambiare. Eppure abbiamo bisogno di aggiungere nuove funzionalità per il nuovo sito. Il mio pensiero era di creare un secondo database, chiamandolo NewDB
. Questo conterrà tutti / tutti i "nuovi" dati. Manterrei una relazione pseudo 1: 1 tra le tabelle in LegacyDB
e "NewDB" nell'ID di ogni tabella.
Ciò che mi piacerebbe fare ora è creare una sorta di database di astrazione su entrambi i quali la nuova applicazione interagirà. Questo riceverebbe una query come SELECT blah FROM dbo.Members WHERE blah = blah
e interrogherebbe sia da LegacyDB
sia dai nuovi campi richiesti da NewDB
. Allo stesso modo, tutte le altre operazioni CRUD contro il db "astrazione" o "facciata" db (per mancanza di un termine migliore) funzionerebbero allo stesso modo. Sto pensando che alcune visualizzazioni accuratamente elaborate potrebbero essere utilizzate per gestirlo.
In questo modo l'app legacy esistente poteva usare LegacyDB
senza dover eseguire alcuna rielaborazione importante in quel pasticcio e la nuova applicazione avrebbe un database con nome ben funzionante e nuova funzione abilitato con cui lavorare senza dover gestire repliche tra due database separati.
Una volta che l'app legacy è stata completamente eliminata, la LegacyDB
e la NewDB
verrebbero unite e teoricamente avranno luogo il db dell'astrazione / facciata senza richiedere modifiche a livello di applicazione.
Essenzialmente quello che sto pensando sono le viste di livello superiore nella facciata db che a loro volta estraggono i dati dai database appropriati. Se l'applicazione invia la seguente query alla facciata:
SELECT Field1, Field2, Field3 FROM ThisTable
La facciata avrebbe ThisTable
definita come una vista:
CREATE VIEW ThisTable AS (
SELECT
a.LegacyField1 AS Field1,
a.LegacyField2 AS Field2,
b.NewField3 AS Field3
FROM legacyDb.dbo.BadTableName AS a
INNER JOIN newDb.dbo.GoodTableName AS b ON a.ID = b.ID
);
(per gli aggiornamenti, non ho ancora elaborato la fattibilità - una delle ragioni che sto chiedendo qui)
Le mie domande
Questa è un'idea sconvolta? Qualcuno l'ha provato? C'è un nome comune per questo approccio (se è anche un approccio comune). C'è qualche riferimento che posso trovare per i pro / contro / gotchyas? Sarei molto grato per una certa esperienza da cui nutrire prima di iniziare l'impresa.