Aggiorna pagina Web VS compromesso idea di "memorizzazione nella cache" durante la creazione / recupero / aggiornamento / eliminazione (CRUD) dei dati tra app Web e database

1

Design 1: per un'applicazione web. In passato, se inserisco un record / dati nell'interfaccia utente, salverò questi nuovi dati nel database, quindi l'interfaccia utente verrà ricaricata (come facendo clic sull'icona di aggiornamento del browser), ma questa interfaccia utente ricaricata eseguirà nuovamente una query sul database per recuperare tutti i dati nell'interfaccia utente. So che questo rallenterà le prestazioni dell'applicazione web.

Design 2: ora ho sentito questa idea di "cache". Quando eseguiamo l'applicazione web all'inizio, carico tutti i dati che prelevano dal database in una variabile (diciamo "CacheVariable", quindi questa variabile contiene tutti i dati necessari all'intera UI dell'applicazione web). Ora, se inserisco un nuovo record / dati nell'interfaccia utente, avrò ancora bisogno di inserire questo record / dati nel database. Ma ora, invece di ricaricare l'interfaccia utente per ottenere dati aggiornati dal database. Ho appena inserito questi nuovi dati / record in "CacheVariable", quindi la mia UI può ottenere i dati aggiornati senza ricaricare la pagina. Il problema è che ogni volta che eseguo azioni CRUD, devo ricordare di aggiornare "CacheVariable", altrimenti otterrò i bug dell'interfaccia utente. Diciamo che ho 100 campi nell'interfaccia utente, quindi ogni campo ha le sue azioni CRUD. Ho bisogno di fare 400 (100 campi * 4) volte operazioni su 'CacheVariable', che a mio avviso non è un buon modo.

Svantaggi del design 2:

  1. Se ho effettuato il refactoring della mia "CacheVariable", devo anche refactored 400 volte per tutti i CRUD su "CacheVariable".
  2. Poiché ogni campo richiede azioni CRUD su "CacheVariable", a volte mi dimenticherò di farlo, il che causerà un bug dell'interfaccia utente. Sarà anche un'idea soggetta a errori poiché devo fare 400 volte.
posta FullStackDeveloper 04.07.2017 - 04:42
fonte

2 risposte

1

C'è un compromesso che hai identificato correttamente tra design 1 e design 2, quindi la tua decisione ha molto a che fare con questo compromesso. Semplicità contro usabilità.

Il design 2 ha un ulteriore difetto che se qualcun altro fa una richiesta CRUD, gli altri clienti non saranno informati. Il progetto 1 otterrà almeno nuovi dati ogni volta che il client tenta di fare una richiesta CRUD, ma il progetto 2 probabilmente deve essere periodicamente invalidato e aggiornato dal back-end (o fare affidamento sull'utente che riceve l'aggiornamento per ottenere nuovi dati).

Tuttavia, alcune delle tue preoccupazioni riguardo al design 2 possono essere mitigate usando modelli di design. Puoi utilizzare il modello di repository per astrarre le tue chiamate CRUD e, facoltativamente, memorizzare i dati nella cache a livello locale. Usando il modello, non è necessario "caricare tutti i dati che prelevano dal database in una variabile". La tua cache può essere pigra e caricare i dati quando è necessario. Inoltre, è possibile configurare la cache in modo che abbia una scadenza sui dati, quindi recupererà periodicamente gli ultimi dal database. Vedi questo post per una potenziale implementazione in JS .

    
risposta data 04.07.2017 - 04:55
fonte
0

Ho avuto una situazione come la tua. Ma sto usando React e Redux per controllare lo stato della mia applicazione. L'idea che hai descritto "CacheVariable", l'ho implementata con lo stato del mio componente. L'attributo state ha tutte le mie informazioni sull'elenco CRUD (tutte le linee della mia tabella, per esempio). E quando modifico alcuni record e invii l'invio al server e, naturalmente, ricevo la risposta. Spedisco l'aggiornamento di questo stato 'nodo' con le nuove informazioni. Quindi tutti i componenti che hanno firmato questo stato (come la tua variabile) (ps: quando parlo di firmato, puoi pensare a molti ascoltatori che mi hanno detto che quando questo stato è stato aggiornato, invierò il nuovo valore come una trasmissione). E nel mio componente di tabella, ho un'azione che viene attivata con informazioni "broadcast". E questa azione aggiornerà il record della tabella (aggiorna, cancella o inserisci).

In realtà ho postato il dubbio qui, ma ho appena implementato questa idea, e sta funzionando, ora sto aspettando alcune risposte per valutare se posso migliorare l'implementazione.

    
risposta data 17.08.2017 - 23:21
fonte

Leggi altre domande sui tag