viernes, 13 de julio de 2012

Porqué usar llaves primarias autoincrementables

En un post anterior explicaba una ventaja de los campos autoincrementables, pero además de ésta existen otras razones que hacen que sea una buena práctica incluir un campo autoincrementable como llave primaria (PK) en cada tabla.

Incluir campos autoincrementables como llaves primarias en cada tabla de una base de datos tiene varias ventajas, que hacen que usarlas sea una buena práctica. Veamos algunas de esas buenas razones:

  1. Facilita la obtención del último registro insertado.

    Tener un campo autoincrementable en una tabla, hace mucho más sencillo este procedimiento en algunos casos, como ya lo expliqué en este post anterior.

  2. Permite conservar la unicidad de los registros mientras definimos o cambiamos el valor de un campo único.

    Supongamos que tenemos la tabla automovil, definida así:

    CREATE TABLE automovil (
    placa char(6) PRIMARY KEY,
    marca varchar(50),
    pasajeros int );

    Si por alguna razón nos encontramos con un valor incorrecto para la llave primaria de un nuevo registro, podemos igual hacer la inserción del registro y dejar pendiente la definición del valor para el campo placa si redefinimos la tabla así:

    CREATE TABLE automovil (
    id serial,
    placa char (6) UNIQUE,
    marca varchar(50),
    pasajeros int );

    Si no queremos permitir valores nulos para el campo placa tendríamos que definirlo como NOT NULL.

  3. Permite conservar la integridad referencial entre dos o más tablas relacionadas.

    Siguiendo con el ejemplo anterior, supongamos que tenemos la tabla automovil relacionada con la tabla propietario, de la siguiente forma:

    CREATE TABLE propietario (
    documento_identificacion char(9) PRIMARY KEY,
    nombres varchar(100),
    apellidos varchar(100),
    direccion varchar(100),
    telefono varchar(100));

    CREATE TABLE automovil (
    placa char(6) PRIMARY KEY,
    marca varchar(50),
    pasajeros int
    propietario char(9) REFERENCES propietario(documento_identificacion));

    Si tuviéramos que cambiar el valor del campo documento_identificacion para un registro en propietario, tendríamos que cambiarlo también en automovil. Esto puede hacerse mediante el uso del comportamiento CASCADE en el evento ON UPDATE en la definición de la llave foránea, pero se estaría ejecutando una operación adicional en la base de datos por cada tabla que tenga una referencia con ese registro, y de hecho hay tablas que suelen tener muchas refencias, por lo que sería una carga adicional innecesaria que puede evitarse.

    Al redefinir las tablas usando llaves primarias autoincrementables podremos hacer cambios sobre los campos únicos sin tener que preocuparnos por la integridad referencial y las consultas adicionales:

    CREATE TABLE propietario (
    id serial PRIMARY KEY,
    documento_identificacion char(9) UNIQUE,
    nombres varchar(100),
    apellidos varchar(100),
    direccion varchar(100),
    telefono varchar(100));

    CREATE TABLE automovil (
    id PRIMARY KEY
    placa char(6) UNIQUE,
    marca varchar(50),
    pasajeros int
    propietario_id int REFERENCES propietario(id));

Además de estas hay otras buenas razones, así que por qué no hacerlo?