Non vedo una risposta che indichi (quello che io considero) il punto veramente fondamentale - vale a dire, che una chiave primaria è ciò che garantisce che non avrai due voci nella tabella per la stessa entità del mondo reale (come modellato nel database). Questa osservazione aiuta a stabilire quali sono le buone e quali le cattive scelte per la chiave primaria.
Ad esempio, in una tabella di nomi e codici di stato (USA), il nome o il codice potrebbe essere la chiave primaria: costituiscono due chiavi candidate diverse e una di esse (normalmente la più corta - il codice) viene scelta come chiave primaria. Nella teoria delle dipendenze funzionali (e delle dipendenze unite - da 1NF a 5NF - sono le chiavi candidate che sono cruciali piuttosto che una chiave primaria.
Per un controesempio, i nomi umani generalmente sono una cattiva scelta per la chiave primaria. Ci sono molte persone che si chiamano "John Smith" o altri nomi simili; anche tenendo conto dei secondi nomi (ricorda: non tutti ne hanno uno, ad esempio io no), c'è molto spazio per la duplicazione. Di conseguenza, le persone non usano i nomi come chiavi primarie. Inventano chiavi artificiali come il numero di previdenza sociale (SSN) o il numero del dipendente e le usano per designare l'individuo.
Una chiave primaria ideale è breve, unica, memorabile e naturale. Di queste caratteristiche, l'unicità è obbligatoria; il resto deve flettere dati i vincoli dei dati del mondo reale.
Quando si tratta di determinare la chiave primaria di una data tabella, quindi, devi guardare a cosa rappresenta quella tabella. Quale serie o serie di valori di colonna nella tabella identifica in modo univoco ciascuna riga nella tabella? Quelle sono le chiavi candidate. Ora, se ogni chiave candidata è composta da 4 o 5 colonne, potresti decidere che quelle sono troppo goffe per creare una buona chiave primaria (principalmente per motivi di brevità). In queste circostanze, potresti introdurre una chiave surrogata, un numero generato artificialmente. Molto spesso (ma non sempre) un semplice intero a 32 bit è sufficiente per la chiave surrogata. Quindi designate questa chiave surrogata come chiave primaria.
Tuttavia, devi comunque assicurarti che le altre chiavi candidate (poiché anche la chiave surrogata è una chiave candidata, così come la chiave primaria scelta) siano tutte mantenute come identificatori univoci, normalmente ponendo un vincolo univoco su quei set di colonne.
A volte, le persone trovano difficile identificare ciò che rende unica una riga, ma dovrebbe esserci qualcosa da fare, perché la semplice ripetizione di un'informazione non la rende più vera. E se non stai attento e ottieni due (o più) righe che pretendono di memorizzare le stesse informazioni, e quindi devi aggiornare le informazioni, c'è il pericolo (specialmente se usi i cursori) che aggiorni solo una riga piuttosto che ogni riga, quindi le righe non sono sincronizzate e nessuno sa quale riga contiene le informazioni corrette.
Questa è una visione piuttosto dura, per alcuni aspetti.
Non ho particolari problemi con l'utilizzo di un GUID quando sono necessari, ma tendono ad essere grandi (come 16-64 byte) e vengono utilizzati troppo spesso. Molto spesso è sufficiente un valore di 4 byte perfettamente buono. L'uso di un GUID in cui un valore di 4 byte sarebbe sufficiente spreca spazio su disco e rallenta anche l'accesso indicizzato ai dati poiché ci sono meno valori per pagina di indice, quindi l'indice sarà più profondo e sarà necessario leggere più pagine per arrivare al informazione.