Legge i dati complessi da un database relazionale attraverso un join o attraverso richieste concorrenti?

1

Considera un semplice database relazionale con due tabelle:

item_index: item_id|item_name
item_property: item_id|property_name

Ogni elemento ha diverse proprietà e desidero ripetere la raccolta di elementi nel mio database. Per questo ho bisogno di scrivere una funzione con la seguente firma, dove database denota il tipo di handle del database:

contents : database -> (item_name * (property_name list)) stream

Questa firma significa che la funzione contents restituisce un flusso di coppie il cui primo membro è il nome dell'elemento e il secondo membro il suo elenco di proprietà.

Ci sono due semplici opzioni per implementare i contenuti:

  1. Allo stesso tempo richiedono il flusso di elementi e il flusso di proprietà dal database, ordinati in modo appropriato e aggregano i dati esaminando i due flussi.

  2. Richiedi lo stream di righe di un join interno, in modo che ogni elemento con le sue proprietà sia rappresentato da più righe, come item_id|item_name|property_name e aggrega gli elementi da questi dati.

Il secondo sembra sovraccaricare il database, a causa del join - probabilmente impacchettato come una vista - mentre il primo è significativamente più difficile da programmare a causa dell'accesso simultaneo al database.

Ho ragione nel pensare che l'implementazione delle funzioni contents che utilizzano richieste simultanee equivale a implementare malamente un'operazione join nell'applicazione? Ciò implicherebbe che il secondo progetto è superiore al primo in quanto porta a una complessità temporale simile e a un codice più semplice.

    
posta Michael Le Barbier Grünewald 06.05.2015 - 11:36
fonte

1 risposta

4

Nel caso generale, è meglio lasciare che il database faccia il lavoro.

La complessità del tempo è in realtà una buona ragione per seguire questo consiglio. A meno che tu non sia fortunato con i tuoi dati, finirai per dover indicizzare una o entrambe le tabelle per assicurarti una ricerca efficiente.

Il tuo database avrà già varie strategie per questo e l'euristica per fare un lavoro decente nel trovare il migliore. si può, a volte, fare meglio a mano (come si può avere più informazioni) ma a meno che non si sappia per certo che è il caso (e lo sarà sempre), è meglio lasciarlo al DB.

Un argomento simile può probabilmente essere fatto per gli aspetti di concorrenza e di smistamento. Consentendo al DB di fare tutto il lavoro, gli stai dando anche maggiori informazioni per ottimizzare il recupero. Ancora una volta, è concepibile che tu ne faccia parte e il DB che ne fa parte è meglio, ma questo dovrebbe essere attentamente testato e sicuramente sbaglierei dalla parte della semplicità.

    
risposta data 06.05.2015 - 12:03
fonte

Leggi altre domande sui tag