Re: SQL over tree-type database?

From: Tuan Nguyen <tuanito_at_yahoo.com>
Date: Wed, 9 May 2001 01:16:23 +0800
Message-ID: <9d99lt$aq21_at_imsp212.netvigator.com>


I am actually working on something similar. The problem of the solution suggested is that you need to know in advance the depth of the tree in order to create the Level A-B-C... table.

What I have come up with is that the database contains simply the table :

PARENT -> CHILD pairs.

The code is done in C++

For the 1st parent, we look at all the childs. For the 1st generation childs, we look at their childs, then we do the same for the 2nd generation childs etc... until there are no descendants. Each time, we store them in a tree which is a list of list in C++.

Ideally, we would have SQL manage the recursivity. As I know nothing about SQL, I decided to try and do it in C++.

If anybody has a better solution than that, I would be happy to know about it.

Carlos Bromanski wrote in message
<
3af5fe66$0$42879$1dc6e903_at_news.corecomm.net>...
>Here is a very simple example, but perhaps this is what you're talking
>about?
>
>set of tables that hold trees:
>CREATE TABLE LevelA (NodeID int, ItemName char(30) )
>CREATE TABLE LevelB (ParentNodeID int, NodeID int, ItemName char(30) )
>CREATE TABLE LevelC (ParentNodeID int, NodeID int, ItemName char(30) )
>
>data for a couple of trees; also you could insert data from existing
>unnormalized data like yours:
>INSERT INTO LevelA (NodeID, ItemName) VALUES (1, "Blue Widget")
>INSERT INTO LevelA (NodeID, ItemName) VALUES (2, "Red Widget")
>INSERT INTO LevelB (NodeID, ParentNodeID, ItemName) VALUES (1, 1, "Round
>Framitz")
>INSERT INTO LevelB (NodeID, ParentNodeID, ItemName) VALUES (2, 1, "Square
>Framitz")
>INSERT INTO LevelB (NodeID, ParentNodeID, ItemName) VALUES (3, 2, "Plasma
>Framitz")
>INSERT INTO LevelC (NodeID, ParentNodeID, ItemName) VALUES (1, 2, "Framitz
>Paint")
>INSERT INTO LevelC (NodeID, ParentNodeID, ItemName) VALUES (2, 2, "Framitz
>Decals")
>INSERT INTO LevelC (NodeID, ParentNodeID, ItemName) VALUES (3, 3, "Framitz
>Coolant")
>
>a SELECT that spits out the entire tree:
>SELECT LevelA.NodeID, LevelA.ItemName, LevelB.NodeID, LevelB.ItemName,
>LevelC.NodeID, LevelC.ItemName
>FROM LevelA, LevelB, LevelC
>WHERE
> LevelC.ParentID = LevelB.NodeID AND
> LevelB.ParentID = LevelA.NodeID AND
> LevelA.ItemName = "Blue Widget"
>
>- cb
>
>Guennadi V. Liakhovetski <G.Liakhovetski_at_sheffield.ac.uk> wrote in message
>news:Pine.GSO.4.21.0105052140420.4335-100000_at_acms23...
>> Hello
>>
>> Sorry, I am not a specialist in databases, so, perhaps, my question is
>> simple or meaningless... We've got a relational database (PostgreSQL),
>> which is currently VERY redundant. Ok, I know how to reduce the
 redundancy
>> by splitting the table into several smaller (2-column in our
>> case) ones. But, anyway the redundancy would only be decreased, and not
>> removed completely, and building SQL-queries would become more difficult
>> (nested selects, etc.), unless you can create something like a view on
 the
>> top of several tables?... Anyway, the data naturally have tree-structure,
>> so, ideally it should be kept that way (not sure if RDBMSs can perform
>> such optimisation / redundancy removal automatically?), but I still want
>> to be able to use SQL-queries. So, ideally, the data should be stored in
 a
>> tree, but logically be representable as a table with rows spanning all
>> tree-levels... Is this possible? and - if yes - how?
>>
>> Thanks
>> Guennadi
>> ___
>>
>> Dr. Guennadi V. Liakhovetski
>> Department of Applied Mathematics
>> University of Sheffield, U.K.
>> email: G.Liakhovetski_at_sheffield.ac.uk
>>
>>
>
>
>
>
>
>
Received on Tue May 08 2001 - 19:16:23 CEST

Original text of this message