2010-07-27 12 views

risposta

5

È possibile memorizzare una struttura di directory in una singola tabella utilizzando qualsiasi database SQL, rendendo la tabella autoreferenziale. Un buon esempio è il Windows Installer's Directory table, dove si trova una struttura come questa:

  • Directory = primaria campo id chiave, di solito un intero
  • Directory_Parent = "chiave esterna" campo ID, che punta per l'id di un'altra directory nella stessa tabella
  • Valore = stringa contenente il nome della directory/cartelle

La tabella dei file avrà quindi una chiave esterna che fa riferimento all'ID della directory. Per trovare il percorso completo, è necessario seguirlo lungo la catena e costruire il percorso dalla fine (a destra), attaccando la directory principale in avanti (a sinistra). Ad esempio, il file punterebbe a Directory id '4' con il valore 'sottocartella', quindi si recupera il valore 'cartella' del genitore, quindi il valore dei genitori di nuovo fino a raggiungere la radice, creando un percorso come /root/folder/subfolder/filename.

+0

C'è qualche trucco per ridurre il numero di query a meno della profondità del file? – cyang

+1

@cyang Nessuno che conosca per questo metodo di riferimento autoreferenziale. Esistono, naturalmente, altre possibilità di progettazione che sembrano molto diverse: ad esempio, potresti ideare un sistema in cui ogni file abbia un nome complesso totalmente unico, e quindi sarebbe necessaria solo una singola tabella db per memorizzare la directory effettiva posizione ... – ewall

+0

@cyang: è possibile utilizzare questo metodo, ma disporre di un altro campo con gli ID della catena con un delimitatore. Qualcosa come 447: 33: 2: 185 per significare/[cartella447]/[cartella33]/[ecc.]/[Questa cartella]. Quindi è possibile estrarre una determinata cartella e i relativi genitori in due query. Naturalmente, ora si ha il sovraccarico di creare e gestire quel campo quando si crea o si sposta la directory, ma almeno si dovrebbe farlo una volta alla volta. Non lasciare che vada fuori sincrono con i genitori effettivi. E sì, prima che qualcuno impazzisca, si tratta di dati duplicati. Si chiama scorciatoia = o) – Eli

1

È albero semplice memorizzato in sql. Controllare lo schema standard parent-child o implementare lo schema di attraversamento dell'albero preordinato (sinistra-destra).

2

Se il database supporta query ricorsive (sia Oracle che connette da o le espressioni di tabella comuni ricorsive standard), allora una tabella di riferimento automatico va bene (è facile da aggiornare e interrogare).

Se il DBMS non supporta le query gerarchiche, suggerire a Eimantas di utilizzare uno schema di attraversamento dell'albero preordinato è probabilmente il modo migliore.

Problemi correlati