Personally I always set the natural key with a not null and unique
constraint, but create an artificial key for it as well.  As an example, if
we had a product table, the product_sku is defined as not null with a
unique constraint on it, while product_id is the primary key which all
other tables reference as a foreign key.

In the case of a many to many situation, I prefer to use a two column
composite key.  In the case of a many to many, i've never run into a case
where I needed to reference a single row in that table without knowing
about both sides of that relation.

Just my $0.02
-Adam

On Tue, Aug 25, 2015 at 12:15 PM, David G. Johnston <
david.g.johns...@gmail.com> wrote:

> On Tue, Aug 25, 2015 at 11:40 AM, Melvin Davidson <melvin6...@gmail.com>
> wrote:
>
>> Consider:
>> SELECT c.registration_no,
>>        c.car_make,
>>        p.part_no
>>    FROM car c
>>    JOIN parts p ON ( p.registration_no = c.registration_no)
>>  WHERE registration_no = <some_var>;
>>
>>  versus:
>>  SELECT c.registration_no,
>>        c.car_make,
>>        p.part_no
>>    FROM car c
>>    JOIN parts p ON ( p.id = c.id)
>>  WHERE registration_no = <some_var>;
>>
>>  Why join on id when registration_no is better?
>>
>>
> ​I believe you are mistaken if you think there are absolute rules you can
> cling to here.  But even then I would lean toward calling primary keys an
> internal implementation detail that should be under the full control of the
> database in which they are directly used.  Artifical "natural" keys I would
> lean toward turning into, possibly unique, attributes.  Inherent "natural"​
>
> ​keys get some consideration for using directly.
>
> The issue arise more, say, in a many-to-many situation.  Do you define the
> PK of the linking table as a two-column composite key or do you introduce
> ​a third, serial, field to stand in for the pair?
>
> David J.
>
>

Reply via email to