[dba-SQLServer] PK/ANPK Debate

Salakhetdinov Shamil mcp2004 at mail.ru
Mon Mar 10 13:05:53 CDT 2014


 Hi Arthur --

>  I no longer see the point.
You'd better keep "Pandora's box" closed. :)

-- Shamil

Monday, March 10, 2014 8:43 AM -04:00 from Arthur Fuller <fuller.artful at gmail.com>:
>To start off the week, I thought that I would re-open the PK/ANPK debate,
>limiting the discussion to a specific group of tables: lookup tables.
>Consider this example:
>
>SCENARIO 1:
>Table: Volunteers
>PK: VolunteerID (autonumber)
>Columns: Name, Address, etc.
>
>Table: Languages
>PK: LanguageID (autonumber)
>Columns: Language(varchar(20)
>
>Associative Table: VolunteerLanguages
>PK: VolunteerID, LanguageID
>Columns: VolunteerID, LanguageID, and perhaps Profiency
>
>SCENARIO 2:
>Table: Volunteers
>PK: VolunteerID (autonumber)
>Columns: Name, Address, etc.
>
>Table: Languages
>PK: Language
>Columns: Language(varchar(20)
>
>Associative Table: VolunteerLanguages
>PK: VolunteerID, Language
>Columns: VolunteerID(int), Language(varchar(20), and perhaps Profiency
>
>Both scenarios exist to allow the recording of multi-lingual Volunteers.
>The knee-jerk choice is to go with the first scenario, but I am calling
>this into question, on the grounds that it complicates queries, comboBoxes
>etc. unnecessarily. The name of the language is sufficient as a PK in
>itself. No one wants duplicate occurrences of any language name in this
>table.
>
>In the associative table, the second Scenario takes up a little more space.
>But surely in this age when laptops have multi-TB hard disks, this is of no
>real concern. So why complicate queries, combos, listboxes etc. with a
>pointless lookup and additional Join?
>
>The same argument could be applied to many lookup tables, for example
>Countries? Why bother with an ANPK when the official ISO abbreviations
>exist, are easily obtained, and are universally recognized? Perhaps the
>argument is even stronger here, since the ISO codes are char(3)?
>
>In case it isn't clear, I am not arguing for this design in the common
>Customer+Orders+OrderItems situation, but only in the subset of tables
>where there are a small number of rows whose text values must be unique. In
>the past, I have designed this subset according to the first scenario,
>Scenario 1 demands either a unique index on the text column or logic in the
>front end to achieve the same thing. In short, I no longer see the point.
>
>-- 
>Arthur


More information about the dba-SQLServer mailing list