Elegir el nombre de columnas en tablas SQL

sql

Durante el diseño o modelado de una base de datos llega un momento en que debemos asignar un nombre a cada tabla y a cada atributo.

Por supuesto, hay ciertas reglas que siempre deberemos cumplir, como que cada tabla tenga un nombre diferente, y en cada tabla, que cada atributo o columna, tenga también un nombre diferente.

Sin embargo, sin ser reglas de obligado cumplimiento, también podemos formular algunas normas que nos eviten problemas durante el uso de nuestras bases de datos. Veremos algunas de ellas.

La primera regla puede ser elegir nombres descriptivos para cada tabla y para cada columna. Conviene elegir nombres que describan claramente el contenido de cada una de ellas, ya que eso facilitará mucho la tarea cuando tengamos que crear nuestras consultas.

Una segunda regla puede ser no usar nombres demasiado genéricos, como "nombre", "id", "numero", etc. Puede que cuando decidas usar uno de estos nombres tengas muy claro a qué te refieres, pero seguramente, al cabo de un tiempo no estará tan claro. Es preferible usar identificadores más largos que aporten más detalles, como "nombre_usuario", "id_cliente", "numero_serie", etc.

La tercera regla que se me ocurre, y que normalmente se pasa por alto, es no usar el mismo nombre para columnas en distintas tablas de la misma base de datos. Por ejemplo, si tenemos dos tablas: autor y editorial, no es buena idea tener una columna en autor con el identificador "nombre" y otra en editorial con el mismo identificador. O por ejemplo, que los campos "clave" en ambas tablas se llamen clave.

¿Por qué no es buena idea que haya columnas con nombres iguales en tablas diferentes de la misma base de datos?

Lo veremos con un ejemplo. Crearemos un par de tablas:

  CREATE TABLE `personas` (
 `id` int(11) NOT NULL,
 `nombre` varchar(40) DEFAULT NULL,
 `fecha` date DEFAULT NULL
 );

ALTER TABLE `personas`
 ADD PRIMARY KEY (`id`);

INSERT INTO `personas` (`id`, `nombre`, `fecha`) VALUES
 (1, 'Fulanito', '1998-04-14'),
 (2, 'Menganito', '1758-06-18'),
 (4, 'Tulanito', '1984-07-08');

CREATE TABLE `telefonos3` (
 `numero` char(12) DEFAULT NULL,
 `id` int(11) NOT NULL
 );

ALTER TABLE `telefonos`
 ADD KEY `id` (`id`);

INSERT INTO `telefonos` (`numero`, `id`) VALUES
 ('12321321', 1),
 ('56546545', 1),
 ('56546545', 4),
 ('66684654', 4);

Y hagamos una mezcla natural:

SELECT * FROM personas NATURAL JOIN `telefonos`
id nombre fecha numero
1 Fulanito 1998-04-14 12321321
1 Fulanito 1998-04-14 56546545
4 Tulanito 1984-07-08 56546545
4 Tulanito 1984-07-08 66684654

Ahora añadimos un campo extra a la tabla de teléfonos:

ALTER TABLE `personas` ADD `nombre` VARCHAR(32) NOT NULL AFTER `fecha`;

Y repitamos la consulta.

Pero, ahora el resultado no proporciona ninguna salida, ¿por qué?

Porque ahora sólo se generan resultados cuando coinciden los valores de "id" y "nombre" en las dos tablas, y probablemente no es eso lo que queríamos hacer.