Crear una base de datos y tablas en MySQL
Serie: Desarrollo de Interfaces
Curso: Desarrollo de Interfaces 1
Capítulo 20: Crear una base de datos y tablas en MySQL
Capítulo anterior: Introducción a bases de datos relacionales y SQL
Capítulo siguiente: CRUD con MySQL desde Node.js
En el capítulo anterior vimos la idea central: una base de datos relacional organiza información en tablas, filas, columnas y relaciones. Hoy pasamos de la teoría a la práctica. Vamos a crear una base de datos en MySQL, construir tablas, definir tipos de datos y registrar las primeras filas.
Este paso es importante porque antes de conectar Node.js con MySQL necesitamos tener claro qué existe dentro de la base. El backend no debería improvisar una estructura. Primero diseñamos la base, luego escribimos el código que la usa.
Qué aprenderás hoy
- Crear una base de datos con
CREATE DATABASE. - Seleccionar una base con
USE. - Crear tablas con
CREATE TABLE. - Definir claves primarias y campos obligatorios.
- Insertar registros iniciales.
- Consultar la estructura creada con comandos de revisión.
Una tabla bien creada le ahorra trabajo a la interfaz y al backend. La base de datos también debe ayudar a proteger la calidad de la información.
Antes de empezar
Para practicar puedes usar MySQL desde una terminal, phpMyAdmin o alguna herramienta visual como MySQL Workbench. Lo importante no es la herramienta, sino entender qué instrucción SQL se ejecuta y qué efecto produce.
En un entorno local con AppServ o XAMPP, normalmente tendrás MySQL disponible junto con phpMyAdmin. En hosting, como Freehostia, lo común es crear la base desde el panel y luego administrarla desde phpMyAdmin. En ambos casos, el lenguaje SQL sigue siendo el mismo.
Crear la base de datos
Una base de datos agrupa tablas relacionadas con un mismo proyecto. Para nuestro curso usaremos una base llamada di_projects. El nombre está en inglés y con guion bajo porque suele ser más cómodo para trabajar con código.
CREATE DATABASE di_projects
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
utf8mb4 permite guardar caracteres especiales, tildes y emojis con mayor seguridad que codificaciones antiguas. Aunque no siempre usaremos emojis, sí queremos que nombres, descripciones y textos en español se guarden correctamente.
Seleccionar la base de datos
Después de crear la base, debemos indicarle a MySQL que queremos trabajar dentro de ella.
USE di_projects;
Este comando no crea nada. Solo cambia el contexto. A partir de aquí, las tablas que creemos pertenecerán a di_projects.
Crear una tabla de cursos
Empecemos por una tabla pequeña: courses. Nos servirá para registrar cursos como Desarrollo de Interfaces 1, Desarrollo de Interfaces 2 o DAW.
CREATE TABLE courses (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(120) NOT NULL,
code VARCHAR(30) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
La columna id identifica cada curso. AUTO_INCREMENT permite que MySQL asigne el siguiente número automáticamente. PRIMARY KEY convierte ese campo en la clave principal. NOT NULL evita que un dato obligatorio quede vacío.
Crear una tabla de proyectos
Ahora creemos la tabla projects. Esta será más interesante porque se conectará con courses mediante course_id.
CREATE TABLE projects (
id INT AUTO_INCREMENT PRIMARY KEY,
course_id INT NOT NULL,
title VARCHAR(150) NOT NULL,
team_name VARCHAR(120) NOT NULL,
summary TEXT,
status VARCHAR(30) NOT NULL DEFAULT 'draft',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NULL,
CONSTRAINT fk_projects_courses
FOREIGN KEY (course_id) REFERENCES courses(id)
);
Esta tabla ya tiene una relación. Un proyecto pertenece a un curso. Por eso course_id apunta al id de la tabla courses.
Usa nombres claros para tablas y columnas. team_name comunica mucho mejor que dato2. El código se lee más fácil cuando la base también está bien nombrada.
Insertar registros iniciales
Ahora agreguemos algunos cursos. Estos datos nos servirán para probar relaciones.
INSERT INTO courses (name, code)
VALUES
('Desarrollo de Interfaces 1', 'DI1'),
('Desarrollo de Interfaces 2', 'DI2'),
('Desarrollo de Aplicaciones Web', 'DAW');
Luego podemos insertar proyectos asociados a esos cursos. Como course_id es obligatorio, debemos indicar a qué curso pertenece cada proyecto.
INSERT INTO projects (course_id, title, team_name, summary, status)
VALUES
(1, 'Portafolio personal', 'Equipo Aurora', 'Sitio personal con secciones y formulario.', 'published'),
(1, 'CRUD de tareas', 'Equipo Nébula', 'Aplicación para crear y organizar tareas.', 'draft'),
(3, 'Catálogo de productos', 'Equipo Prisma', 'Interfaz para listar productos desde una API.', 'review');
En un proyecto real no conviene adivinar los identificadores. Más adelante, desde Node.js, consultaremos los cursos disponibles y usaremos el id correcto. Por ahora, este ejemplo nos ayuda a practicar.
Revisar lo creado
Después de crear tablas, conviene verificar. MySQL ofrece comandos simples para inspeccionar la base.
SHOW TABLES;
Ese comando lista las tablas de la base seleccionada. Para revisar la estructura de una tabla podemos usar:
DESCRIBE projects;
También podemos hacer una consulta básica para ver datos:
SELECT id, title, team_name, status
FROM projects
ORDER BY created_at DESC;
Consultar datos relacionados
Como projects se conecta con courses, podemos pedir datos de ambas tablas. Para eso usamos JOIN.
SELECT
projects.id,
projects.title,
projects.team_name,
courses.name AS course_name,
projects.status
FROM projects
INNER JOIN courses ON courses.id = projects.course_id
ORDER BY projects.created_at DESC;
Esta consulta ya se parece mucho a lo que necesitará una interfaz: título del proyecto, equipo, curso y estado. El usuario no necesita ver course_id; necesita ver el nombre del curso.
Una versión más ordenada del diseño
Podemos mejorar la tabla projects limitando los estados posibles. En MySQL existe ENUM, aunque en muchos equipos se prefiere una tabla de estados o validación desde la aplicación. Para aprender, esta versión es clara:
CREATE TABLE project_reviews (
id INT AUTO_INCREMENT PRIMARY KEY,
project_id INT NOT NULL,
score DECIMAL(5,2) NULL,
feedback TEXT,
reviewed_at DATETIME NULL,
CONSTRAINT fk_reviews_projects
FOREIGN KEY (project_id) REFERENCES projects(id)
);
Ahora podemos registrar evaluaciones sin llenar la tabla projects con columnas que no siempre pertenecen al proyecto. Un proyecto puede existir sin revisión, y una revisión puede guardar comentarios o puntaje cuando corresponda.
Errores comunes
- Crear tablas sin clave primaria.
- Guardar todo como
VARCHARpor no elegir tipos de datos. - Usar nombres con espacios o caracteres difíciles en tablas y columnas.
- No definir campos obligatorios con
NOT NULL. - Repetir el nombre del curso en cada proyecto en vez de usar una relación.
- Crear relaciones sin insertar primero los datos de la tabla principal.
Si una tabla tiene una clave foránea, no podrás insertar un registro que apunte a un dato inexistente. Eso no es un error del sistema: es la base protegiendo la consistencia.
Reto práctico
Crea una base de datos llamada student_portfolio con tres tablas: students, courses y projects. Define claves primarias, tipos de datos adecuados y una relación entre proyectos y cursos.
Variante extra: agrega una tabla project_links para guardar enlaces de demo, repositorio y documentación de cada proyecto. Piensa si esos enlaces deberían estar en projects o en una tabla separada.
Conclusión
Crear una base de datos y sus tablas es una decisión de diseño, no solo una tarea técnica. Cada columna expresa qué datos considera importantes tu aplicación. Cada relación expresa cómo se conecta una parte del sistema con otra.
Ya tenemos una base preparada para proyectos de clase. En el siguiente capítulo conectaremos Node.js con MySQL para construir un CRUD real. La interfaz seguirá consumiendo rutas de una API, pero el servidor ya no guardará datos en un archivo JSON: ejecutará consultas SQL sobre tablas reales.
Fuentes consultadas
- MySQL 8.4 Reference Manual: CREATE DATABASE Statement
- MySQL 8.4 Reference Manual: The utf8mb4 Character Set
- MySQL 8.4 Reference Manual: CREATE TABLE Statement
- MySQL 8.4 Reference Manual: FOREIGN KEY Constraints
- MySQL 8.4 Reference Manual: SHOW TABLES Statement
- MySQL 8.4 Reference Manual: DESCRIBE Statement