Ho una caratteristica che sto costruendo che aggrega i dati su circa una dozzina di tavoli. Questi dati vengono aggregati da una query pesantemente unita. In questa pagina sono quindi disponibili molte opzioni di filtro, ordinamento, conteggio e visualizzazione che devono essere utilizzate in aggiunta a questo set di dati aggregati. C'è una condizione / filtro "globale" nella pagina in modo che carichi solo i dati dell'azienda che visualizza la pagina.
Il sito è costruito in Rails usando Postgres come database. Gran parte della funzionalità di filtro è già stata creata utilizzando gli ambiti su un modello ActiveRecord dei dati aggregati.
Sono arrivato ai seguenti modi possibili per risolvere questo problema:
- Esegui l'intera query completa per ogni pagina caricata . Questo non sembra un buon approccio perché l'intera query dovrebbe essere eseguita più volte per cose come diversi conteggi nella pagina
- Utilizza una vista del database (o una vista materializzata) . Funziona molto bene per il filtraggio, l'ordinamento, il conteggio delle esigenze, ma la costruzione della vista è molto lenta dal momento che deve guardare attraverso l'intero set di dati e non può essere portata solo all'account che guarda i dati. Se vado con una vista materializzata, devo aggiornare manualmente la vista in diversi punti logici nell'app.
- Utilizza una tabella temporanea . Ciò sembrerebbe avere tutti i vantaggi di una vista ma caricare abbastanza velocemente poiché la query della tabella temporanea dovrebbe essere limitata alla sola società che visualizza la pagina. Il problema principale è che non ho trovato un buon modo per avere un ActiveRecord supportato da una tabella temporanea (soprattutto perché la query della tabella temporanea ha bisogno del contesto di cui la società sta visualizzando)
- Utilizza una tabella fisica . Questo ha gli stessi vantaggi di una vista del database, tranne l'aggiornamento della tabella dovrebbe essere più veloce poiché il processo di aggiornamento può essere eseguito solo per il set di dati di una specifica azienda.
Ho difficoltà a valutare i pro ei contro di ciascun approccio. C'è qualcosa che mi manca? Qualche altro pro / contro o approccio a questo?