Diseñar una base de datos relacional implica pensar con cuidado en cómo se conectan las entidades. En esta sesión se construyen dos tablas fundamentales: clubs y club_members, que permiten a los usuarios crear clubes de lectura y asociarse a ellos. Además, se incorporan columnas de auditoría con timestamps automáticos que registran cuándo se crea y cuándo se modifica cada registro.
¿Cómo se crea la tabla clubs con restricciones únicas?
La tabla clubs es sencilla pero incluye detalles importantes. Se define con la sentencia CREATE TABLE IF NOT EXISTS y contiene las siguientes columnas [00:06]:
- club_id: entero, clave primaria con auto increment.
- name:
VARCHAR(100), no nulo y con restricción UNIQUE, lo que impide que dos clubes compartan el mismo nombre.
- description:
VARCHAR(500), sin restricciones adicionales; puede quedar vacío o repetirse.
La restricción UNIQUE sobre la columna name garantiza la integridad de datos: el motor de MySQL rechazará cualquier inserción que duplique un nombre ya existente.
¿Qué diferencia hay entre timestamp y datetime?
Después de las columnas básicas se agregan dos campos de auditoría: created_at y modified_at [01:06]. Ambos son de tipo TIMESTAMP, que conceptualmente responde a la pregunta "¿qué hora es en este instante?". A diferencia de DATETIME, un timestamp está pensado para marcar el momento exacto en que ocurre una acción: una inserción, una actualización o cualquier evento.
La definición completa es:
sql
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
El valor por defecto CURRENT_TIMESTAMP hace que MySQL registre automáticamente la fecha y hora del momento en que se ejecuta el INSERT. La cláusula ON UPDATE CURRENT_TIMESTAMP en modified_at actualiza ese valor cada vez que se modifica el registro [02:08].
¿Cómo se comprueba el comportamiento de los timestamps?
Para verificar el funcionamiento se insertan dos registros rápidos [02:55]:
sql
INSERT INTO clubs (name) VALUES ('club uno');
INSERT INTO clubs (name) VALUES ('club dos');
Al ejecutar SELECT * FROM clubs, ambos registros muestran el mismo created_at porque se insertaron prácticamente al mismo tiempo. Luego se ejecuta una actualización [03:22]:
sql
UPDATE clubs SET description = 'club Chido' WHERE club_id = 1;
Tras el UPDATE, el campo modified_at del primer registro refleja una diferencia de aproximadamente un minuto respecto a created_at, mientras que el segundo registro mantiene ambos valores iguales. Así queda demostrado el comportamiento automático de los timestamps.
¿Cómo se diseña la tabla club_members con llave única compuesta?
La tabla club_members conecta usuarios con clubes, representando la relación muchos a muchos [03:42]. Su estructura incluye:
- club_member_id: entero sin signo, clave primaria con auto increment.
- user_id: entero sin signo, no nulo.
- club_id: entero sin signo, no nulo.
- is_admin:
TINYINT, no nulo, con valor por defecto 0 (quien ingresa a un club no es administrador por defecto).
- Las mismas columnas
created_at y modified_at con timestamps automáticos.
El detalle más relevante es la creación de un UNIQUE KEY compuesto [04:18]:
sql
UNIQUE KEY norep (user_id, club_id)
Esta llave conjunta toma ambas columnas en combinación. Significa que la pareja (1, 1) solo puede existir una vez: un usuario no puede pertenecer dos veces al mismo club. No se restringe cada columna por separado, porque un mismo usuario puede estar en varios clubes y un mismo club puede tener varios usuarios.
¿Qué tablas faltan para completar la base de datos?
Con clubs y club_members listas, la base de datos aún requiere tres tablas adicionales [05:10]:
- users: se construirá cuando se trabaje con el modelo user que viene por defecto en el sistema.
- préstamos: registra qué libros presta un usuario a otro.
- user_books: define qué libros posee cada usuario.
Estas dos últimas tablas están disponibles en los recursos del curso para ejecutarlas directamente en la instancia de MySQL.
Si tienes dudas sobre las restricciones compuestas o el uso de timestamps, comparte tu experiencia en los comentarios.