20 de septiembre de 2010

¿Qué es una clave?

Articulo original: What is a Key?
http://weblogs.foxite.com/andykramek/archive/2008/09/03/6656.aspx
Autor: Andy Kramek
Traducido al español con autorización del autor por: Luis María Guayán

La palabra "clave" tiene un sentido muy particular en el diseño de bases de datos relacionales. Se refiere a un campo cuyo valor está compartido entre las tablas. El propósito de esta duplicación de datos es permitir un registro en una tabla esté asociado con un registro a otra, lo que permite la extracción de información que está distribuida entre las tablas. Esta asociación se denomina como una "relación" y es lo que diferencia las bases de datos relacionales, de las bases de datos de archivos planos.

Hay dos tipos de claves relacionales:
  • PRIMARIA (PRIMARY) Una clave primaria es la columna, o una combinación de columnas, cuyo valor identifica de forma exclusiva un único registro dentro de una tabla. Ni la clave primaria, ni ninguna parte de ella, puede tener un valor NULO
  • FORANEA (FOREING) Una clave foránea es la columna, o una combinación de columnas en una tabla cuyo valor identifica a un solo (es decir, relacionado) registro de otra tabla. Una clave foránea puede, bajo algunas circunstancias, tener un valor NULO que indica que no hay registros relacionados.
Cuando definimos una relación entre dos tablas, la tabla que contiene la clave primaria es la "Tabla Padre" (también conocida como "tabla de referencia") y la tabla que contiene la clave foránea es la "Tabla Hija" (también conocida como el "tabla referenciada"). Por lo tanto, la clave foránea hace referencia a la primaria, y por ende, define cómo los registros en las tablas están relacionados entre sí.

Es una regla fundamental que todas las tablas deben tener una clave primaria. Esto es evidente si consideramos una tabla que contiene los nombres verdaderos de mis familiares directos que se enumeran a continuación.
Nombre      Apellido
Stanley     Kroset  
Elaine      Kroset  
Andrew      Kroset  
Richard     Kroset  
Angela      Kroset  
Esto está bien y muestra mi padre (Stanley) y mi madre (Elaine), junto con mi hermano menor (Richard) y mi hermana (Angela). La clave primaria de esta tabla es la combinación de nombre-apellido y es perfectamente permitido. Sin embargo, no es un buen diseño, porque cuando mi hermano se casó con una muchacha llamada "Angela" (y sí, realmente así fue) nos encontramos con un problema cuando intentamos agregar a mi nueva cuñada a esta tabla:
Nombre      Apellido
Stanley     Kroset  
Elaine      Kroset  
Andrew      Kroset  
Richard     Kroset  
Angela      Kroset  
Angela      Kroset  
Ahora no tenemos manera de distinguir entre mi hermana y mi cuñada! Esta tabla ya no tiene una clave primaria y en ausencia de cualquier información adicional es realmente inútil. Por supuesto, la solución obvia es añadir algo adicional, diferente, tal vez la "inicial" del segundo nombre, a pesar de que esta no es una buena opción, sobre todo porque no todo el mundo tiene uno, y el valor aún podría no ser único, y en este caso no lo es (el segundo nombre de mi hermano es "Maurice", el de mi hermana es "Mary" y el de mi cuñada es "Margaret").
Nombre      Apellido       Inicial
Stanley     Kroset    
Elaine      Kroset    
Andrew      Kroset         E
Richard     Kroset         M
Angela      Kroset         M
Angela      Kroset         M
El punto de este ejemplo, es que es sumamente importante definir una clave primaria para cada tabla, de forma de que cada registro pueda ser único e identificado inequívocamente. Hasta ahora hemos definido la clave primaria como una combinación de columnas que se utilizan para almacenar los datos. Esto se conoce como una clave "compuesta".