UAX · Estructura de datos y algoritmos II · Bases de datos

De UML a SQL

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.

El modelo

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.

Diagrama de clases

100 %

El SQL


  
Cómo se pasa de UML a tablas

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).

1–N: la FK va en el lado N

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.

N–M: tabla intermedia

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.

Atributos de la relación

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.

1–1: FK con UNIQUE

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.

ON DELETE y ON UPDATE

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.

Lo que el SQL no puede imponer

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.

La sintaxis, en una pantalla
# 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]

Atributos: nombre tipo modificadores

TipoPara qué
int, bigintEnteros. 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.
textTexto largo sin límite práctico.
decimal(p,s)Números exactos: p cifras, s de ellas decimales. Para dinero y notas.
floatDecimales aproximados (REAL en SQLite, DOUBLE en MySQL).
booleanSí o no. En SQLite es un INTEGER con 0 o 1.
date, datetime, timeFechas y horas. En SQLite se guardan como texto ISO.
ModificadorQué hace
pkClave primaria. Si lo pones en varios atributos, la clave es compuesta.
autoincrementEl número lo pone la base de datos. Solo en una PK entera.
not nullObligatorio. La PK ya lo es.
uniqueNo puede repetirse.
default xValor si no se da otro: default 0, default 'pendiente', default true, default ahora, default hoy.

Relaciones: 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.

MultiplicidadSignifica
1Exactamente uno.
0..1Uno 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ónQué hace
on delete cascadeTambién restrict, set null y no action. Por defecto, restrict.
on update cascadeLo mismo, para cuando cambia la clave de la madre.
pkRelació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.