Antes de escribir una sola línea de código en el backend, el paso más importante es definir la estructura de datos que sostendrá toda la aplicación. Aquí se explica cómo diseñar y ejecutar tablas en MySQL usando SQL puro, con buenas prácticas que previenen errores y mantienen la claridad a largo plazo.
¿Por qué diseñar la base de datos directamente en SQL?
Aunque herramientas como las migrations de Go permiten crear tablas desde la línea de comandos, trabajar directamente con SQL ofrece control absoluto sobre la base de datos [00:26]. Esto significa decidir exactamente qué motor, codificación y estructura tendrá cada tabla, sin depender de abstracciones que puedan ocultar detalles críticos.
El primer paso es crear la base de datos con una sentencia segura:
sql
CREATE DATABASE IF NOT EXISTS book_club;
USE book_club;
La cláusula IF NOT EXISTS [01:12] es fundamental: si la base de datos ya existe, la sentencia simplemente no hace nada. No lanza error, no colisiona con datos existentes y, en casos extremos, evita modificaciones accidentales que podrían ser catastróficas.
¿Cómo nombrar tablas y columnas de forma clara?
Una decisión de diseño relevante es usar nombres de tablas en plural [02:00]. La tabla almacena múltiples registros —usuarios, libros, autores— así que el plural refleja esa naturaleza. Aunque usar singular también es válido, lo importante es mantener consistencia en todo el proyecto.
Para las columnas identificadoras, en lugar de usar simplemente id, se recomienda el formato book_id, author_id, etc. [02:18]. Las ventajas son claras:
- Al hacer referencias desde el código,
books.book_id es más explícito que books.id.
- En consultas con múltiples joins (LEFT JOIN, INNER JOIN), se elimina la ambigüedad.
- Puede ahorrar horas de debugging cuando se cruzan muchas tablas.
¿Cómo se estructura la tabla de libros?
La tabla books se crea con columnas esenciales, manteniendo un diseño abstracto y pequeño que puede crecer después con campos como ISBN, imagen o número de páginas [03:30]:
sql
CREATE TABLE IF NOT EXISTS books (
book_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
author_id INTEGER UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
El campo author_id no almacena el nombre del autor directamente, sino que referencia a otra tabla. Este principio de normalización evita duplicar información y mantiene la integridad de los datos.
¿Qué significan ENGINE, CHARSET y COLLATE?
MySQL y MariaDB han cambiado sus valores por defecto a lo largo de diferentes versiones [04:08]. Para garantizar un estándar entre distintas instancias de bases de datos, se especifican explícitamente tres configuraciones:
- ENGINE=InnoDB: el motor de almacenamiento más robusto, con soporte para transacciones y claves foráneas.
- DEFAULT CHARSET=utf8mb4: permite almacenar cualquier carácter Unicode, incluyendo emojis.
- COLLATE=utf8mb4_bin: define cómo se comparan y ordenan los valores binarios del texto.
Esta línea se repite en cada tabla para asegurar comportamiento uniforme [04:55].
¿Cómo se crea la tabla de autores?
La tabla authors sigue la misma filosofía de simplicidad [05:48]:
sql
CREATE TABLE IF NOT EXISTS authors (
author_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
nationality VARCHAR(2)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
El campo nationality utiliza un VARCHAR de dos caracteres basado en códigos ISO (MX para México, US para Estados Unidos) [06:10]. Es una forma compacta y estandarizada de representar países sin necesidad de texto largo.
Al ejecutar SHOW TABLES en la terminal de MySQL, se confirman las dos tablas creadas: authors y books. Con DESCRIBE authors se verifica que la estructura coincide exactamente con lo definido [06:40].
Estas decisiones de diseño —nombres explícitos, cláusulas defensivas, configuraciones estándar— parecen pequeñas, pero marcan la diferencia cuando el proyecto crece. ¿Qué otras columnas agregarías a estas tablas? Comparte tus ideas.