[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