Anuncios en tutorial de programación PLSQL

martes, 28 de noviembre de 2023

Tablas Oracle: Claves naturales o claves sustitutivas

En algunas ocasiones me he encontrado con bases de datos en las que se aplica la norma de, a la hora de diseñar una tabla nueva, utilizar siempre una clave sustitutiva (surrogate key) , incluso existiendo una clave natural perfectamente aplicable. Cuando he preguntado por el motivo de crear tales claves sustitutivas, la razón ha sido casi siempre la de aumentar la eficiencia de la base de datos eliminando la posibilidad de tener que enlazar dos tablas utilizando más de una columna.

Claves alternativas y naturales

Primero aclararé, para aquellos que no lo tengan claro, el concepto de clave sustitutiva o surrogate key. Una clave sustitutiva no es más que una clave interna, un identificador único, que no tiene significado para el negocio, y que identifica de forma única un registro de una tabla de la base de datos.

En mi opinión, si al definir una tabla disponemos de una clave natural, que obviamente debe ser única e inmutable, debemos utilizarla en detrimento de la clave sustitutiva. El argumento de que la utilización de claves sustitutivas va a mejorar el rendimiento de la base de datos es erróneo, y las claves naturales hacen más sencilla la escritura de nuestras consultas SQL o del código PL/SQL.

Por ejemplo, si disponemos de un par de tablas, la tabla PRODUCTOS y la tabla VERSION_PRODUCTOS, lo lógico sería utilizar para la primera tabla un campo producto_id como clave primaria (primary key) , campo que podría tratarse de una clave sustitutiva poblada por una secuencia, y usar como clave primaria de la segunda tabla una combinación de producto_id y de numero_version. Las tablas podrían definirse como sigue:

CREATE TABLE productos
( producto_id NUMBER PRIMARY KEY,
  otros_datos... );

CREATE TABLE version_productos
( producto_id REFERENCES productos,
  numero_version NUMBER,
  otros_datos...
CONSTRAINT ver_pro_pk PRIMARY KEY 
(producto_id, numero_version));

En nuestro ejemplo, el uso de una clave sustitutiva añadiría un trabajo extra a cualquier operación de INSERT que debería generar la clave sustitutiva, además de hacer lo propio para la clave natural. Mi opinión es que si la clave natural es inmutable y razonable, entonces debemos utilizarla. En este caso concreto, con razonable quiero significar que la clave no necesite utilizar quince campos para ser generada, sino que sólo hagan falta de dos a cinco columnas.

2 comentarios:

Unknown dijo...

Desafortunadamente no siempre es fácil garantizar la inmutabilidad de un dato, verbigracia el número de documento de identidad es una clave natural para la identificación de personas, si embargo errores en la digitación o en el peor de los casos errores de la entidad que expide el documento hacen necesario actualizar este dato. Si la tabla de personas tiene muchas relaciones foráneas la actualización del documento de identidad se hace muy engorrosa.

Gabolo dijo...

Las ventajas principales de utilizar siempre una clave primaria secuencial que no signifique nada son:
1º Unificación del criterio de claves primarias para todas las tablas del modelo

2º Simplificación de todas las consultas ya que los JOIN entre tablas se hacen muy simples.

3º posibilidad de establecer un criterio para los nombres de los campos que son PK de manera de ni siquiera tener que verlos para saber como se debería llamar la PK en cada tabla

4º Independencia total de la logica de negocios sin importar si el dia de mañana se requiere almacenar un codigo duplicado o modificar la verdadera clave de la tabla.

5º simplicidad y reduccion del numero de parámetros para procedimientos ya que con 1 parametro por tabla ya puedo obtener todos los datos asociados

Hay muchas ventajas mas pero creo que estas con las principales