Building on what @Jonno said here: Is it more efficient to query once for all settings, or query whenever a setting is needed?
La Q originale va così:
For my blog script I have a usergroup and permission system set up. Each user is assigned to a usergroup and I have a long list of permission settings. Both are stored in a MySQL database.
At the moment I perform around 10 permission queries for each page, for various content management functions. Coupled with another 20 or so queries for general blog use, the number of queries is building up.
I'm wonder if it's the more efficient choice to perform 1 query at the start of the script to add all permission settings to an array, then have all functions compare values in the array instead of checking the database.
Opinions?
E i fatti e le domande?
- Fatto: 1 query è meno di x query. (meno tempo di consumo, meno elaborazione, ecc.)
- Fatto: senza profilazione , stai solo indovinando. Non programma per indovinare.
- Domanda: hai controllato quanto è intenso farlo?
Posso rispondere a quest'ultima. È "No, non ho" e lo so perché se lo avessi, saresti venuto qui con "come faccio a rendere questa architettura più veloce". (Una cosa che i programmatori sembrano non gradire è "ma non l'hai provata prima!?!?!", Quindi tienilo a mente in futuro.)
Se lo fai come la maggior parte delle persone, stai effettivamente eseguendo la query attraverso un altro livello di roba, che richiede molto tempo (in tempo di CPU) per restituire effettivamente i risultati e vuoi che impieghi meno tempo . Potresti provare diverse cose, ad esempio la codifica manuale della query, il che sarebbe di aiuto, ma ridurrebbe la disponibilità dei livelli intermedi che stai già utilizzando.
Ma ciò che è stato suggerito nella risposta di Jonno è stato il modo in cui ti suggerirei di farlo. Crea un'API per le autorizzazioni. Quando si aggiorna un'autorizzazione, lo si fa attraverso questa API e l'API controlla entrambe le sessioni correnti per quell'utente, aggiornandosi quando viene trovato e quindi aggiorna il database. Tiene anche traccia di tutte le impostazioni così modificate e annulla tutto se si verifica un errore. Stato transazione Yay. Certo, il modo ingenuo cerca di aggiornare e ignora qualsiasi errore.
Quindi lo implementeremo in pseudocode, ok?
class sessionByUser{
User user
UpdateValue(key,value){
foreach(session in Sessions){
if (session.user == user)
session.key = value
}
db.updateUserKey(key,value) //what you were doing before
}
}
E puoi vedere quanto immediatamente abbiamo bisogno di implementare il resto delle operazioni crud, ma questo ci fornisce le basi per un aggiornamento in tempo reale dei valori delle sessioni utente.
Come ho detto, questo è totalmente pseudocodice, ma è così che si fa, se non si torna al database ogni volta. FWIW : il database utente Microsoft ASP.NET torna ogni volta al database per verificare se qualcosa è stato aggiornato. Non ha alcun carico notevole sul mio sistema.
Inoltre, questa configurazione funziona anche per altri valori globali. Supponiamo che tu voglia avere un archivio di oggetti globale per tenere traccia di cose come le chiavi API per altri servizi, potresti usare questo stesso concetto di avere un singleton globale con metodi di accesso come questo.