La butto lì, poi vedi tu:

Supponi di avere sul tuo server un file di testo chiamato up.txt contenente un numero da 0 a n.
Possiamo distinguere 3 casi:

1)L'utente accede per la prima volta a una pagina
2)L'utente sta già navigando nel sito
3)L'admin ha applicato delle modifiche

Caso 1.
Lo script carica il numerino dal file controlla se lo ha memorizzato in sessione. Se non lo ha lo mette in sessione e carica i dati dal DB riportandoli in sessione.
(Il numerino sarà una sorta di versione dei dati caricati dal DB)

Caso 2.
L'utente visita una pagina successiva alla prima. Legge il solito numerino dal file e se è uguale a quello in sessione prende i dati dalla sessione altrimenti aggiorna il numerino in sessione e ricarica dal DB

Caso 3.
L'admin applica delle modifiche e incrementa il numerino e lo salva nel file. In questo modo alla prossima pagina caricata da qualunque utente il dati vengono ricaricati da DB.

Nel caso specifico del menu uno pseudo codice potrebbe essere
codice:
se(non esiste file up.txt)
    crea file memorizzandoci 0

num=leggi numerino da up.txt

se(esiste sessione[numerino] e sessione[numerino]==num)
    Carica da Sessione il Menu
altrimenti
    sessione[numerino]=num
    Carica da DB il menu mettendolo in Sessione
Ovviamente devi scrive il codice che incrementi il numerino nel file quando l'admin effettua delle operazioni sui dati del menu.

In questo modo puoi mantenere la tua strutture nel DB, pur non interrogando il DB per ricaricare sempre la stessa struttura, che custodirai in sessione. Quando fai delle modifiche i client operativi provvedono a ricaricare la struttura dal DB essendo cambiato il numero di varsione.