[ZODB-Dev] Re: so your coming from the rdbms world tutorial?

Sean Allen sean at ardishealth.com
Thu Mar 20 23:04:22 EDT 2008


On Feb 27, 2008, at 10:40 AM, Gary Poster wrote:

>> Been over that. Still have serious questions. And yes, we have a  
>> large number of objects, something in the area of 16 million at  
>> present if you were to map each relational table row to an object.
>>
>> The biggest concern I have is how do to the layout/storage so that  
>> this slightly contrived example works:
>>
>> Product has a brand.
>> There are many brands.
>>
>> How do I store so that I can find all products simply and all  
>> brands simply and also so that changes in a brand instance are  
>> reflected when
>> the product instance is deserialized. By 'simply' I mean that it  
>> doesnt really work on our end to have to walk all Products looking
>> for unique brands. Should just be able to go directly in and get  
>> said brands ( using keys() or similar call ).
>>
>> If I create 'brand' and 'product' as btrees, then if i do something  
>> like
>>
>> some_product.brand.name = 'something entirely different'
>>
>> and that brand already exists in 'brand', would it be updated? are  
>> references maintained in that fashion?
>> do we have to handle manually on update and creation?
>>
>> Note that we would just be using ZODB not Zope in this scenario.
>
> Back references are not maintained automatically.
>
> I'd identify two classic solutions to this sort of thing.
>
> One is to make a custom mapping (using a BTree as the inner data  
> structure) that maintains back-references when objects are placed in  
> them or removed.  zope.app(.container? .folder? I'd have to look)  
> has code that does this, along with firing events.  For simple  
> stories like the one you describe here, that's what I'd probably  
> recommend.  It works to the strengths of the ZODB, which  
> particularly shines in terms of readability when you just need to  
> walk a tree of attributes to get what you want.
>
> The other is to keep an external index, a la zc.extrinsicreference  
> or zc.relation.
>
> zc.extrinsicreference does not have too many dependencies beyond  
> ZODB, and as long as zope.app.keyreference doesn't drag much along  
> with it, might be usable as a library.  That said, it's also very  
> simple, and could be used as a model for you, even if you don't use  
> it directly.  It would also be a reasonable choice for a simple  
> situation like the one you describe.  It relies on events to update  
> its data structures.
>
> zc.relation an almost-released-revision of zc.relationship that  
> drastically reduces dependencies--actually, it has no additional  
> dependencies to ZODB, as you can see at http://svn.zope.org/zc.relation/trunk/setup.py?view=markup 
> .  It's also a bit overwhelming and low-level: see the README:http://svn.zope.org/zc.relation/trunk/src/zc/relation/README.txt?view=auto 
>  .  It doesn't hook anything up for you: you set the relationship  
> catalog up and you arrange for it to be updated, via events or  
> direct messages.  That said, if you need its power, it is well- 
> tested and would be a good choice for some jobs from at least some  
> perspectives (caveat read-or: I'm the author).
>
> HTH

I've been playing with this and I'm still having a disconnect 3 week  
later.

1. I love the zc.relation stuff it answers one area of stuff I hadn't  
even gotten to yet.

2. I'm just totally missing something

If I have Customers and Orders and I want to be able update all of  
them independently of their relationships ( so that if an order is  
updated, when i get the customer at some later time, it has the  
updated order amongst that relation ) but I can't figure it out. I  
tried looking at the zope.app.folder stuff but I keep getting lost in  
the zope aspects of it and am having a hard time seeing the forest for  
the trees.

Is there some more general ready on the patterns used that you know  
of? I think if I understood the idea more in an abstract sense, I  
could get a lot more out of the folder implementation.

Thanks for your help,
Sean




More information about the ZODB-Dev mailing list