AS
www.asinformatica.net
consulenza e sviluppo software
Le chiavi primarie

Questa pagina contiene una discussione tecnica sulla gestione delle chiavi primarie in un database relazionale.

La chiave primaria, fondamentale per il funzionamento dei db relazionali, è un identificatore univoco, a livello di tabella, di ciascuna riga di cui è composta ognuna delle tabelle che compongono il database.

Esistono casi fortunati in cui la chiave primaria emerge dalla struttura stessa dei dati, e il problema della scelta di essa neppure si pone: il codice fiscale in un'anagrafica (supposto obbligatoriamente presente), il numero di polizza o di sinistro nel sistema informativo di una compagnia di assicurazioni, ecc.

Purtroppo questi non costituiscono la totalità dei casi, e in generale è necessario porsi il problema della scelta e della costruzione di una chiave primaria. Esistono fondamentalmente tre modi.

Il primo si basa sul contenuto del record, e forma la chiave primaria concatenando i valori di più campi. Il vantaggio è che la chiave primaria è intrinseca ai dati e scaturisce naturalmente da essi. Il problema è che è necessario scegliere i campi in modo da generare valori della chiave per i quali la garanzia dell'unicità risulta dalla natura stessa dei dati, e non tutte le tabelle si prestano facilmente a ciò, alcune non si prestano affatto. Inoltre la chiave andrà rigenerata, e il nuovo valore riportato anche nelle tabelle relazionate in cui eventualmente fungesse da chiave esterna, ad ogni modifica dei valori dei campi. La gestione si presenta dunque complessa.

Il secondo utilizza un valore numerico progressivo (contatore), assegnato al momento dell'inserimento del record incrementando il massimo valore già presente. Questa è una soluzione apparentemente semplice, ma in pratica irta di svantaggi e problemi.

Il terzo utilizza una chiave intrinsecamente e globalmente unica (GUID, Globally Unique Identifier, o UUID, Universally Unique Identifier). Si tratta di un intero a 16 byte (128 bit), normalmente espresso in esadecimale nella forma {01234567-89ab-cdef-0123-456789abcdef}, generato con algoritmi che ne garantiscono la virtuale unicità. I principali strumenti di sviluppo e linguaggi mettono a disposizione funzioni apposite, e numerosi database relazionali gestiscono il GUID come tipo di dato specifico (altrimenti è sempre possibile la gestione come stringa).

Il GUID può essere generato e utilizzato senza necessità di accedere al database e ancora prima di scrivere i dati in esso, può quindi ad esempio rappresentare una chiave esterna prima ancora che i dati siano salvati in più tabelle relazionate. Questo significa che è possibile in maniera semplice inserire dati in più tabelle relazionate all'interno di un'unica transazione. Essendo un identificatore universale garantisce il permanere delle relazioni anche nel caso di fusione di più database.

Per finire il GUID è totalmente privo di ogni significato intrinseco, e ciò costituisce un vantaggio, a mio parere. La funzione di una chiave primaria è identificare in maniera univoca e permanente un record in una tabella, non trasportare informazioni. La compresenza di questi due obiettivi prima o poi si rivela fonte di problemi, perché si tratta di finalità tra loro eterogenee e a volte incompatibili.

A questa soluzione va, si sarà capito, la mia preferenza.