Existe cierta falta de precisión en las definiciones de índices primarios y secundarios.
Tomando como referencia dos textos universitarios populares:
Fundamentos de sistemas de bases de datos, Elmasri y Navathe los define como:
Sistemas de bases de datos:el libro completo, García-Molina et. al los define como:
Algunas propiedades que son válidas para cualquiera de las definiciones anteriores:
- las claves primarias pueden ser índices primarios
- puede haber como máximo 1 índice principal por tabla
- los índices primarios determinan de forma única dónde se guarda un registro en el almacenamiento físico.
- Todos los demás índices se clasifican como secundarios.
Sin embargo, si la ubicación de los registros en el archivo de datos no está determinada por ningún campo, entonces no se puede construir un índice primario.
Por lo tanto, para los archivos ordenados, tiene sentido hablar del índice principal (que sería la lista de campos en los que se basa la clasificación). No puedo encontrar otros ejemplos de estructuras de archivos físicos donde se pueda construir un índice principal.
Postgresql utiliza una estructura de montón para el almacenamiento físico de registros. Los montones no están ordenados (alerta de juego de palabras:están ordenados). Por lo tanto, incluso las claves primarias se implementan utilizando índices secundarios y, como tales, todos los índices en Postgresql son secundarios.
Otros sistemas RDBMS hacen implementar formatos de almacenamiento que admitan índices primarios:
- InnoDB de Mysql llama a esto índice agrupado
- MSSQL también hace referencia al índice principal como índice agrupado
- Oracle llama a esto tablas organizadas por índice
El lenguaje en la Documentación de Postgres es impreciso.
Esto es cierto.
Esta no es la razón por la que todos los índices son secundarios en Postgresql. Los índices primarios también se pueden almacenar por separado del área de datos principal de la tabla.