C'è una certa mancanza di precisione nelle definizioni di indici primari e secondari.
Utilizzando due testi universitari popolari come riferimento:
Fondamenti di sistemi di database, Elmasri e Navathe li definisce come:
Sistemi di database:il libro completo, Garcia-Molina et. al li definisce come:
Alcune proprietà che valgono per entrambe le definizioni precedenti:
- le chiavi primarie possono essere indici primari
- può esserci al massimo 1 indice primario per tabella
- Gli indici primari determinano in modo univoco dove viene conservato un record nella memoria fisica.
- Tutti gli altri indici sono classificati come secondari.
Tuttavia, se il posizionamento dei record nel file di dati non è determinato da alcun campo, non è possibile creare un indice primario.
Quindi, per i file ordinati, ha senso parlare dell'indice primario (che sarebbe l'elenco dei campi su cui si basa l'ordinamento). Non riesco a trovare altri esempi di strutture di file fisici in cui è possibile costruire un indice primario.
Postgresql utilizza una struttura heap per l'archiviazione fisica dei record. Gli heap non vengono ordinati (avviso di gioco di parole:sono in un certo senso ordinati). Pertanto, anche le chiavi primarie vengono implementate utilizzando indici secondari e come tali tutti gli indici in Postgresql sono secondari.
Altri sistemi RDBMS lo fanno implementa formati di archiviazione che supportano gli indici primari:
- InnoDB di Mysql chiama questo indice cluster
- MSSQL si riferisce anche all'indice principale come a indice cluster
- Oracle chiama queste tabelle organizzate per indici
La lingua nella documentazione di Postgres è imprecisa.
Questo è vero.
Questo non è il motivo per cui tutti gli indici sono secondari in Postgresql. Gli indici primari possono anche essere memorizzati separatamente dall'area dati principale della tabella.