Domanda di progettazione: memorizzazione dei dati due volte

0

Ho una soluzione di database poliglotta che include i seguenti componenti:

  • un'interfaccia di gestione costituita da un'applicazione web e un database basato su documenti (rethinkdb o mongo)
  • un servizio di routing che è un database di archivio di chiavi / valori ... con una semplice API REST che consente la funzionalità CRUD.

Il database di routing viene popolato dall'applicazione di gestione. La mia domanda è questa. Devo memorizzare le informazioni di routing nell'applicazione di gestione e il database del servizio di routing? o solo una volta?

Argomenti per la memorizzazione dei dati due volte:

  • possibilità di ricreare il database di routing se qualcosa dovesse accadere e l'abbiamo perso.
  • quando si tratta di creare report di routing, posso alleggerire il carico sul servizio di routing segnalando l'applicazione di gestione. (il servizio di routing verrà utilizzato molto più dell'applicazione di gestione)

Contro per l'archiviazione due volte (a parte l'ovvio sull'utilizzo di più risorse)

  • può potenzialmente finire con discrepanze tra il database di gestione e il database di routing. Avrà bisogno di avere uno script di qualche tipo per verificare queste discrepanze di volta in volta.

Non sono sicuro di cos'altro aggiungere alla mia lista pro / contro. Se hai commenti, sono tutto orecchie.

    
posta Happydevdays 27.10.2016 - 19:21
fonte

2 risposte

3

Direi store una volta.

Per quanto riguarda i vantaggi che hai elencato sull'archiviazione due volte, non sono sicuro che siano davvero dei benefici. Se mai sono soluzioni per problemi che hanno già soluzioni migliori.

  • Essere in grado di ricreare un database: ecco a cosa servono i backup. Se i tuoi schemi divergono mai perché l'API ha bisogno di qualcosa di più rispetto all'app di gestione, le tue possibilità di una ricreazione di successo diminuiscono considerevolmente (e probabilmente si avvicinano a zero).
  • Ridurre lo stress sull'API - buona idea, ma probabilmente è meglio risolverlo sfruttando i load balancer, il caching e la scalabilità della maggior parte dei database di documenti. Se queste cose possono scalare abbastanza bene, ridimensionarle quando necessario. Non risolvi un problema che non sei sicuro sia effettivamente un problema.

Gli svantaggi di archiviare due volte, IMO, sembrano piuttosto grandi.

  • Affrontare le discrepanze nei dati può essere un enorme problema. Significa molto tempo dedicato allo sviluppatore a capire perché qualcosa che un utente ha appena salvato non funzioni.
  • Continuando con discrepanze, quando qualcosa è rotto, quale sistema è giusto? Quali sono i costi della gestione dell'app (e dei suoi report) che sono sbagliati? Che dire se l'API di routing è sbagliata?
  • Altre dipendenze esterne per la tua app. Ora devi essere preparato ad affrontare la necessità di avere più database non disponibili. Come gestisci quando uno è giù e un altro è attivo? Salvalo in un posto e aggiusta l'altro in un secondo momento? O semplicemente crash e brucia e spero che il database ritorni presto?
  • Tipo di porcellino sul punto precedente, ora hai aggiunto un altro po 'di complessità all'app. Ora avete due database da gestire, uno script esterno o un lavoro che deve essere mantenuto ed eseguito, presumibilmente mantenendo un'altra installazione server / db, ecc.
risposta data 27.10.2016 - 19:57
fonte
0

Memorizza due volte.

L'interfaccia di gestione dovrebbe conservare una cronologia delle modifiche, informazioni di controllo e tutti i metadati extra che non vuoi inquinare il tuo db di routing con

    
risposta data 27.10.2016 - 19:39
fonte

Leggi altre domande sui tag