Newsgroup: it.lavoro.professioni.webmaster
Titolo: Implementare una struttura gerarchica in un database relazione

Mi sono sempre chiesto se ci fosse una linea guida o un modo specifico 
per implementare una struttura gerarchica, per esempio un albero in una 
database relazionale.
La cosa piï¿œ semplice mi ï¿œ venuta in mente ï¿œ utilizzare una tabella dove 
ogni riga contiene l'id della tupla e l'id del genitore e poi tutti gli 
altri campi dati.
Ovviamente se voglio discendere (o risalire) l'albero questo mi costerï¿œ 
un occhio di query, vista la natura ricorsiva di questo approccio.
C'ï¿œ qualche altro approccio o qualche sistema appositamente pensato per 
questo tipo di gerarchie?


Non ci sono soluzioni davvero standard he io sappia
Oracle ha il connect by prior, mentre postgres implemente questo:
http://www.postgresql.org/docs/8.4/static/queries-with.html
in mysql che io sappia fai molto prima ad andare di query singole e 
costruirti l'albero a livello di programma
M
-- 
I fatti mi cosano

 questo tipo di gerarchie?
In un manuale che ho presentavano un esempio che permetteva di generare
un sistema con un aprofondit� praticamente infinita.
Il trucco era usare blocchi di numeri di tre cifre per definire la
parentela.
Per es. le categorie principali:
uccelli = 001
mammiferi = 002
rettili = 003
ecc
per generare una sub categoria si utilizzava un'altra serie di numeri da
aggiungere ai primi come stringa, quindi:
rapaci = 001
passeriformi = 002
i quali venivano poi inseriti nel Db con questi valori:
rapaci = 001001
passeriformi = 001002
lucertole = 003001
tartarughe = 003001
In questo modo puoi esplodere la parentela a blocchi di tre cifre per
generare la query necessaria a risalire tutto l'albero.
In pratica generi il numero come stringa e lo leggi frazionato come
numero.
Con un paio di funzioni ricorsive puoi costruire un sistema ad albero
funzionale.
Se ho capito bene la tua domanda....
Max
-- 
http://www.maxori.it
L'Arte � la capacit� di fare cose di nessun valore
e di riuscire a venderle
F. Zappa


Le strutture dinamiche ad albero le hanno inventate per qualche motivo no? 
:) In ogni caso per convertire un numero in una stringa prima devi averlo 
come numero; al massimo puoi usare un numero di 3 cifre e lo converti in una 
stringa; ma con un numero di N cifre (3 categorie = 9 cifre) se sfori il 
range consentito... vai in panne :).
Detto questo la gestione delle stringhe richede un calcolo superiore, e 
quindi un tempo di elaborazione superiore; usa le strutture ad albero e 
risolvi il problema nel modo pi� rapido.

un occhio di query, vista la natura ricorsiva di questo approccio.
Non necessariamente. Se mantieni gli ID progressivi, e se ogni nodo sa
quale è il massimo discendente...
1 (10)	- 2 (2)
	- 3 (7)	- 4 (4)
		- 5 (7) - 6 (6)
			- 7 (7)
	- 8 (10) - 9 (9)
		 - 10 (10)
per sapere quali sono gli "antenati" del nodo 7:
	SELECT * FROM tree WHERE id <= 7 AND 7 <= branch ORDER BY id;
	1
	3
	5
	7
per sapere quali sono i discendenti del nodo 8, con branch=10:
	SELECT * FROM tree WHERE 8 <= id AND id <= 10;
Con le funzioni di cursor seek puoi anche avere informazioni del tipo
"qual è l'ID del nonno del nodo corrente".
Altrimenti puoi sempre fare
	SELECT * FROM ( SELECT id ... ORDER BY id DESC LIMIT 3 )
		ORDER BY id LIMIT 1
per avere il "terzo dal fondo". La SELECT esterna costa poco.
Leonardo
-- 
Surstangas via akcipitr', la ceval' fojnumas nur:
Jen vigla damo en brakum', kaj vi pensas pri forkur'?
Do li turnis sin, kaj turnis sin, kaj ekdormis sen singard';
Kaj lin apudis je l' vekigx, soldatoj kaj Barnard'.

 database relazionale.
Ce ne sono diverse (basta cercare su Google). Ma il trend del momento e` 
usare lo strumento giusto per il compito giusto, e nel tuo caso potrebbe 
essere un database gerarchico come OrientDB.
Bye.



Scusami, un database a grafo, non gerarchico.
Un albero e` un caso particolare di grafo. :)
Bye.