Qual è il modo migliore per mantenere la sincronicità tra una tabella che ha un elenco di un'altra tabella?

2

Ero solito fare lo sviluppo di Java e con JPA, non devo davvero preoccuparmi della sincronicità tra una tabella e le liste che possiede. Per coloro che non capiscono cosa intendo, ecco un esempio.

Supponiamo di avere una tabella Persona e una tabella indirizzi. Una persona può avere molti indirizzi. Quindi quando aggiorni gli indirizzi della persona e stai usando JPA. Una volta che persisti, la magia accade dietro e tutto viene aggiornato magicamente (gli indirizzi che dovrebbero essere cancellati vengono cancellati e quelli che sono stati aggiornati sono stati aggiornati).

Avanzando rapidamente, sto facendo lo sviluppo di NodeJS e noto che, sebbene stiamo usando flex e alcune librerie interne per aiutare a costruire le query SQL, non posso fare quanto descritto sopra. Attualmente, ci sono 2 modi in cui posso pensare di farlo.

  1. Posso cancellare tutti gli indirizzi che appartengono alla persona e ricrearli. Tuttavia, facendo ciò significa perdere tutti i metadati che potrebbero essere utili per la registrazione.

  2. Ho bisogno di eseguire query aggiuntive sul database per recuperare l'elenco precedente di indirizzi e quindi eseguire un ciclo for per verificare quale address_id deve essere eliminato, aggiornato o creato. Questo non è scalabile se l'elenco diventa troppo grande.

Quindi, a parte i 2 suggerimenti sopra, avete qualche metodo valido? Non riesco a trovare nessun buon adattatore Persistenza per MySQL e NodeJS fino ad ora che non ha troppe dipendenze (npm incubo proprio lì) quindi sarebbe bene se la soluzione potesse essere implementata senza una libreria / framework di terze parti.

    
posta Clara 09.04.2018 - 17:43
fonte

1 risposta

1

Quindi hai Person oggetti, ognuno dei quali contiene un elenco di Address oggetti nel codice dell'applicazione, che rappresentano i record nel database. Basta dare a quest'ultimo un attributo aggiuntivo (non persistente) State con possibili valori

  • New (per i nuovi record da inserire nel DB),
  • Unchanged (per i record che non richiedono un aggiornamento)
  • Changed (per i record da aggiornare)
  • Deleted (per il record da eliminare)

che riflette la differenza tra gli oggetti in memoria e i record del database.

Ora assicurati che questo attributo State sia gestito correttamente dal codice dell'applicazione. Ad esempio, assicurati che tutti gli attributi di un indirizzo siano accessibili solo attraverso i setter, e ogni setter chiama un metodo che cambia lo stato in Changed quando era Unchanged prima. Quindi puoi facilmente scrivere del codice che INSERISCE esattamente i nuovi record, CANCELLA quelli cancellati e UPDATE esattamente quelli che richiedono una modifica.

Se vuoi generalizzare questo e non vuoi introdurre librerie di terze parti, potresti scrivere il tuo micro ORM, o almeno un piccolo generatore di codice, che fornisce questa meccanica per tutti gli oggetti persistenti nel tuo sistema.

    
risposta data 09.04.2018 - 20:24
fonte

Leggi altre domande sui tag