Hi Esteban,

It seems that I mistook the question for something easy enough for me to 
answer! Unfortunately, I don't have any knowledge of Voyage+MongoDB so can't 
really give the proper answer.

James

On Aug 30, 2013, at 11:13 AM, Esteban A. Maringolo <emaring...@gmail.com> wrote:

> Hi James,
> 
> Thanks for your response. You are right, the Pattern is quite common,
> if not ubiquous in all systems.
> 
> My particular question is related with Voyage+MongoDB, and also could
> apply to Magritte (given the fact Voyage "inherits" its descriptions
> model).
> 
> I sucessfully implemented this pattern with ORMs using an intermediary
> table for the relation, or even reifying the relation as a first class
> object.
> I also used the #select: technique to avoid duplication of
> "responsibility" and caching at one side of the relation.
> But I always did it "in memory" with no mapping et all, just plain old
> smalltalk objects (POSO?) and using ORM solutions.
> 
> What I need to know now is:
> 1) How to do this with voyage+MongoDB
> 2) I want to have a two way relation, it is both members and groups
> have a collection (members know their groups and viceversa). This
> requires additional maintenance, but with a higher performance, and
> doesn't require me to load all groups if I'm just materializing one
> member.
> 
> 
> Regards!
> 
> Esteban A. Maringolo
> 
> 
> 2013/8/30 James Foster <smallt...@jgfoster.net>:
>> Hi Esteban,
>> 
>> What you have described is quite common and there are a variety of ways of 
>> designing this sort of object model. If you were dealing with a relational 
>> database, then you would have a Group table, a Member table, and a 
>> Membership table. The Membership table would have one row for each 
>> member/group pair and the member ID and group ID would be the primary 
>> columns (perhaps with other things like date joined, date expired, etc.). 
>> With an index on the member ID and group ID, one could quickly find all the 
>> groups for a member and all the members for a group, and each piece of data 
>> would exist in only one place ("normalized"). One could take a similar 
>> approach with objects, having three collections containing Groups, Members, 
>> and Memberships respectively. You could have an accessor in Group that 
>> returned members based on a select from the Memberships collection and an 
>> accessor in Member that returned groups based on a select from the 
>> Memberships collection.
>> 
>> Alternatively, if you wanted to avoid the #'select:' call in one or both 
>> lookups, you can cache the respective subcollections in Group and/or Member 
>> and drop the Memberships collection. If you cache in only one place (e.g., 
>> each Group has a collection of Members), then you can add a method in Member 
>> that does a #'select:' of Groups where a Group has the Member. If you cache 
>> in both places then your getters/setters in each can update the other (with 
>> the understanding that you are duplicating data to get performance 
>> efficiency).
>> 
>> Again, this problem is very common. Consider students in classes, persons 
>> with addresses, persons with hobbies, etc. Your choices are basically (1) 
>> three collections, no duplicates, select for both queries; (2) two 
>> collections, no duplicates, cache for one query, select for the other query; 
>> and (3) two collections, caches for each query. Which is preferable depends 
>> on your typical sizes and lookup patterns. If performance is not an issue, 
>> then start with whatever is simplest for you to code. I lean toward the 
>> three collections with the lookup penalty (GemStone's ability to index 
>> collections makes this approach very efficient), but if most of your lookups 
>> are from one side or the other and scanning the full collection is slow, 
>> then cache in one or both places.
>> 
>> If you have a composite, the analysis is similar since Smalltalk does not 
>> require static typing of variables. You just need to take care that your 
>> accessors can give back the expected objects.
>> 
>> James
>> 
>> On Aug 29, 2013, at 6:12 PM, Esteban A. Maringolo <emaring...@gmail.com> 
>> wrote:
>> 
>>> Hi all,
>>> 
>>> Let's say I have a class Group and a class Member.
>>> 
>>> aGroup has many members.
>>> and aMember can belong to many groups.
>>> 
>>> What is the "proper" voyageDescription for those one to many relations?
>>> 
>>> Should I do something extra?
>>> 
>>> Everytime I add a member to the group, both the member and the group
>>> get their references updated.
>>> Now when I add a member to a group and save it, I also save the
>>> member. Is there another way to avoid this?
>>> 
>>> Any recommended practice for this?
>>> 
>>> Next level question: What if it gets composite? it is... a Group has
>>> other Groups as members :)
>>> 
>>> 
>>> Regards!
>>> 
>>> Esteban A. Maringolo
>>> 
>>> 
>> 
>> 
> 
> 


Reply via email to