Memorizzazione dei risultati del calcolo nel DB

3

Quello che mi è stato insegnato all'università è che non salviamo i risultati nel database, ma solo i dati grezzi che necessitano del calcolo. Per un esempio di base,

se:

a + b + c = z

salviamo solo a, bec nel database. ogni volta che abbiamo bisogno di z, recuperiamo a, bec dal database e calcoliamo z al livello software.

Immagina se il calcolo è cambiato a un certo punto.

2(a + b) + c = z

Abbiamo ancora i dati grezzi e abbiamo solo bisogno di modificare il calcolo sul software.

E se fosse necessario tenere traccia del calcolo originariamente utilizzato per calcolare z? Possiamo farlo senza salvare il risultato (z in questo caso) nel DB?

    
posta Sherantha 09.04.2018 - 06:25
fonte

2 risposte

3

Sei confuso perché per ogni concetto o principio teorico di programmazione (come "evitare la ridondanza in un database") si può costruire artificialmente una situazione in cui il concetto non si adatta più.

Quello che mancava di insegnarti all'università è introdurre la ridondanza in un database non è male "in generale". È spesso (opposto a sempre ) semplicemente non necessario e sopporta un certo rischio di rendere un sistema soggetto a errori. Tuttavia, a volte tale rischio è giustificato e talvolta è l'unico modo per attuare determinati requisiti.

Per sapere se e come è necessaria la ridondanza in un sistema, è necessario conoscere il caso d'uso reale e comprendere la situazione del mondo reale . E questo è il problema con una domanda come

But what if we need to keep track of which calculation was originally used to calculate z

questo non è un caso di utilizzo reale. È una situazione inventiva che può significare cose diverse in diverse situazioni del mondo reale. Certo, si può "tenere traccia di quale calcolo è stato originariamente utilizzato" : potrebbe significare

  • memorizzando l'intera formula o

  • memorizzare un indice in un elenco di formule o

  • inserendo la formula e il risultato all'esterno del database in un file di registro o

  • è sufficiente memorizzare z in modo ridondante o

  • memorizzando z con un timestamp o con un numero di versione o

  • potrebbe significare fornire diverse versioni dello stesso programma di calcolo in parallelo per la produzione, senza memorizzare altro, o

  • qualcos'altro, dai abbastanza tempo e spazio per ulteriori idee.

Per decidere sul right design si ha bisogno di context per convalidare i requisiti, non solo qualche idea vaga. I casi di uso reale forniscono un tale contesto, quindi fai la tua domanda quando hai una situazione reale a portata di mano, quindi probabilmente puoi rispondere da solo (o descrivi il caso d'uso qui e ottieni una risposta più specifica).

    
risposta data 09.04.2018 - 08:07
fonte
1

La migliore pratica ti impone di concentrarti solo sulla persistenza di ciò di cui hai bisogno, calcolando tutto il resto. Non solo riduce lo spazio sul disco, ma evita errori relativi al permettere dati incoerenti (ad esempio, salvando x = 5, y = 10, x + y = 15, quindi modificando successivamente x 3, rendendo il risultato calcolato in precedenza 15 non più valido). Tuttavia, come @DocBrown menzionato in modo così esplicito, le best practice sono solo una regola empirica, non una regola.

Supponi per un secondo che stai facendo il calcolo del bitcoin e vuoi salvare i tuoi progressi attuali. Il programma è in esecuzione da 5 ore consecutive .. chiaramente non segui le migliori pratiche qui, poiché dovresti ripetere 5 ore di calcolo per arrivare allo stesso punto.

Se la formula stessa potrebbe cambiare, allora è ovvio che anche questo diventa dati, e ancora più importante, sono i dati che hanno bisogno di per calcolare il risultato. Quindi non c'è assolutamente nulla di sbagliato nel salvare la formula oltre ai dati in quel caso.

In ultima analisi spetta a te, il programmatore, determinare se valga la pena di salvare il calcolo e, in questo caso, non è nemmeno una domanda qui perché devi avere la formula per eseguire il calcolo. Anche se in generale, less is more.

    
risposta data 09.04.2018 - 08:41
fonte

Leggi altre domande sui tag