From: | Oleg Bartunov <oleg(at)sai(dot)msu(dot)su> |
---|---|
To: | Hubert depesz Lubaczewski <depesz(at)depesz(dot)pl> |
Cc: | pgsql-sql(at)postgresql(dot)org |
Subject: | Re: tree structures in sql - my point of view (with request |
Date: | 2002-09-03 18:42:44 |
Message-ID: | Pine.GSO.4.44.0209032141350.10568-100000@ra.sai.msu.su |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
While I don't have a time to comment your message I want to point to
contrib/ltree package which is extremely fast :-)
http://www.sai.msu.su/~megera/postgres/gist/ltree
Oleg
On Tue, 3 Sep 2002, Hubert depesz Lubaczewski wrote:
> hi
> i recently spent some time on tree-structures in sql.
> i started with simple id/parent_id approach, used by nearly everyone,
> then i stopped at joe celko's nested sets, but i found it not very
> usable.
> then i found my own (maybe someone wrote it before, but i haven't read
> it, so idea is mine) way.
> in my way we have two tables:
> create table data (id serial, name text);
> create table structure (parent_id int8, child_id int8, depth int8);
>
> structure table represents all paths in tree.
> for example for this tree:
>
> sql
> / \
> postgresql oracle-----__
> | / | \
> linux sco linux windows
> / \
> glibc1 glibc2
>
> (sorry for used data - it is just template, and personally i don't like
> oracle).
> so, for this tree we would populate the tables this way:
> data:
> id | name
> ----+------------
> 1 | sql
> 2 | postgresql
> 3 | oracle
> 4 | linux
> 5 | sco
> 6 | linux
> 7 | windows
> 8 | glibc1
> 9 | glibc2
>
> structure:
> parent_id | child_id | depth
> -----------+----------+-------
> 1 | 1 | 0
> 2 | 2 | 0
> 3 | 3 | 0
> 4 | 4 | 0
> 5 | 5 | 0
> 6 | 6 | 0
> 7 | 7 | 0
> 8 | 8 | 0
> 9 | 9 | 0
> 1 | 2 | 1
> 1 | 3 | 1
> 1 | 4 | 2
> 2 | 4 | 1
> 1 | 5 | 1
> 1 | 6 | 1
> 1 | 7 | 1
> 3 | 5 | 2
> 3 | 6 | 2
> 3 | 7 | 2
> 1 | 8 | 3
> 1 | 9 | 3
> 3 | 8 | 2
> 3 | 9 | 2
> 6 | 8 | 1
> 6 | 9 | 1
>
> (records with depth 0 are technologically not necessary, but they
> simplify and speedup some queries).
>
> with this data layout (easily indexable) you can fetch any data with
> just one select statement (no recursion needed in any case):
> - fetching parent
> - fetching childs
> - fetching "from id up"
> - fetching "from id down"
> also when you need to get indirect parents/childs or when you need only
> some of the data (from me, up, but not more then to my
> grand-grand-grand-father).
>
> i'd like to get some comments on this - how do you see my idea, is it
> worth it, do you know any better way to store trees in sql?
>
> best regards
>
> depesz
>
>
Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, sci.researcher, hostmaster of AstroNet,
Sternberg Astronomical Institute, Moscow University (Russia)
Internet: oleg(at)sai(dot)msu(dot)su, http://www.sai.msu.su/~megera/
phone: +007(095)939-16-83, +007(095)939-23-83
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Eisentraut | 2002-09-03 18:55:52 | Re: Update Help |
Previous Message | Bruce Momjian | 2002-09-03 18:39:09 | Re: UPDATE & LIMIT together? |