Cómo diseñar una buena base de datos
Ahora que sabemos qué son las tablas y las relaciones, ¿cómo decidimos la manera de organizar la información? Esta sección enseña reglas prácticas para construir una base de datos bien estructurada.
Una BD enferma
Para entender el buen diseño, primero debemos ver cómo luce un mal diseño. Imagina que creas una tabla llamada CONTACTOS para guardar la información de las personas.
A simple vista, puede parecer buena idea guardar todo en el mismo lugar. Sin embargo, veamos lo que sucede cuando empezamos a llenarla con datos reales.
| id | nombre_completo | telefono1 | telefono2 | telefono3 | correo | ciudad_de_residencia | nombre_ciudad_pais |
|---|---|---|---|---|---|---|---|
| 1 | Ana Gómez | 300123 | ana@mail.com | Medellín | Medellín, Colombia | ||
| 2 | Juan Pérez | 310456 | 320789 | juan@mail.com | Medellín | Medellín, Colombia | |
| 3 | Luz Silva | 301987 | 311234 | luz@mail.com | Bogotá | Bogotá, Colombia | |
| 4 | Carlos Ruiz | 315654 | carlos@mail.com | Medellín | Medellín, Colombia |
- Problema 1: Datos repetidos (redundancia): "Medellín" aparece muchas veces. Si descubres que escribiste mal el nombre y debe ser "Medellín Centro", tendrías que actualizar cientos o miles de filas a mano.
- Problema 2: Columnas vacías sin sentido:
telefono2ytelefono3están vacíos para la mayoría de las personas, desperdiciando espacio y generando desorden. - Problema 3: Un dato hace dos cosas:
nombre_ciudad_paisguarda la ciudad y el país al mismo tiempo. Si alguien te pide buscar "solo los contactos de Colombia", será un dolor de cabeza. - Problema 4: Grupos repetidos:
telefono1,telefono2ytelefono3son exactamente el mismo tipo de información, solo que repetida como columnas diferentes.
Podemos visualizar los síntomas de una base de datos enferma con el siguiente diagnóstico:
Las reglas del buen diseño
Para evitar que tu base de datos se enferme, existen ciertas reglas prácticas de diseño. A continuación, te presentamos cuatro reglas esenciales para mantener tus datos organizados.
Regla 1: "Un dato, una sola vez"
Cada pieza de información debe vivir en exactamente UN lugar dentro de la base de datos. Si te encuentras repitiendo la misma información en múltiples filas, esos datos merecen su propia tabla.
Por ejemplo, si tienes el nombre de una ciudad repetido en cada contacto, es mejor crear una tabla separada para las ciudades.
- Antes: La tabla contacto tiene la columna
ciudad_nombrerepetida ("Medellín", "Medellín", "Medellín"). - Después: Creas una tabla
CIUDAD. El contacto ahora solo tiene un identificadorid_ciudad.
Regla 2: "Cada columna guarda UNA sola cosa"
Una columna debe contener un pedazo de información indivisible. No debes mezclar diferentes tipos de datos en una sola celda.
- Antes: La columna
nombre_ciudad_paisguarda el valor "Medellín, Colombia". - Después: Separas la información en dos columnas:
ciudadypais. O mejor aún, creas tablas separadas para ambos conceptos.
Regla 3: "No más columnas del mismo tipo"
Si tienes columnas como telefono1, telefono2, telefono3, estás rompiendo esta regla. Siempre que tengas un grupo de columnas que hacen lo mismo, debes crear una nueva tabla y vincularla.
Antes — La misma información repetida como columnas separadas:
| id | nombre | telefono1 | telefono2 | telefono3 |
|---|---|---|---|---|
| 1 | Ana | 300123 | 310456 | |
| 2 | Juan | 315789 |
Después — Una tabla separada con una fila por cada número:
| id | id_persona | numero |
|---|---|---|
| 1 | 1 | 300123 |
| 2 | 1 | 310456 |
| 3 | 2 | 315789 |
Si Ana consigue un cuarto teléfono, simplemente agregas una fila más. No tienes que modificar la estructura de la tabla ni tocar los datos de Juan.
Regla 4: "Cada columna depende de la llave, solo de la llave"
Cada columna de una tabla debe decirnos algo sobre la llave principal de esa tabla, y no sobre otras columnas. Toda la información debe describir directamente al sujeto principal de la tabla.
- Antes: En una tabla
PEDIDO, tienesciudad_de_envio,nombre_ciudadycodigo_postal_ciudad. Estos últimos datos describen a la ciudad, no al pedido. - Después: Dejas el identificador de la ciudad en el pedido, pero creas una tabla
DIRECCIONoCIUDADpara guardar sus detalles.
El proceso de mejorar una BD
Aplicar las reglas requiere un proceso metódico. Sigamos los pasos usando nuestra tabla CONTACTOS enferma como ejemplo real, así puedes ver la acción concreta en cada etapa.
Escribe todo en una tabla plana
Haz una lista de absolutamente toda la información que necesitas guardar, sin preocuparte por la organización. Ponla en una sola tabla gigante.
Aplicado al ejemplo: Tomamos la tabla CONTACTOS con todas sus columnas tal cual:
| id | nombre_completo | telefono1 | telefono2 | telefono3 | correo | ciudad_de_residencia | nombre_ciudad_pais |
|---|---|---|---|---|---|---|---|
| 1 | Ana Gómez | 300123 | ana@ | Medellín | Medellín, Colombia | ||
| 2 | Juan Pérez | 310456 | 320789 | juan@ | Medellín | Medellín, Colombia |
Esta es tu "tabla enferma" de partida. Es normal que se vea así al inicio.
Encuentra los datos que se repiten fila a fila
Busca columnas cuyo valor es el mismo en muchas filas. Eso indica que ese dato merece su propia tabla.
Aplicado al ejemplo: La columna ciudad_de_residencia tiene "Medellín" repetido en las filas 1, 2 y 4. Si tuviéramos 500 contactos de Medellín y la ciudad cambia de nombre, tendríamos 500 filas que actualizar a mano.
Acción: Crear una tabla CIUDAD separada y reemplazar el texto repetido por un id_ciudad.
| id | nombre_ciudad |
|---|---|
| 1 | Medellín |
| 2 | Bogotá |
Divide las columnas que mezclan dos cosas
Busca columnas que guarden más de un concepto en una sola celda. Sepáralas.
Aplicado al ejemplo: La columna nombre_ciudad_pais guarda "Medellín, Colombia" — dos datos en uno. Si alguien pide filtrar por país, es imposible hacerlo limpiamente.
Acción: En la tabla CIUDAD que ya creamos, separamos en dos columnas distintas:
| id | nombre_ciudad | nombre_pais |
|---|---|---|
| 1 | Medellín | Colombia |
| 2 | Bogotá | Colombia |
Ahora puedes filtrar por país, por ciudad, o por ambos sin problemas.
Elimina los grupos de columnas del mismo tipo
Si tienes telefono1, telefono2, telefono3... estás guardando el mismo tipo de dato en columnas repetidas. Crea una tabla separada con una fila por cada valor.
Aplicado al ejemplo: En lugar de 3 columnas de teléfono, creamos la tabla TELEFONO:
| id | id_persona | numero |
|---|---|---|
| 1 | 1 | 300123 |
| 2 | 2 | 310456 |
| 3 | 2 | 320789 |
Ahora Juan puede tener 10 teléfonos y nunca nos faltará espacio. Solo agregas filas, no columnas.
Verifica que cada columna describa solo su tabla
Lee cada columna y pregúntate: "¿Este dato describe a la entidad principal o en realidad describe a otra cosa?". Si la respuesta es "otra cosa", muévelo.
Aplicado al ejemplo: Revisamos la tabla PERSONA. ¿La columna nombre_completo describe a la persona? Sí. ¿El correo describe a la persona? Sí. ¿El nombre_ciudad_pais describe a la persona o a la ciudad? A la ciudad — ya lo movimos en el Paso 3.
Acción: Separar nombre_completo en nombre y apellido para mayor flexibilidad:
| id | nombre | apellido | correo | id_ciudad |
|---|---|---|---|---|
| 1 | Ana | Gómez | ana@mail.com | 1 |
| 2 | Juan | Pérez | juan@mail.com | 1 |
Dibuja el diagrama final
Con todas las tablas depuradas, construye el diagrama ER para visualizar cómo quedaron conectadas. Este es el diseño que vas a implementar en código.
Aplicado al ejemplo: El resultado final de rediseñar CONTACTOS es:
Pasamos de una tabla caótica con 8 columnas a tres tablas limpias, sin datos repetidos y sin columnas vacías.