UAX · Estructura de datos y algoritmos II · Bases de datos
Escribe las clases y sus relaciones, mira el diagrama y saca las tablas. El SQL sale para SQLite y para MySQL, con las claves foráneas y las tablas intermedias ya resueltas. Todo pasa en tu navegador; no se envía nada a ningún sitio.
Clase sin sangría, atributos con sangría, relaciones como A 1--* B : nombre. Tab mete sangría; Esc y luego Tab sale del cuadro. La sintaxis completa está abajo.
Cada clase es una tabla, cada atributo una columna y la clave primaria (PK) es lo que distingue una fila de otra. Las relaciones no se escriben como columnas en el diagrama: salen solas al pasar a tablas, y aquí es donde se decide dónde va cada clave foránea (FK).
Un profesor imparte muchas asignaturas; cada asignatura la imparte un profesor. La columna profesor_id va en asignatura, porque cada asignatura tiene un solo valor que guardar. Al revés no cabe: un profesor tendría que guardar una lista. Si en el lado 1 pone 0..1, la columna admite NULL; si pone 1, es NOT NULL.
Un alumno se matricula de muchas asignaturas y una asignatura tiene muchos alumnos. La FK no cabe en ninguna de las dos, así que sale una tabla nueva con las dos FK, y las dos juntas forman su clave primaria: el mismo alumno no puede estar dos veces en la misma asignatura.
La nota no es del alumno ni de la asignatura: es de la matrícula. En UML se dibuja como una clase asociación (la caja unida con línea discontinua) y en las tablas va a la tabla intermedia. En una 1–N, los atributos de la relación van a la tabla del lado N.
La FK va en la clase que depende de la otra, la que tiene un 1 enfrente: cada guía docente es de una asignatura. Lleva UNIQUE; sin él, la misma asignatura podría tener dos guías y la relación sería una 1–N.
Qué pasa con las filas hijas cuando se borra o cambia la madre. RESTRICT (lo que pone aquí si no dices nada) impide borrar un profesor que tiene asignaturas. CASCADE borra también las asignaturas. SET NULL las deja sin profesor, y por eso solo vale si la FK admite NULL, es decir, con 0..1.
Un 1..* («todo pedido tiene al menos un producto») no se expresa con CREATE TABLE: la FK obliga a que exista la madre, pero no a que tenga hijas. Eso lo comprueba el programa, o un trigger.
# comentario (también vale //) Alumno ← clase: sin sangría id int pk autoincrement ← atributo: con sangría nombre varchar(100) not null email varchar(120) unique activo boolean default true Alumno *--* Asignatura : matricula (nota decimal(4,2)) Profesor 1--* Asignatura : imparte [on delete cascade]
nombre tipo modificadores| Tipo | Para qué |
|---|---|
| int, bigint | Enteros. bigint para números que pasan de 2.100 millones. |
| varchar(n), char(n) | Texto con un máximo de n caracteres. char(n) siempre ocupa n. |
| text | Texto largo sin límite práctico. |
| decimal(p,s) | Números exactos: p cifras, s de ellas decimales. Para dinero y notas. |
| float | Decimales aproximados (REAL en SQLite, DOUBLE en MySQL). |
| boolean | Sí o no. En SQLite es un INTEGER con 0 o 1. |
| date, datetime, time | Fechas y horas. En SQLite se guardan como texto ISO. |
| Modificador | Qué hace |
|---|---|
| pk | Clave primaria. Si lo pones en varios atributos, la clave es compuesta. |
| autoincrement | El número lo pone la base de datos. Solo en una PK entera. |
| not null | Obligatorio. La PK ya lo es. |
| unique | No puede repetirse. |
| default x | Valor si no se da otro: default 0, default 'pendiente', default true, default ahora, default hoy. |
A mult--mult B : nombre (atributos) [opciones]La multiplicidad que va pegada a cada clase dice cuántos objetos de esa clase hay al otro lado. Profesor 1--* Asignatura: cada asignatura tiene 1 profesor; cada profesor, muchas asignaturas.
| Multiplicidad | Significa |
|---|---|
| 1 | Exactamente uno. |
| 0..1 | Uno o ninguno. |
| * (o 0..*, n, m) | Cualquier número, también ninguno. |
| 1..* | Al menos uno. |
El nombre (tras los dos puntos) es opcional; en una N–M es el nombre de la tabla intermedia. Los atributos entre paréntesis, separados por comas, van a esa tabla (y si llevan pk, entran en su clave).
| Opción | Qué hace |
|---|---|
| on delete cascade | También restrict, set null y no action. Por defecto, restrict. |
| on update cascade | Lo mismo, para cuando cambia la clave de la madre. |
| pk | Relación identificadora: la FK entra en la clave primaria de la clase del lado N (entidad débil, como el ejemplar de un libro). |
Los nombres, sin tildes, sin ñ y sin espacios: anio, fecha_alta. Las tablas salen en minúsculas y con guion bajo: GuiaDocente pasa a guia_docente.