Io uso Ruby su binari supportati dal database oracle e memcached per il mio progetto corrente.Architettura di una funzione di scrittura intensiva
C'è una funzione piuttosto pesante utilizzata, che si basa su una singola vista del database come origine dati, e questa origine dati ha internamente altre viste e tabelle di database.
È una vista db virtuale, per poter accedere a tutto da un luogo, non a una vista db materializzata.
Gli utenti la maggior parte delle volte se sono nella funzione che stanno cercando di aggiornare, quindi avere dati aggiornati è importante.
Quando si ottengono dati da questa vista, I inner aggiunge la tabella di sicurezza alla vista (la tabella di sicurezza non fa parte della vista stessa) che contiene alcuni campi che usiamo per controllare l'accesso ai dati a un livello più granulare. Ad esempio, tabella di sicurezza ha colonne user_id, prop_1, prop_2
, dove prop_1, prop_2
sono colonne disponibili in una vista db e user_id
è un utente connesso. Alcuni utenti hanno gli stessi oggetti di scena nella tabella di sicurezza, diciamo prop_1 = 1 and prop_2 = 1
, ma possono anche avere prop_1
come l'altro utente ma hanno diverso prop_1 = 2 and prop_2 = 1
. Esistono molte combinazioni diverse di prop_1 e prop_2, pensandole come FK su un'altra tabella, quindi è possibile avere molte voci.
Ormai il tempo per recuperare i record sull'app è di circa 10 secondi, è piuttosto lento. Sto considerando un approccio alternativo.
La prima cosa che ho pensato era la vista materializzata, ma poiché l'utente fa frequenti aggiornamenti, potrebbe non essere la scelta migliore, poiché l'aggiornamento della vista potrebbe richiedere del tempo.
La seconda cosa che ho pensato è stata la cache, per utilizzare la combinazione prop_1
e prop_2
come chiave composta per i dati sottostanti, poiché molti utenti hanno la stessa combinazione e chiunque abbia la stessa combinazione può accedere agli stessi dati.
Tuttavia, questo approccio potrebbe richiedere più riscritture del codice e logica per salvare e recuperare i dati in frammenti, piuttosto da una posizione con una query come nella vista del database.
Nella tua esperienza, come hai risolto lo stesso problema? O c'è un approccio migliore che potrei provare?
Per quelli di voi che stanno per chiedere, cosa avete provato. Sto pensando prima alla soluzione, raccogliendo informazioni da risorse affidabili e persone più esperte, poi prenderò una decisione informata e inizierò ad attuare. L'implementazione prima, il secondo pensiero, si sono dimostrati così errati così tante volte
tua domanda sembra implicare che l'adesione con la tabella di sicurezza è la ragione di un rallentamento delle prestazioni. Senza quella partecipazione, quanto tempo è necessario per recuperare record simili? –