TLDR Qual è il valore di un'annotazione della chiave primaria? La chiave primaria indica il modo più rapido per localizzare un record. Come hai menzionato nella tua domanda, la maggior parte delle implementazioni SQL usa la chiave primaria per indicare dove nel file della tabella è archiviato il record. L'utilizzo di un tasto numerico auto-incrementante evita la frammentazione non necessaria del file. (Riduzione delle dimensioni del file e del tempo di scrittura)
Come regola generale, una chiave primaria non dovrebbe avere alcun significato per l'azienda. OSSIA un SSN non deve essere utilizzato come chiave primaria. La ragione di ciò è che le regole aziendali cambiano. Un valore che è "sempre" unico come un SSN di solito ha un'eccezione che viene scoperta lungo la strada ci sono solo un miliardo di possibili combinazioni di 9 cifre ci sono 300 milioni di cittadini in America.
Allo stesso modo anche i valori che saranno "sempre" presenti hanno delle eccezioni. Il nostro sistema di gestione delle risorse umane deve supportare aziende al di fuori dell'America in cui i dipendenti non dispongono di un numero di previdenza sociale
Lo scopo di una chiave primaria è di dare un identificatore immutabile a un'entità in modo che io sappia sempre dove trovare quell'entità. Le chiavi non primarie o gli indici vengono utilizzati per consentire a un utente di cercare facilmente un'entità in possesso della conoscenza di tale attributo.
Pensa alla chiave primaria come a un indirizzo di un blocco di memoria. Se un'altra entità detiene tale indirizzo, ci aspettiamo di essere in grado di passare a quell'indirizzo e trovare l'entità originale.
Modifica
Non tendo a scrivere risposte qui senza sapere di cosa sto parlando. Conosco la differenza tra un surrogato e una chiave primaria. Se vuoi una seconda opinione. Qui vai
You have three choices for defining the primary key for most tables: a 'natural' key, a >system generated or 'internal' key, and (for smaller lookup tables) a mnemonic code.
Internal ID numbers
Rule of thumb: for any table over 100 records, use a system-generated
number as the primary key.
Any time your system stores a record, particularly when the record's
'natural' key ID number is controlled by an outside source, there is a
risk that the outside source may do odd things with its data - it may
re-use the ID number, it may update a record by changing the ID, or
the system may have a problem talking to the outside source and may
get the same record sent twice. In every such case, your system must
not be tightly coupled to the outside source - where "tightly coupled"
means that a problem in the outside source system causes your system
to fail to work correctly.
Therefore, as a form of humility, your system should accept at face
value whatever the outside sources send. The system should not try to
fix other systems, nor modify their data, nor maintain referential
integrity for them. (Your system should do all of those things for its
own internally created data, but not for other systems' data that is
imported.)
When other systems do make corrections to earlier errors, your system
should take the later data at face value and overwrite any earlier
records they sent. In every case, your system should faithfully and
accurately record whatever is sent from other systems.
This approach can only be made to work with system generated ID
numbers. Other keys could be created instead, such as the external
system's primary key plus (say) the date, but this merely tries to
obtain the benefits of humility without acknowledging the work, and
exposes your system to problems if any of the above mentioned problems
were to occur within the course of a single day (when the dates would
be duplicated).
(On an earlier system I tried the external-key-plus-datetime approach,
only to find that duplicates arrived within the same datetime down to
the second -- one second being the finest granularity of an Oracle
datetime.)
Note: this does NOT mean your system allows users to enter bad data.
Data that users enter directly in the system is part of the system's
own data, and therefore it takes responsibility for that data's
cleanliness and accuracy. All data entry screens will provide and
enforce "edits" to ensure the correctness of data entered by users
directly into your system.
Natural Keys
Rule of thumb: don't use natural keys as primary keys; instead, store
them as attributes.
I view 'natural' keys as actually just the keys of an external system
-- even if that external system is the outside world. Generally, natural keys are untrustworthy in the extreme. Here are some examples
of their untrustworthy behavior:
A criminal steals someone's (US Government generated) Social Security
Number (SSN) to commit fraud (now two people have one SSN). Later, the
victim is assigned a new SSN (now one person has had two SSNs at
different times.) A system that used SSNs as a 'natural' key would
have a terrible time with this scenario. A visitor to the US (or an
American child) who has no SSN cannot be tracked by the system, and
essentially doesn't exist.
A supplier re-uses SKUs (Stock Keeping Units), i.e. when a product
becomes obsolete its SKU is reassigned to a new product.
You'll still want to store the supplier SKU -- you just need to be
alert to its potential for misbehavior.
Mnemonic Codes
Rule of thumb: for any table over 100 records, use a system-generated
number as the primary key.
For lookup tables, I like to take advantage of the fact that primary
key values of lookup tables become foreign key values in the tables
that reference them -- and if a code is mnemonic (its meaning is
easily remembered) then often the user doesn't even need to do a join
to know what the key means.