Sadly we use mySQL v4.x which doesn't support subselects.

<!----------------//------
andy matthews
web developer
ICGLink, Inc.
[EMAIL PROTECTED]
615.370.1530 x737
--------------//--------->

-----Original Message-----
From: Barney Boisvert [mailto:[EMAIL PROTECTED]
Sent: Wednesday, February 01, 2006 2:18 PM
To: CF-Talk
Subject: Re: Nested Set Model


Adjacency lists employ a parentID, so every node knows who it's parent
is, but that's it.  Nested sets use a set of numbers (starting at
'left' and ending at 'right', typically) for each node, and the
relationships between the sets dictate hierarchy.

Adjacency list are simple and fast for tree manipulation, but
extracting data can be cumbersome.  There also isn't any way to order
the children of a given node.

Nested sets, on the other hand, are more complex to work with, and
slower for tree manipulation.  However, they are both very fast and
very simple to make complex queries against, once you understand how
they work.  Nested sets also have implicit ordering of ALL nodes, both
hierarchially, and within a given level of the hierarchy.  So with a
nested set you can swap two children of a node, and the tree structure
itself will remember that, without the need for a separate ordering
key.

For example, with your "ancestors" query, using adjacency list, you
have to find the node's parent, if it's not null, find it's parent,
etc., repeating until you reach a node that has a null parent (the
root).  With a nested set, you do this:

SELECT id, name
FROM myTable
WHERE left < (
    SELECT left
    FROM myTable
    WHERE id = #nodeId#
  )
  AND right > (
    SELECT right
    FROM myTable
    WHERE id = #nodeId#
  )
ORDER BY left

That'll return a recordset that contains all the ancestors of the
given node.  Change the  < and > to <= and >= and you'll get the node
itself, and all it's ancestors.  Reverse the < and > and you'll get
decendants of the node.  Etc.

>From what you describe, nested sets is probably better for your
scenario.  You have a relatively static tree hierarchy (compared to
the amount of recall), and the recall you need is very tree-centric.
Consequently you'll probably find things easier with nested sets than
with an adjacency list, and you might get a performance boost out of
it as well.

cheers,
barneyb

On 2/1/06, Mike Little <[EMAIL PROTECTED]> wrote:
> >I'm not sure what you wish to do with this level count, but be careful
> >if you plan on storing it in the original table.  The level count is
> >already stored inherently in the table through its structure
>
> brad, are you saying that i could do without the level column and rely
instead on the query to determine which level each category is on? the
reason i wanted this column was so that i could create breadcrumbs with a
simple query.
>
> also, from the other posts (thanks heaps by the way) is it not necessary
to utilise a parent_id column using nested sets?
>
> my client wishes to be able to move categories to any other category and
also reorder a category within a particular level, so you can imagine i am
all twisted about on this at the moment.
>
> mike

--
Barney Boisvert
[EMAIL PROTECTED]
360.319.6145
http://www.barneyb.com/

Got Gmail? I have 100 invites.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Message: http://www.houseoffusion.com/lists.cfm/link=i:4:231035
Archives: http://www.houseoffusion.com/cf_lists/threads.cfm/4
Subscription: http://www.houseoffusion.com/lists.cfm/link=s:4
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4
Donations & Support: http://www.houseoffusion.com/tiny.cfm/54

Reply via email to