Re: How to represent a tree-structure in a relational database

From: Mathijs Brands <mathijs(at)ilse(dot)nl>
To: Frank Joerdens <frank(at)joerdens(dot)de>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: How to represent a tree-structure in a relational database
Date: 2000-12-13 19:22:24
Message-ID: 20001213202224.C61747@ilse.nl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

On Wed, Dec 13, 2000 at 04:48:47PM +0100, Frank Joerdens allegedly wrote:
> I am just thinking about the data model for a little content management system that I am
> currently planning. Individual articles are sorted under different categories which branch
> into subcategories, sub-subcategories etc. up to a depth of about 6 or 7 levels. The
> structure should be extensible, i.e. it must be possible to add levels. What I am thinking
> now is that you would keep the index in a separate index table (linked with the primary
> key in the articles table), which would have 6 or 7 fields initially, and that you'd add
> columns with the alter table command, if need be, to make the structure deeper. Is this
> the recommended way to go about it? It feels pretty 'right' to me now but since the
> problem should be fairly common, there must be other people who have thought and written
> about it and there might even be a recognized 'optimal' solution to the problem.
>
> Comments?

Yeah. I've built something similar.

The way I've done it:
Give each record a unique ID (generated with a sequence) and store
the records in a table. Create a second table in which you store
parent id-child id combinations.

So:

1 - Automotive transport
2 - Cars
3 - Motorcycles

Store in the table:
1-2
1-3

There's one main category (Automotive transport) which has two sub-categories:
Cars & Motorcyles

The way I'd do it if I had to do it again:
Give each record a unique id, generated by the application. Denote levels with
extra letters.

So:

AA - Automotive transport
AAAA - Cars
AAAB - Motorcycles

The structures has the added bonus of making it very easy to determine all the
sub-categories of a category, no matter how deep the tree is below the category
you're looking at. With the first approach it is not possible to do this in a
single SQL query. You could do this with a function, I guess.

I hope this is of some use to you.

Cheers,

Mathijs
--
"Borrowers of books -- those mutilators of collections, spoilers of the
symmetry of shelves, and creators of odd volumes."
Charles Lamb (1775-1834)

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Jie Liang 2000-12-13 19:27:32 plpgsql
Previous Message Josh Berkus 2000-12-13 19:04:13 Re: How to represent a tree-structure in a relational database