On Apr 12, 10:33 pm, Anthony <alantho...@gmail.com> wrote: > On Apr 12, 8:10 pm, Aaron Brady <castiro...@gmail.com> wrote: > > > > > On Apr 12, 9:14 pm, Anthony <alantho...@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? -- http://mail.python.org/mailman/listinfo/python-list