Re: [Postgresql-it] Match di elementi in un albero... (lunghino)

  • From: max jacob <max.jacob@xxxxxxxx>
  • To: postgresql-it@xxxxxxxxxxxxxxxxx
  • Date: Mon, 21 Feb 2005 12:10:26 +0100

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





Other related posts: