Search Postgresql Archives

Re: PostgreSQL code for nested sets

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




I'm wondering if anyone has taken the code from
http://www.dbazine.com/tropashko4.shtml and converted it to PostgreSQL?

You can use the contrib/ltree type, which represents a path, and will be easier and faster to use.
http://www.sai.msu.su/~megera/postgres/gist/ltree/


	Create a table with :
		node_id	SERIAL PRIMARY KEY,
		parent_id	INTEGER NULL REFERENCES yourtable( node_id ) ON DELETE CASCADE;
		full_path	ltree NOT NULL

	Create a gist index on ltree
	parent_id IS NULL implies the node is in the root of the tree

Add an ON INSERT/UPDATE TRIGGER which will fill the full_path with the parent's full_path + the node_id

	Then you can use the ltree operators for very efficient querying !

	Example :

folder_id | parent_id |  full_path  |   title
-----------+-----------+-------------+-----------
         1 |           | 1           | root
        10 |         1 | 1.10        | folder 9
       109 |        10 | 1.10.109    | sub 68
       139 |        10 | 1.10.139    | sub 98
        29 |        10 | 1.10.29     | sub 8
       128 |        29 | 1.10.29.128 | sub 87
       158 |        29 | 1.10.29.158 | sub 117
        68 |        29 | 1.10.29.68  | sub 27
        98 |        29 | 1.10.29.98  | sub 57
        49 |        10 | 1.10.49     | sub 8
        79 |        10 | 1.10.79     | sub 38
        11 |         1 | 1.11        | folder 10
       110 |        11 | 1.11.110    | sub 69
       140 |        11 | 1.11.140    | sub 99
        30 |        11 | 1.11.30     | sub 9
       129 |        30 | 1.11.30.129 | sub 88
       159 |        30 | 1.11.30.159 | sub 118
        69 |        30 | 1.11.30.69  | sub 28

	Getting the path to an element :

select folder_id, parent_id, full_path, title from folders WHERE full_path @> '1.10.29.128';
folder_id | parent_id | full_path | title
-----------+-----------+-------------+----------
1 | | 1 | root
10 | 1 | 1.10 | folder 9
29 | 10 | 1.10.29 | sub 8
128 | 29 | 1.10.29.128 | sub 87


	Getting all children from a node (recursively) :

select folder_id, parent_id, full_path, title from folders WHERE full_path <@ '1.10';
folder_id | parent_id | full_path | title
-----------+-----------+-------------+----------
10 | 1 | 1.10 | folder 9
29 | 10 | 1.10.29 | sub 8
49 | 10 | 1.10.49 | sub 8
68 | 29 | 1.10.29.68 | sub 27
79 | 10 | 1.10.79 | sub 38
98 | 29 | 1.10.29.98 | sub 57
109 | 10 | 1.10.109 | sub 68
128 | 29 | 1.10.29.128 | sub 87
139 | 10 | 1.10.139 | sub 98
158 | 29 | 1.10.29.158 | sub 117



Isn't it nice ? Thanks to the gist/ltree team ! This contrib is great.





---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux