Re: Enforce primary key on every table during dev?

From: Gavin Flower <GavinFlower(at)archidevsys(dot)co(dot)nz>
To: Daevor The Devoted <dollien(at)gmail(dot)com>, Rakesh Kumar <rakeshkumar464(at)aol(dot)com>
Cc: haramrae(at)gmail(dot)com, melvin6925(at)gmail(dot)com, theophilusx(at)gmail(dot)com, finzelj(at)gmail(dot)com, pgsql-general <pgsql-general(at)postgresql(dot)org>
Subject: Re: Enforce primary key on every table during dev?
Date: 2018-03-01 22:05:13
Message-ID: 2580784f-3b8c-d044-3809-b4ca28993175@archidevsys.co.nz
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 02/03/18 06:47, Daevor The Devoted wrote:
>
> On Thu, Mar 1, 2018 at 2:07 PM, Rakesh Kumar <rakeshkumar464(at)aol(dot)com
> <mailto:rakeshkumar464(at)aol(dot)com>> wrote:
>
>
> >Adding a surrogate key to such a table just adds overhead,
> although that could be useful
> >in case specific rows need updating or deleting without also
> modifying the other rows with
> >that same data - normally, only insertions and selections happen
> on such tables though,
> >and updates or deletes are absolutely forbidden - corrections
> happen by inserting rows with
> >an opposite transaction.
>
> I routinely add surrogate keys like serial col to a table already
> having a nice candidate keys
> to make it easy to join tables.  SQL starts looking ungainly when
> you have a 3 col primary
> key and need to join it with child tables.
>
>
> I was always of the opinion that a mandatory surrogate key (as you
> describe) is good practice.
> Sure there may be a unique key according to business logic (which may
> be consist of those "ungainly" multiple columns), but guess what,
> business logic changes, and then you're screwed! So using a primary
> key whose sole purpose is to be a primary key makes perfect sense to me.

I once worked in a data base that had primary keys of at least 4
columns, all character fields, Primary Key could easily exceed 45
characters.  Parent child structure was at least 4 deep.

A child table only needs to know its parent, so there is no logical need
to include its parent and higher tables primary keys, and then have to
add a field to make the composite primary key unique!  So if every table
has int (or long) primary keys, then a child only need a single field to
reference its parent.

Some apparently safe Natural Keys might change unexpectedly.  A few
years aback there was a long thread on Natural versus Surrogate keys -
plenty of examples were using Natural Keys can give grief when they had
to be changed!  I think it best to isolate a database from external
changes as much as is practicable.

Surrogate keys also simply coding, be it in SQL or Java, or whatever
language is flavour of the month.  Also it makes setting up testdata and
debugging easier.

I almost invariably define a Surrogate key when I design tables.

Cheers,
Gavin

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message marcelo 2018-03-01 22:06:43 Re: Enforce primary key on every table during dev?
Previous Message Adrian Klaver 2018-03-01 21:41:26 Re: Enforce primary key on every table during dev?