Prima osservazione; se il sistema verifica ogni volta i plugin presenti, perchè non sfrutti il file system come base dati invece di trasferire in un DB, e poi dal DB effettuare le operazioni. Se invece ritieni che il DB possa essere più veloce nel restituire le informazioni, forse sarebbe opportuno implementare un sistema di caricamento dei plugin, che li posiziona in modo opportuno nel file system e ne carica le informazioni in un DB,oltre ad un sistema di rimozione dei plug che li rimuove dal file system e dal DB, ovviamente dopo aver verificato che il plugin che si tenta di rimuovere non sia dipendenza per un altro ancora attivo.Il sistema verifica ogni volta quali plugin sono presenti all'interno di quella cartella e memorizza nel database le informazioni dei plugin nuovi.Tra le informazioni ci sono appunto il nome del plugin e le sue dipendenze (quindi quello che va ad estendere, se il plugin estende il core non serve specificarlo mentre se estende un altro plugin è obbligatorio specificarlo).
Seconda osservazione;dato che non hai realmente un grafo, anche potendo immaginare che sia tale, ma hai una struttura lineare data dal DB con dei riferimenti ad altri elementi, puoi semplificarti la vita facendo delle chiamate ricorsive. Se vuoi un abbozzo di codice vorrei sapere che informazioni memorizzi nel DB dei plugin e come ottieni il nome file contenente il plugin completo di percorso.