Sono in una situazione in cui non riesco a decidere quale approccio sia il più ottimale (rendimento saggio) pur essendo mantenibile allo stesso tempo (nel senso di avere una logica chiara).
La domanda è posta nel contesto di un'applicazione web Django, ma immagino che si applichi a qualsiasi scenario correlato.
Nel mio scenario stiamo visitando un particolare percorso che mostra molte partite in un campionato o torneo associato a una particolare stagione:
URL: season/<season_id>/
Quota ORM associata Django: season.match_set.all()
Una stagione ha molte divisioni e, ovviamente, le partite sono composte da squadre. Il cliente può filtrare per divisione e / o per squadra. Questi filtri possono anche essere inclusi nell'URL (in modo che gli utenti possano condividerli, già filtrati), ovvero season/<season_id>/#division=<division_name>
, quindi le corrispondenze appartenenti alla divisione specificata vengono filtrate.
Tuttavia, anche quando visiti una rotta che include un filtro, viene eseguita l'intera query: season.match_set.all()
.
Ed ecco ciò di cui non posso decidere. In termini di efficienza, sarebbe meglio semplicemente recuperare le corrispondenze relative a tale divisione:
season.match_set.filter(division=division)
Tuttavia, potrebbe essere piuttosto comune che gli utenti usino i filtri nella pagina, cambino tra loro, ecc. Che, se usiamo il secondo approccio, significherebbe ovviamente richieste aggiuntive che significherebbero anche colpi di database aggiuntivi per recuperare il filtro le partite. Questo non accadrebbe con il primo approccio dato che abbiamo tutti i dati impostati dall'inizio: solo una richiesta e un hit del database (anche se più pesante).
Potremmo provare a ottimizzare il secondo approccio memorizzando i dati filtrati come richiesto; cioè se abbiamo una stagione con tre divisioni e l'utente filtra in base a Division 1
( richiesta 1 ), lo memorizziamo da qualche parte (nella parte client, immagino), quindi se lui / lei filtra per Division 2
( richiesta 2 ) facciamo lo stesso e lo aggiungiamo ai dati esistenti, e infine se l'utente filtra di Division 1
di nuovo lo otteniamo semplicemente dai dati memorizzati e possiamo risparmiarci da eseguendo richiesta 3 .
Tuttavia, temo di avere una logica e un codice chiari come ho detto prima, perché questo ultimo approccio di ottimizzazione può facilmente diventare davvero funky e inaffidabile.
La mia domanda: qual è l'approccio da fare? Questo è uno scenario abbastanza comune quindi immagino ci debba essere un consenso su quale sia l'approccio più efficiente: recuperare tutte le voci del database ed eseguire una sola richiesta o eseguire richieste multiple e query di database e ottenere dati mentre vengono richiesti?