Data Model:

Aaron Brady castironpi at gmail.com
Mon Apr 13 06:36:13 CEST 2009


On Apr 12, 10:33 pm, Anthony <alantho... at gmail.com> wrote:
> On Apr 12, 8:10 pm, Aaron Brady <castiro... at gmail.com> wrote:
>
>
>
> > On Apr 12, 9:14 pm, Anthony <alantho... at gmail.com> wrote:
>
> > > I'm struggling on whether or not to implement GroupItem (below) with
> > > two separate models, or with one model that has a distinguishing key:
>
> > > Given:
> > > class ParentGroup:
> > >     a group of values represented by class GroupItem
>
> > > class ChildGroup:
> > >     a group of values represented by class GroupItem
> > >     foreign-key to ParentGroup (many Children sum to one Parent)
>
> > > Option A:
> > > class GroupItem:
> > >     foreign-key to ParentGroup
> > >     foreign-key to ChildGroup
> > >     GroupItemType in (ParentItem, ChildItem)
> > >     value
> > >     value-type
>
> > > Option B:
> > > class ParentGroupItem
> > >     foreign-key to ParentGroup
> > >     value
> > >     value-type
>
> > > class ChildGroupItem
> > >     foreign-key to ChildGroup
> > >     value
> > >     value-type
>
> > > What are my considerations when making this decision?
>
> > > Thanks!
>
> > You want a ChildItem to have membership in two collections:
> > ParentGroup and ChildGroup.  You also want a ParentItem to have
> > membership in one collection.  For example:
>
> > parentA: itemPA1, itemPA2, childA, childB
> > childA: itemCA1, itemCA2
> > childB: itemCB1, itemCB2
>
> > Or, listing by child,
>
> > itemPA1: parentA
> > itemPA2: parentA
> > itemCA1: childA
> > itemCA2: childA
> > itemCB1: childB
> > itemCB2: childB
> > childA: parentA
> > childB: parentA
>
> > Correct so far?
>
> Thanks for the insightful response.
>
> Yes, everything you say is correct, with one clarification:  The
> ChildItem can be a member of ParentGroup OR ChildGroup, but never both
> at the same time.

I see.  You described a collection class.  Its members are items or
other collections.  They are never nested more than two levels deep.

However, in your example, you implied a collection class whose
attributes are aggregates of its members'.  For simplicity, you can
use methods to compute the aggregate attributes.

class Group:
  def calculate_total_produced( self ):
    total= sum( x.total_produced for x in self.members )

If you want to cache them for performance, the children will have to
notify the parent when one of their attributes changes, which is at
least a little more complicated.  The class in the simpler structure
could even derive from 'set' or other built-in collection if you
want.  Are you interested in the more complicated faster technique?




More information about the Python-list mailing list