Re: Avoiding surrogate keys - Mailing list pgsql-general

From Merlin Moncure
Subject Re: Avoiding surrogate keys
Date
Msg-id p2pb42b73151004211218q9a1f0772rb5d53c3f033b555d@mail.gmail.com
Whole thread Raw
In response to Avoiding surrogate keys  (Thom Brown <thombrown@gmail.com>)
Responses Re: Avoiding surrogate keys  ("Joshua D. Drake" <jd@commandprompt.com>)
Re: Avoiding surrogate keys  (Thom Brown <thombrown@gmail.com>)
Re: Avoiding surrogate keys  ("Joshua D. Drake" <jd@commandprompt.com>)
List pgsql-general
On Wed, Apr 21, 2010 at 3:01 PM, Thom Brown <thombrown@gmail.com> wrote:
> I think I know what I plan to do, but want to throw this out there to see if
> there are differing points of view.
> I have a mailing list table, and 2 of the columns contain values which have
> to be from a list.  These are country and status.  There are 237 possible
> countries and 3 possible statuses.  Now I know some people would assign a
> sequence ID (surrogate key) to the country and status values, and have them
> looked up in separate tables to get the textual value, but I think I'll
> still have those tables, just without an ID column, so 1 column for both the
> countries and statuses tables.  This means storing the proper value in the
> main table.
> So instead of
> name, email, country, status
> 'mr smith', 'emailaddress@example.com', 44, 2
> 'mrs jones', 'me@emailcompany.com', 21, 1
> I'd have
> name, email, country, status
> 'mr smith', 'emailaddress@example.com', 'China', 'Registered'
> 'mrs jones', 'me@emailcompany.com', 'Belgium', 'Unconfirmed'
> The values of course would be constrained by foreign key lookup to their
> associated tables.
> Are there any serious downsides to this?  If so, what would you recommend?

Natural keys:
*) force formal relationships into your key design (this is good)
*) Make your database MUCH easier to follow, browse, and understand
*) in particular cases allow you to skip joins
*) will make your indexes fatter (this is not good)
*) can be a pain if your keys are updated frequently
*) can be a major pain if your key changes in structure (adds a field,
or changes in type)

Surrogate keys:
*) Give you faster joins, but more of them (this is a win/loss
depending on circumstances)
*) Tend to encourage lazy/poor designs, since you hide relationships
behind a value
*) Make the tables more difficult to browse and understand
*) Make updates to keys/key structure trivial

I personally use natural keys when I can and surrogates when I have
to.  When I do use a surrogate, I tend to still define the natural key
as primary and simply make a alternate 'unique' constraint for the
surrogate.

merlin

pgsql-general by date:

Previous
From: Rich Shepard
Date:
Subject: Re: Avoiding surrogate keys
Next
From: "Joshua D. Drake"
Date:
Subject: Re: Avoiding surrogate keys