Chiama il database ogni volta o crea un oggetto in memoria e, in caso affermativo, come e quanto spesso aggiornare?

1

Sto creando un'app in javascript / nodejs e usando neo4j come database.

Diciamo che ho un'entità User nel mio database. Ha un sacco di proprietà, come boxes_collected e places_visited , che continuano ad aggiornare indipendentemente l'una dall'altra nel corso dell'esecuzione della mia app.

Finora ho funzioni che parlano al database per aggiornare direttamente queste proprietà. Ma sta diventando un po 'complicato e sto pensando di creare un singolo oggetto / classe di alto livello che gestisca tutto in un modo molto più pulito, bello ed eloquente.

Ecco una piccola versione del mio "modello" per spiegare meglio cosa intendo:

Supponiamo di avere una funzione come questa

function UpdateUserValue_plants(number) {// update database}

Ma se poi dovessi creare un oggetto User e incorporarlo sopra,

var User = function User(plants, other...) {
    this.plants= plants;
}

User.prototype.updateValue_plants = function(number) {
    this.plants += number; // first update the model itself
}

Allora quando dovrei aggiornare il database? E non dovrei fare l'aggiornamento due volte in questo modo: prima la proprietà dell'oggetto, quindi il database?

C'è una soluzione elegante a questo?

    
posta laggingreflex 07.02.2014 - 11:11
fonte

4 risposte

1

Un approccio è quello di trovare un modo per tenere traccia delle modifiche, quindi scaricarle sul database in blocco. Esistono diversi approcci a questo, ma è necessario avere qualcosa che tenga traccia di tutti i valori originali, quindi capire cosa è cambiato, quindi inserirli in inserimenti, aggiornamenti ed eliminazioni.

Martin Fowler chiama l'oggetto che tiene traccia di questa Unità di lavoro. Questo oggetto gestisce CRUD per tutti gli affari oggetti. Dal link, dovrebbe essere chiaro che si utilizza registerNew, registerDirty, registerClean, registerDeleted dai setter delle proprietà e utilizzare rollback o commit quando si è pronti a salvare tutto.

C'è una discussione sui vantaggi e gli svantaggi dei vari dettagli di implementazione in Modelli di Enterprise Application Architecture . Alcune cose a cui pensare sono quanto spesso colpire il database, cosa fare se i clienti sono impegnati in una transazione commerciale più lunga della transazione del database può essere fattibile, e se parlare con la tua unità di lavoro tramite eventi o direttamente.

Questa funzionalità farà parte di ciò che un ORM fa meglio, e se riesci a trovarne uno sarà meglio che scriverne uno. Ma comprendere i concetti sarebbe comunque prezioso.

    
risposta data 19.02.2014 - 00:24
fonte
2

Non c'è un modo semplice per dirti quando la tua applicazione dovrebbe aggiornare il database. Questo è il programma di progettazione e solo tu puoi decidere che.

Tuttavia, per la gestione delle connessioni DB, una cosa è che la maggior parte delle connessioni DB supporta il pooling. Quando si ottiene una connessione solo la prima volta, ci vorrà il passo più costoso per effettuare la connessione, dopodiché, quando lo si rilascia, non verrà immediatamente rimosso ma entrerà in un pool in cui è possibile recuperarlo in un secondo momento, molto rapidamente. Ciò significa che non devi memorizzare una singola connessione DB nel tuo codice come globale o simile da utilizzare, puoi 'creare' una nuova connessione, se necessario.

Potresti voler esaminare un ORM per darti più di una vista dell'oggetto del tuo database che sembra essere quello che stai chiedendo.

    
risposta data 18.02.2014 - 09:37
fonte
2

Dovrai comunque connetterti al server una volta per ogni aggiornamento, quindi non mi preoccuperei molto dell'aggiornamento della proprietà. Dipende dalla tua architettura, ma probabilmente non è meglio che il tuo codice di comunicazione del database si mischi con il tuo codice BL SOC e tutto. Se sei preoccupato di creare più connessioni al database, puoi comunque dipingere gli oggetti memorizzati nella cache dopo che sono stati aggiornati e farli mantenere in un database in un altro momento. Tuttavia, può essere un po 'pazzo trattare con un oggetto memorizzato nella cache e il DB è necessario assicurarsi di sapere cosa è sincronizzato e cosa no.

Mi sento di consigliare come suggerito da @gbjbaanb, esaminando un ORM . Un ORM sta fondamentalmente facendo ciò di cui stai parlando in questo momento, aggiorna un oggetto nel codice quindi persiste i dati nel database al salvataggio.

    
risposta data 18.02.2014 - 10:08
fonte
1

Implementa un ulteriore metodo persist () che conserverà l'oggetto in db e salverà anche l'oggetto nel database in updateValue_plants (). Stai tentando di creare un design link basato sul dominio. Creando un metodo persist () per salvare oggetti e salvando anche in updateValue_plants, sei in un buon modo per farlo.

    
risposta data 19.02.2014 - 22:32
fonte