====== 01 - Del diagrama de clases al modelo relacional ======
El **modelo relacional** organiza los datos en **tablas**: cada tabla tiene **columnas** (los atributos) y **filas** (cada registro). El diseño parte del **diagrama de clases** de Entornos: las entidades y sus relaciones se traducen a tablas.
===== 1. De entidad a tabla =====
@startuml
class Book {
- id: long
- title: String
- stockQuantity: int
}
@enduml
CREATE TABLE book (
id BIGINT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
stock_quantity INT NOT NULL DEFAULT 0
);
^ Concepto del diagrama ^ Concepto relacional ^
| Clase (entidad) | Tabla |
| Atributo | Columna |
| Identificador | Clave primaria |
| Instancia (objeto) | Fila |
===== 2. Clave primaria =====
La **clave primaria** identifica cada fila de forma única. Lo habitual es un identificador numérico autogenerado:
CREATE TABLE book (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL
);
===== 3. Relaciones =====
===== 3.1 Uno a muchos (1:N) =====
Una editorial publica muchos libros; cada libro pertenece a una editorial. La tabla del lado *muchos* lleva la **clave foránea**:
CREATE TABLE publisher (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE book (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
publisher_id BIGINT,
FOREIGN KEY (publisher_id) REFERENCES publisher (id)
);
@startuml
class Publisher
class Book
Publisher "1" -- "0..*" Book
@enduml
Si un libro **debe** tener editorial, la columna es ''NOT NULL''; si es opcional, admite ''NULL''.
===== 3.2 Muchos a muchos (N:M) =====
Un libro puede tener varios autores y un autor varios libros. Se resuelve con una **tabla de unión** que contiene las dos claves foráneas:
CREATE TABLE author (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE book_author (
book_id BIGINT NOT NULL,
author_id BIGINT NOT NULL,
PRIMARY KEY (book_id, author_id),
FOREIGN KEY (book_id) REFERENCES book (id),
FOREIGN KEY (author_id) REFERENCES author (id)
);
===== 3.3 Uno a uno (1:1) =====
Cada fila de una tabla corresponde a exactamente una fila de otra. La clave foránea se declara con ''UNIQUE'':
CREATE TABLE book_detail (
book_id BIGINT PRIMARY KEY,
synopsis TEXT NOT NULL,
FOREIGN KEY (book_id) REFERENCES book (id)
);
===== 4. Composición y atributos complejos =====
En el diagrama, una **composición** (por ejemplo ''Order'' *-- ''OrderLine'') se traduce como 1:N: la parte vive en su propia tabla con clave foránea. Un atributo que es una colección simple (etiquetas, teléfonos) suele convertirse también en tabla.
^ Relación en el diagrama ^ En el modelo relacional ^
| Asociación 1:N | Clave foránea en el lado N |
| Asociación N:M | Tabla de unión |
| Composición | Tabla propia con clave foránea obligatoria |
| Agregación | Tabla propia con clave foránea |
El diagrama de clases describe el diseño; el modelo relacional es su traducción a tablas. Las decisiones (dónde va cada clave foránea, si una relación es obligatoria) son parte del diseño de datos.