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 Seaver          +1 540-429-0999          [EMAIL PROTECTED]
Palladion Software   "Excellence by Design"    http://palladion.com
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org


For more information about ZODB, see the ZODB Wiki:

ZODB-Dev mailing list  -  ZODB-Dev@zope.org

Reply via email to