Re: Enforce primary key on every table during dev?

Ron Johnson <ron.l.johnson@cox.net>

From: Ron Johnson <ron.l.johnson@cox.net>
To: pgsql-general@lists.postgresql.org
Date: 2018-03-01T20:24:43Z
Lists: pgsql-general
On 03/01/2018 02:09 PM, Daevor The Devoted wrote:
>
>
> On Thu, Mar 1, 2018 at 9:00 PM, Ron Johnson <ron.l.johnson@cox.net 
> <mailto:ron.l.johnson@cox.net>> wrote:
>
>     On 03/01/2018 12:32 PM, Daevor The Devoted wrote:
>>
>>
>>     On Thu, Mar 1, 2018 at 8:18 PM, Ron Johnson <ron.l.johnson@cox.net
>>     <mailto:ron.l.johnson@cox.net>> wrote:
>>
>>
>>         On 03/01/2018 11:47 AM, Daevor The Devoted wrote:
>>>
>>>         On Thu, Mar 1, 2018 at 2:07 PM, Rakesh Kumar
>>>         <rakeshkumar464@aol.com <mailto:rakeshkumar464@aol.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!
>>
>>         And so you drop the existing index and build a new one.  I've
>>         done it before, and I'll do it again.
>>
>>>         So using a primary key whose sole purpose is to be a primary key
>>>         makes perfect sense to me.
>>
>>         I can't stand synthetic keys.  By their very nature, they're so
>>         purposelessly arbitrary, and allow you to insert garbage into the
>>         table.
>>
>>
>>     Could you perhaps elaborate on how a surrogate key allows one to
>>     insert garbage into the table? I'm afraid I don't quite get what
>>     you're saying.
>
>     If your only unique index is a synthetic key, then you can insert the
>     same "business data" multiple times with different synthetic keys.
>
>
>     -- 
>     Angular momentum makes the world go 'round.
>
>
>
> That might be where we're talking past each other: I do not advocate for 
> the arbitrary primary key being the only unique index. Absolutely not. 
> Whatever the business rules say is unique must also have unique indexes. 
> If it's a business constraint on the data, it must be enforced in the DB 
> (at least, that's how I try to do things).

Why have the overhead of a second unique index?  If it's "ease of joins", 
then I agree with Francisco Olarte and use the business logic keys in your 
joins even though it's a bit of extra work.

-- 
Angular momentum makes the world go 'round.