[ZODB-Dev] Re: Navigating inherently hierarchical data

Tres Seaver tseaver at palladion.com
Fri Aug 3 10:23:22 EDT 2007


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Tommy Li wrote:
> Hi,
> 
> I'm just learning about Object databases, and I stumbled across Zope.
> 
> I'm trying to store data that inherently has a hierarchical (tree) 
> structure. As I have it currently implemented, each object points to 
> another object of the same type by storing the ID of its parent.
> 
> So currently in SQL, to find all the children of object id=4, I'd query:
> 
> SELECT * from TreeNodes WHERE parent=4;
> 
> To find the parent of a given object, obviously, I'd just query (say 3 
> is parent of 4):
> 
> SELECT * from TreeNodes WHERE id=3;
> 
> The tree structure is a very important part of the data and cannot be 
> compromised.
> 
> In the Wikipedia article describing object databases, it mentioned that 
> data access can be faster because related data could be found by 
> following pointers. This makes sense. In the object domain, if I 
> maintain a set of references for the parent and child in each TreeNode, 
> traversal around the tree would be very quick.
> 
> I don't understand how I can use ZODB to do this, however. From what I 
> can gather from reading the manual, if I simply stored variables 
> referring to the parent and children in every TreeNode, I'd end up 
> storing the whole tree of TreeNodes's every time I wanted to store that 
> one TreeNode. (Presumably, because ZODB would follow all the references 
> recursively.)

ZODB breaks reference cycles like that for persistent objects.  You can
store child nodes as attributes of the parents, using Python's dot operator:

  parent = Node('parent')
  parent.one = Node('one')
  parent.two = Node('two')

If the children need backpointers to the parent, you could pass the
parent to their constructor, or set a '__parent__' attribute on them:

  parent.one.__parent__ = parent
  parent.three = ChildNode('three', parent)

In Zope2, we have traditionally *not* set a backpointer, but relied on
the fact that getting the attribute from parent gives us back an
acquisition wrapper, which can then be used to find the parent (via
'aq_parent').  Zope3 has chosen a more explicit model for most objects,
with a '__parent__' reference.

> I suppose I could use the old method of storing only the identifiers of 
> the parents/children. Is there a way ZODB can help me with efficient 
> traversal of persistent objects in a tree structure?

Under the covers, ZODB *does* mutate the objects to store "stubs" for
attributes whire are persistent:  the stub consists of a reference to
the object's class, plus its OID.  When you try to *use* the stub, ZODB
transparently replaces it with an object constructed from the state
stored in the ZODB for that OID.


Tres.
- --
===================================================================
Tres Seaver          +1 540-429-0999          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGszpa+gerLs4ltQ4RAmisAJ0TE1ULOX2/CyKKwAFXdLy1wjtyfgCgtq/+
HAIcchmMLGTaAX7jckWBDXs=
=kXwn
-----END PGP SIGNATURE-----



More information about the ZODB-Dev mailing list