Índices y claves (keys)

NotaAutor
 

Escrito por Herouth Maoz

NotaNota del Editor
 

Este artículo apareció originalmente en la lista de correo, como respuesta a la pregunta: "¿Cual es la diferencia entre las restricciones PRIMARY KEY y UNIQUE?".

Asunto: Re: [PREGUNTAS] PRIMARY KEY | UNIQUE

        Cual es la diferencia entre:

              PRIMARY KEY(campos,...) y
              UNIQUE (campos,...)

       - ¿Son sinónimos?
       - Si PRIMARY KEY ya indica una clave (key) única, entonces ¿porqué
	 existe otra clase de clave llamada UNIQUE?

Una clave primaria es el campo (o los campos) usado para identificar una fila. Por ejemplo, el número de identificación fiscal de una persona.

Una simple combinación única de campos (UNIQUE) no tiene nada que ver con la identificación de la columna. Es simplemente una restricción de integridad. Por ejemplo, yo tengo una colección de enlaces. Cada colección se identifica por medio de un número único, que es la clave primaria. Esta clave se usa en relaciones.

Sin embargo, mi aplicación exige que cada colección tenga también un nombre único. ¿Porqué? Para que un ser humano que quiera modificar una colección también sea capaz de identificarla. Es mucho mas difícil saber, si se tienen dos colecciones llamadas "Ciencia de la Vida", que la que tiene el número 24433 es la que usted necesita y no la que tiene el número 29882.

De esta forma, el usuario selecciona las colecciones por sus nombres. Por lo tanto nos aseguramos que los nombres sean únicos dentro de la base de datos. Sin embargo ninguna otra tabla en la base de datos se refiere a la tabla de colecciones por su nombre. Eso sería bastante ineficiente.

¡Aún mas, a pesar de ser único, el nombre de la colección no define realmente la colección! Por ejemplo, si alguien decidiera cambiar el nombre de la colección de "Ciencia de la Vida" por "Biología", aún seguiría siendo la misma colección, solo que con un nombre diferente. Mientras el nombre sea único no hay problema.

Resumiendo:

En cuanto a la pregunta de ¿por qué no se definen claves no-únicas explícitamente en la sintaxis estándar de SQL? Pues hay que entender que los índices dependen de la implementación específica. SQL no define la implementación, simplemente las relaciones entre los datos y la base de datos. Postgres acepta índices no-únicos, pero los índices usados como claves SQL son siempre únicos.

De esta forma, puede efectuar búsquedas en una tabla por medio de cualquier combinación de columnas, a pesar de que no tenga un índice en esas columnas. Los no índices son sino una ayuda que cada implementación de un RDBMS le ofrece, para permitir que las búsquedas usadas frecuentemente sean hechas de una forma más eficiente. Algunos RDBMS pueden proporcionarle mecanismos adicionales, tales como el almacenamiento de una clave en la memoria principal. Esos mecanismos tendrán una orden especial, por ejemplo

CREATE MEMSTORE ON <table> COLUMNS <cols>
(ésta no es ninguna orden real, sino un ejemplo).

¡De hecho cuando usted crea una clave primaria o una combinación única de campos, la especificación SQL no dice en ninguna parte que sea creado un índice o que la obtención de los datos por medio de la clave sea más eficiente que una búsqueda secuencial!

Así que si usted quiere usar como clave secundaria una combinación de campos que no es única, no tiene que especificar nada - ¡simplemente comience a obtener datos usando esa combinación! Sin embargo, si quiere que la obtención de los datos sea más eficiente, tendrá que optar por los medios que su RDBMS le proporciona - ya sea un índice, la orden MEMSTORE que inventé como ejemplo, o un RDBMS inteligente que cree índices, sin su conocimiento, basándose en el hecho de que usted ha efectuado varias búsquedas con la misma combinación específica de claves... (Aprende con la experiencia).