guarda, per fare ricerche ricorsive su un albero la tecnica migliore che
io conosco è questa che spiego di seguito. siccome è una cosa un po'
inconsueta, magari
interessa anche altri. ecco la nostra tabella:
create table albero ( id_elemento int not null primary key, left float
unique, right float, id_parent int not null references albero (
id_elemento ) );
il trucco sta nei campi left e right. immaginati, invece di un albero,
delle linee:
-----------------------------------------casa-------------------------------------------
----------piano----------
----------piano---------------------------------
---stnz--- ---stnz-- --stnz-------------- --stnz----- ---stnz--
--soppalco-------
---pelouche---
e adesso (visto che oltretutto sei architetto) misura dal bordo sinistro
del foglio gli estremi di ogni linea e scrivi il valore nel database nei
campi left e right.
metti conto "casa" abbia i margini a 0.5 e 20cm. la query:
select * from albero where left between 0.5 and 20;
ti dà tutti i fligli di casa in una botta sola (e va come le bombe visto
che left è indicizzato implicitamente con "unique").
la rogna è mantenere i campi left e right. devi lasciarti dello spazio
numerico a destra e a sinistra di ogni linea per inserirne eventualmente
di nuove, e
anche con un float8 arrivi in fretta a non avere più posto e devi
"rinumerare" (con un bel lock esclusivo su tutta la tabella). ma visto
che le case non
perdono o acquistano piani e stanze con molta frequenza, non dovresti
avere problemi (se usi questo sistema avrai una ragione in più per
avercela con
i condoni edilizi).
m.
claudio benghi wrote:
Ciao a tutti, è la prima volta che scrivo alla lista (anche se lurko da un po').
sono un architetto e sto organizzando una base dati per archiviare
delle informazioni su diverse tecnologie architettoniche... passo alla
domanda che è in realtà generica e applicabile in moltissime soluzioni
applicative.
Ho una gerarchia di classificazione (credo si dica b-tree, ma ditemi
se sbaglio) dove ad ogni ramo dell'albero sono attaccati dei child che
possono a loro volta averne altri...
Es:
1.Casa
1.1 piano primo
1.1.1 stanza 1
1.1.2 stanza 2
...
1.2 piano secondo
...
ecc. ecc.
questa gerarchia è organizzata in infiniti sottolivelli in una tabella
a tre campi (semplificando)
- id_gerarchia
- nome_gerarchia
- puntatore_padre
qurindi l'esempio di prima (comma delimited) sarebbe (mettiamo):
1,Casa,Null
2,Piano Primo,1
3,Piano Secondo, 1
4,Stanza1, 2
5,Stanza2, 2
ad ogni elemento possono corrispondere n proprietà (in altra tabella)
ad esempio: id_prop
puntatore_gerarchia
proprietà
la casa è rossa: 1,1,rossa
lla stanza 2 è gialla: 2,5,gialla
ora... se io cerco "rossa" nelle prop.... vorrei trovare tutti i figli
della casa...
mi pareva che questa cosa si potesser fare con una join tra le
proprietà ed una tabelle che rappresentasse l'albero "sviluppato"...
ad esempio:
1,1: (la casa ha le proprietà della casa) (scontato)
2,1: (Il primo piano ha le proprità della casa)
3,1: (anche il secondo...)
--- fino a qui è facile... lo ottengo con una semplice join...
ma io vorrei anche sapere che poi 4,1: la stanza uno (dato cha appartiene al primo piano... ha le prop della casa)
5,1: stesso vale per la stanza due...
questo non lo so fare... ci vorrebbe una join ricorsiva... c'e' modo
di ottenerla?
Scusate se sono stato lungo e confuso... non ho ancora toccato il
letto ore 6.51...
maledetti hobby ;-)
Grazie in anticipo
Claudio Benghi
ps... leggo la lista in versione giornaliera, se avete bisogno di
chiedermi dettagli meglio in privato a claudio.benghi@xxxxxxxxx ....
mi occuperò volentieri (se ritenete utilie) di pubblicare in lista
interessanti sviluppi del thread in privato.
_______________________________________________
Postgresql-it mailing list
Postgresql-it@xxxxxxxxxxxxxxxxx
http://www.linuxtime.it/mailman/listinfo/postgresql-it