[ZODB-Dev] What the ZODB really does

Martijn Faassen faassen at startifact.com
Tue Jun 3 13:33:10 EDT 2008


Hi there,

The discussion on Gemstone isn't the first time that people seem to 
think the ZODB doesn't do what it actually does. If you have object A 
that points to B, and object C that also points to B, updating B will 
update B truly, and A and C will both aware of this change.

Quite a few smart people seem to be under the impression the ZODB 
doesn't actually take care of this. They believe that B will be 
persisted twice, once for A, once for C. This may be the case if B 
doesn't inherit from Persistent, but if it does, there really will only 
be that instance.

The ZODB is quite transparent that way. It's almost exactly like a pool 
(typically all stored in the same root dictionary) of Python objects. 
They can reference each other just fine. The only requirements I know of 
are:

* if you don't inherit your class from Persistent, or use a python 
builtin (which doesn't inherit from Persistent), things will be 
serialized multiple time, as far as I'm aware. (I may be wrong)

* if you have a non-Persistent subobject (like a list) and you change 
it, you need to manually flag the persistence machinery on the object 
that its subobject changed, with _p_changed. This is *only* necessary if 
some of the objects are not Persistent. For common built-in collections 
in Python such as list and dictionary there are replacements 
(PersistentList, PersistentMapping), and more advanced building blocks 
for indexes (BTrees), that don't have this issue.

Anyway, the misapprehension that the ZODB somehow does less than it does 
seems to be an easy one for people to develop. I think it would be 
important to show on the ZODB home page that this is truly not the case. 
This needs to be repeated early and often.

The *reason* people don't use hard references like this all the time in 
an application is that sometimes you want back references, and sometimes 
you want loose coupling. So that's when things are referenced by a 
string or a lookup or whatnot. Just like you sometimes put Python 
objects in a dictionary with keys. The wide application of such soft 
references seems to give people the impression you can't point the same 
object from tree X and Y at the same time.

Regards,

Martijn



More information about the ZODB-Dev mailing list