Re: Simple database design question

From: <marks_at_alienmuppet.com>
Date: Tue, 30 Sep 2008 13:16:40 -0700 (PDT)
Message-ID: <69eec4c6-c127-430a-a4f2-a5c125962a86_at_j22g2000hsf.googlegroups.com>


On Sep 30, 9:03 pm, Bob Badour <bbad..._at_pei.sympatico.ca> wrote:
> Mark S. (UK) wrote:
> > Bob Badour wrote:
>
> >>Mark S. (UK) wrote:
>
> >>>Hi all,
> >>>I have 2 tables, "sims" (as in mobile phone sim cards) and "phones" (as
> >>>in mobile phones).  I can add any number of sim cards to the "sims"
> >>>table and any number of mobile phones to the "phones" table.  Simple
> >>>enough.
>
> >>>Rule 1: A sim card can either be in a phone, or not in a phone.  It
> >>>cannot be in more than one phone.
>
> >>>Rule 2: A phone can either have one sim inserted, or no sim inserted.
>
> >>>So the relationship between the phone and sim is 0:1 to 0:1, I think..
>
> >>>There's several ways I could implement this, but the two most obvious to
> >>>me so far are:
>
> >>>### Method 1
>
> >>>SIMS table:
> >>> sim_id
>
> >>>PHONES table:
> >>> phone_id
> >>> phone_sim_id references sims(sim_id)
>
> >>>### Method 2
>
> >>>PHONES table:
> >>> phone_id
>
> >>>SIMS table:
> >>> sim_id
> >>> sim_phone_id references phones(phone_id)
>
> >>>So problem number 1 is, which way round makes more sense?  My first
> >>>instinct was method 1.  It seemed to make sense to say "the phone has
> >>>this sim card", though I suppose you could just as easily turn that on
> >>>its head.
>
> >>Neither of the above handle both 0 cases.
>
> > In method 1, if phone_sim_id is NULL, then is it not related to 0
> > records?  Or am I missing something?
>
> Yes, you are missing a healthy aversion to NULL.

I had the feeling you were going to mention that :-) I have been wrestling with myself on that. For years I had an aversion to NULL. ALL of my fields used to say NOT NULL next to them in my definitions, however it seemed a useful way of saying "this object is not yet associated" ...

As far as I'm aware, there are two alternatives; 1) having a dummy object that unassociated objects are related to... OR having a separate relation table to associate the objects, and without an entry in that relation table, there is no relation. That way, I could get rid of using NULL.

Most of my fields are at least still NOT NULL.

>
>
>
> >>>Problem number 2 is, using either method above can break the rules and
> >>>create an impossible situation.  For example, several phones could
> >>>reference the same sim card in method 1, and several sim cards could
> >>>reference the same phone in method 2.  Would the proper way to ensure
> >>>integrity in this case be to add a "unique" modifier to the reference
> >>>field?  e.g:
>
> >>>phone_sim_id references sims(sim_id) unique
>
> >>>Any advice on the above would be much appreciated.
>
> >>If one thinks about the relations above as predicates instead of as
> >>tables, one naturally creates a much better design than either of the
> >>above.
>
> > So the predicate would be "phone xxxxx uses sim xxxxx"..
>
> > Could you elaborate a little more or maybe direct me at some text that
> > might help?  Or another hint?  I would like to figure it out for myself
> > if I can, but I think I'm mentally stuck in one way of thinking here; I
> > can only think of relating the two items of data either as I've
> > described above or using a dedicated relation table.. or possibly an index.
>
> > How about:
>
> > PHONE:
> >   phone_id
>
> > SIM:
> >   sim_id
>
> > RELATION:
> >   phone_id
> >   sim_id
>
> > unique index on phone_id, sim_id ...
>
> > Am I at least on the right lines?
>
> Only one (compound) candidate key?

Sorry, I have missed out some important information:

PHONE:
  phone_id (PK)

SIM:
  sim_id (PK)

RELATION:
  phone_id
  sim_id

unique index on phone_id, sim_id

So now I've got a couple of primary keys as well as the compound index..

Mark.

--
Received on Tue Sep 30 2008 - 22:16:40 CEST

Original text of this message