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