On 2014-03-12 11:59, Attilio Menegon wrote:

Ho capito come si definisce la chiave primaria di una tabella,
viceversa non mi è ben chiaro come funziona l'indice, io abitualmente
in access quando ho bisogno di  una chiave primaria univoca, la
dichiaro come contatore univoco senza duplicati possibili.

La chiave primaria è un dato obbligatorio e distinto per ogni record, che serve a rendere ogni record individuabile, quindi a dare un modo per referenziarlo (in una query o da un'altra tabella). Un contatore è un modo tipico di realizzare una chiave primaria: quando non è chiaro come individuare univocamente ogni record puoi aggiungere un contatore.

L'indice è solo una struttura per ottimizzare l'accesso: puoi avere indici su diversi campi. Grazie ad un indice puoi trovare un record in un tempo o(log(n)) invece che o(n) (la differenza tra cercare un numero di telefono in una rubrica che ha i nomi in ordine alfabetico comparata ad una rubrica che ha i nomi in ordine casuale). Se hai una tabella (nome, numero di telefono) puoi avere un indice sul nome, che ti permette di trovare velocemente il numero di telefono, ma se vuoi puoi creare anche un indice sul numero di telefono, che ti permetterebbe di rispondere velocemente alla domanda "di chi è questo numero?", senza scorrere tutta la tabella.

Visto che la chiave primaria è un modo tipico di accedere ad un record nella tabella è tipico che ci venga definito un indice sopra: in questo modo cercare record per chiave primaria è efficiente. Access lo crea di default, come anche Postgres e penso molti altri database.

Quindi, in quello che access ti propone (contatore+chiave primaria+indice) ci sono tre concetti relativamente indipendenti ma che si aiutano a vicenZa: una chiave primaria ti permette di trovare un record in maniera univoca, un indice di trovarlo in maniera efficiente, un contatore di implementare una chiave primaria in mancanza di meglio. Puoi anche avere chiavi primarie che non siano dei contatori (per esempio in una tabella di valute il codice internazionale EUR, GBP ecc. è ottimo e non serve un contatore). Allo stesso modo, per velocizzare certe query, puoi avere indici su qualunque campo, anche uno che non sia univoco o completo (due vincoli che sono necessari perché un campo possa essere usato come chiave primaria).

-- Daniele

_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a