Architettare un SaaS per la retrocompatibilità per quanto riguarda i dati e la logica di business

3

Ho una piattaforma SaaS in cui l'utente compila un modulo e i dati inseriti nel modulo vengono salvati in un database. L'interfaccia utente del modulo ha una grande quantità di configurazione (originata dal DB ma finisce in JavaScript) e business logic (in JavaScript). Dopo che un modulo è stato compilato e salvato, l'utente può tornare indietro in qualsiasi momento e modificarlo.

La ruga è che una vecchia voce di modulo deve comportarsi come quando era stata compilata per la prima volta - ha bisogno della stessa configurazione e logica di business - Anche se il SaaS ha attraversato una modifica dello schema dati e modificato la logica di business da poi.

Per confermare, i nuovi moduli compilati dall'utente useranno naturalmente lo schema dei dati nuovo / corrente e la logica aziendale. Ma i moduli precedenti devono comportarsi come quando sono stati creati.

Quindi ho bisogno di un modo ragionevole per configurare la versione, la logica di business e qualsiasi dipendenza.

Il meglio che ho imparato è quando l'utente salva la sua voce, per salvare la configurazione del modulo come JSON insieme alla voce. Quando l'utente torna a modificare una vecchia voce, non carico la configurazione dallo schema del database corrente ma semplicemente scarico la configurazione JSON salvata con la voce.

Per la logica aziendale, salvi un numero di versione del sistema insieme alla voce, ad esempio "01". Quando l'utente carica un vecchio modulo, controllo la versione del modulo e quindi carica il modulo JavaScript da un percorso come "js / main_01.js". Quando apporto una modifica non retrocompatibile alla logica aziendale, aumento il numero di versione del sistema, ad esempio "02". Le nuove forme avrebbero quindi utilizzato "js / main_02.js". Uso anche questo approccio di controllo delle versioni a basso costo per i modelli di visualizzazione HTML che sta diventando sempre più difficile.

Questo approccio funziona ma sembra un po 'fragile o nostrano. Sto cercando di evitare condizionali nella mia logica aziendale come if version==2: do this . Questo approccio evita questo, ma ha anche aspetti negativi.

Non penso che lo stack sia davvero importante per questo convo ma, nel caso, sto usando django / mysql.

    
posta Matt 30.04.2015 - 23:48
fonte

1 risposta

1

Supponendo che tu sia già in questa situazione:

  1. Memorizza la configurazione del modulo in un DB e fa riferimento al numero di versione, piuttosto che serializzarlo ripetutamente su Json.
  2. Non usare condizionali, basta avere coppie html / js completamente separate e punti finali back-end. Potresti dover eseguire una riscrittura interna se desideri che i moduli vengano visualizzati in un unico URL.

Stai affrontando la realtà dei sistemi legacy / long living / non banali. L'idea è di progettare le modifiche per cominciare. Sono quasi certo che puoi refactoring in sanità mentale. Separa il modulo in moduli logici; ognuno di loro inietterebbe il markup necessario, js (beh, la logica di business in js è un altro argomento) e le dipendenze di elaborazione del backend; quindi mescolare e abbinare tramite una semplice configurazione diretta. Se non hai il tempo di tornare indietro e refactoring, inizia con la versione N + 1.

    
risposta data 01.05.2015 - 00:53
fonte

Leggi altre domande sui tag