Solo per essere contrari, No, NON è necessario avere sempre un PK AutoInc numerico.
Se analizzi attentamente i tuoi dati, spesso identifichi le chiavi naturali nei dati. Questo è spesso il caso in cui i dati hanno un significato intrinseco al business. A volte i PK sono artefatti di sistemi antichi che gli utenti aziendali utilizzano come seconda lingua per descrivere gli attributi del loro sistema. Ad esempio, ho visto i numeri VIN dei veicoli come chiave primaria di una tabella "Veicolo" in un sistema di gestione della flotta.
Tuttavia ha avuto origine, SE hai già un identificatore univoco, usalo. Non creare una seconda chiave primaria priva di significato; è uno spreco e potrebbe causare errori.
A volte è possibile utilizzare un PK AutoInc per generare un valore significativo per il cliente, ad es. Numeri di polizza Impostare il valore iniziale su qualcosa di sensato e applicare regole di business su zeri iniziali, ecc. Questo è probabilmente un approccio "il meglio dei due mondi".
Quando si dispone di un numero ridotto di valori relativamente statici, utilizzare i valori appropriati per l'utente del sistema. Perché usare 1,2,3 quando si può usare L, C, H dove L, H e C rappresentano Vita, Auto e Casa in un contesto di "Tipo di politica" assicurativo, o, ritornando all'esempio VIN, come usare "TO "per la Toyota? Tutte le vetture Toyata hanno un VIN che inizia "TO" È una cosa in meno per gli utenti da ricordare, rende meno probabile che introducano errori di programmazione e degli utenti e potrebbe anche essere un surrogato utilizzabile per una descrizione completa nei report di gestione rendendo i report più semplici scrivere e forse più veloce da generare.
Un ulteriore sviluppo di questo è probabilmente "un ponte troppo lontano" e generalmente non lo raccomando, ma lo includo per completezza e potresti trovarne un buon uso. Cioè, usa la descrizione come chiave primaria. Per i dati che cambiano rapidamente questo è un abominio. Per i molto dati statici riportati su All The Time , forse no. Basta menzionarlo in modo che sia seduto lì come possibilità.
IO uso i PK AutoInc, mi limito a coinvolgere il mio cervello e cercare prima le alternative migliori. L'arte della progettazione di database sta facendo qualcosa di significativo che può essere interrogato rapidamente. Avere troppi join lo impedisce.
EDIT
Un altro caso cruciale in cui non è necessario un PK autogenerato è il caso di tabelle che rappresentano l'intersezione di altre due tabelle. Per attaccare con l'analogia Car, A Car ha 0 .. accessorys, ogni accessorio può essere trovato su molte auto. Quindi per rappresentarlo, crei una tabella Car_Accessory contenente i PK di Car e Accessory e altre informazioni pertinenti sul link Date ecc.
Quello che non serve (di solito) è un PK AutoInc su questo tavolo - sarà accessibile solo tramite l'auto "dimmi quali accessori sono su questa macchina" o dall'accessorio "dimmi che auto hanno questo accessorio "