14.4.2 Le chiavi e gli indici

Le occorrenze delle singole entità sono rappresentate da record, ovvero sono ennuple di valori corrispondenti ai campi dell’entità e talvolta in letteratura prendono il nome di tuple. I record sono generalmente distinguibili l’uno dall’altro dai valori assunti dai vari campi. Ogni sottoinsieme dei campi di una tabella costituisce una chiave di ricerca dei record. Rifacendosi all’esempio relativo alla gestione di una biblioteca, tra le possibili chiavi di ricerca dei record contenuti nella tabella libro vi saranno quindi:

Sarà quindi possibile effettuare una ricerca dei record per qualunque delle chiavi di ricerca.

L’insieme minimo dei campi che distinguono univocamente i record di una tabella costituisce la chiave primaria della tabella. La chiave primara è quindi univoca: all’interno di una tabella non possono esservi due (o più) record che hanno lo stesso valore della chiave primaria. Nell’esempio della biblioteca, la chiave primaria della tabella Libro può essere costituita semplicemente dal campo Codice, mentre la chiave primaria della tabella Prestito può essere costituita dall’insieme dei campi codice_lettore + codice_libro + data_inizio_prestito;

Dunque, definendo un chiave primaria relativa ad una tabella, il DBMS controllerà, ad ogni richiesta di aggiornamento della tabella, se il record in oggetto può essere effettivemente memorizzato nella tabella, ovvero se l’inserimento del nuovo record o la modifica di uno già presente violeranno l’univocità della chiave primaria. In caso affermativo il DBMS si rifiuterà di effettuare l’operazione richiesta.

Il DBMS è in grado effettuare richerche di record con prestazioni elevate, grazie alla definizione di indici. Un indice è una struttura dati che mantiene organizzati i record secondo un’ordine logico specificato dal creatore dell’indice. Ad esempio, se si desidera mantenere i record della tabella libro ordinati secondo l’ordine alfabetico del cognome e nome dell’autore, si deve creare un indice relativo ai campi Cognome_autore e Nome_autore della tabella libro. In questo modo, per ogni aggiornamento della tabella libro, verranno mantenuti ordinati i riferimenti ai record della tabella, secondo i campi scelti.

L’indicizzazione di una tabella si basa su un riferimento mantenuto ordinato nella tabella considerata all’interno di un’altra struttura dati. In particolare è necessario avere un riferimento, ovvero una chiave, da memorizzare in una struttura dati, tipicamente una tabella gestita automaticamente dal DBMS, che è composta ad esempio da un campo di ordinamento, ad esempio un campo Indice, che viene incrementato ad ogni inseirmento di dati in questa tabella. Ogni volta che la tabella interessata dall’indice viene aggiornata (viene cambiato uno dei campi di un record sui quali si basa l’indice o viene inserito un nuovo record), viene aggiornata anche la tabella relativa all’indice, in maniera tale da mantenere i riferimenti ai record ordinati per i valori dell’indice. Questo meccanismo è oneroso in fase di aggiornamento dei dati, ma risulta utile per effettuare ricerche, poiché consente di sfruttare l’ordinamento dei record.

Esistono varie tecniche di gestione degli indici. Ad esempio si può pensare di creare un file (o tabella) indice nel quale sono memorizzati i riferimenti ai record della tabella in questione in maniera ordinata secondo la chiave desiderata. Inoltre si può pensare, qualora il file indice diventi molto grande, di suddividere il file in n file più piccoli ed indicizzare i file indici stessi. Si viene così a delineare una struttura di indici a più livelli. Si possono anche gestire indici per mezzo di tecniche associative. Ad esempio una chiave univoca può essere utilizzata per generare un codice secondo una funzione hash e tale codice può essere memorizzato in un file, assieme al riferimento al record (una funzione hash è tale per cui genera codici “abbastanza” scorrelati in relazione alla chiave considerata). In questo modo, la ricerca dei record secondo la chiave considerata diventa molto veloce...

[da completare ...]