in reply to How to implement set-style membership lists in my obejcts

I know it's late in the lifecycle , but I fear you need to get your data modelling right first and then map the entities to objects after that. I would advise producing a Bachman diagram before and after the change (I'll enhance that wiki later today - it looks too bare). Here is some very old documentation but which reasonably illustrates the use of this type of diagram in data modelling http://h71000.www7.hp.com/doc/82final/6393/6393pro_020.html.

Try to reduce your entities to one-to-many relationships, even where they are many-to-many in nature. That is done using a link table. Make sure all entities have primary keys and all child entities have a foreign key per relationship in which they are the many entity. Types (e.g. in your case notice type) are also a parent entity where the notice itself is the child. An entity maps to a concept like type, not just the objects in the real world. When your model is expressible as a connected network of one-to-many relationships then you are ready to translate it into objects. Hope this helps :)

__________________________________________________________________________________

^M Free your mind!

  • Comment on Re: How to implement set-style membership lists in my obejcts

Replies are listed 'Best First'.
Re^2: How to implement set-style membership lists in my obejcts
by clinton (Priest) on May 16, 2007 at 15:11 UTC
    thanks moron

    For clarity, a Notice is eg a Wedding, Birth or Death announcement which appears in a newspaper. This is (an excerpt of) what my DB looks like:

    Table: object (generic object) ------------------------------ id type_id status parent_id creator_id created last_modified Table: notice (adds notice specific fields to the object table) --------------------------------------------------------------- id (1 to 1 relationship with object.id) notice_type (ie wedding, funeral, birth etc) title content etc Table: charity (adds charity specific fields to the object table) ----------------------------------------------------------------- id (1 to 1 relationship with object.id) name description url etc

    The editor of a notice can choose a number of charities to link to, so a notice can have many charities. This is stored in the members table:

    Table: members (link table) ---------------------------- set_id (in this example, the notice ID) member_id (in this example, the charity ID)

    Notices can have many Comments, Images, Charities, Editors. So my question really boiled down to, should I have

    • separate List/Set/Container objects for each list of items, so that you create a new ImageList, which is a child (not a subclass) of the Notice, and the members.set_id == ImageList.id
    • or set_id == notice.id, and then you filter the set members you want by object type (ie image/comment etc)

    After discussion in the CB with bart and castaway, I think i've abandoned both of those, and now what I'm going to do is the following:

    • A Set does not live in the database as an object, neither does Notice inherit from the Set
    • Instead, I can create a Set object as follows:
      $set = Set->new({ set_id => $notice->id, name => 'imagelist', # combined with set_id to provide + an ID for caching selectors => { type => 'image' }, });
      ... which is really just a glorified array, with methods to check membership, and to add / delete members from the list, almost like an SQL view.
      Technically your 1:1 are really 1 to many because 1:(0or1) is implemented in practice as a 1 to many inthat order. The set/notice is in theory a many-to-many which is more normally implemented as member -< member-notice >- notice with member-notice as the link table, so that the "set" is really a view on member-notice for a given notice.

      What I'd be doing about sets is making a container object "set" that requires an instance variable to have a particular notice filled in so it can go retrieve all member-notice pairs for that notice, thereby populating the container class.

      __________________________________________________________________________________

      ^M Free your mind!

        I understand your second para, and yes, that is what I'm doing.

        But would you mind explaining your first para? Why is the 1:1 actually 1 to many? Are you refering to the Object/Notice join, or to the Members table? I realise it is a many-to-many relationship, with a link table giving you many-to-one and one-to-many for notice and charity respectively. Is that what you're talking about?

        I'm not familiar with the terminology, which is probably why I'm missing something here (eg 1::Oor1).

        thanks moron

        clint