¿Qué es un diagrama de entidad-relación (ERD)?
Un Diagrama de entidad-relación (ERD) es un plano estructural utilizado para diseñar, documentar y analizar bases de datos relacionales. Visualiza las tablas (entidades) dentro de un sistema, las columnas específicas (atributos) que contienen y cómo esas tablas se relacionan entre sí. En PlantUML, los ERD se crean utilizando el notación de Ingeniería de Información (IE), que implementa la notación de pie de cuervo estándar para representar restricciones relacionales.
Ya sea que estés diseñando un almacén de datos de microservicios, optimizando rutas de unión SQL o mapeando una arquitectura de almacén de datos a nivel empresarial, un ERD de UML basado en texto garantiza que tus esquemas de base de datos sean perfectamente claros. Con VPasCode, puedes definir tus tablas de base de datos, claves de índice y relaciones lógicas utilizando una sintaxis limpia y declarativa. El motor maneja automáticamente el tamaño de las cajas de tabla y enruta las cadenas de conectores de clave foránea sin líneas de diseño superpuestas.
Guía de sintaxis principal: Elementos y construcciones
Construir un ERD robusto de estilo IE en PlantUML depende de bloques de entidades estructurados, designaciones explícitas de claves y modificadores de cardinalidad de pie de cuervo.
1. Declaración de entidades (tablas de base de datos)
Declaras una tabla de base de datos utilizando la entidadpalabra clave, seguida del nombre de la tabla y un conjunto de corchetes. Dentro de los corchetes, listas las columnas de tu tabla. Para que tu esquema sea limpio y legible, utiliza un separador horizontal (--) para separar tus claves primarias/foráneas de los atributos de datos estándar:
entidad "usuarios" como usuarios_tabla {
id : INT [PK]
--
correo : VARCHAR(255)
creado_en : TIMESTAMP
} 
2. Designación de claves primarias y foráneas
Aunque los indicadores de texto como `[PK]` o `[FK]` funcionan bien, el motor IE de PlantUML también admite íconos visuales de claves. Colocar un asterisco (*) antes de un atributo lo designa como una columna **obligatoria (no nula)**, mientras que una cadena de texto limpia o una etiqueta añade contexto de indexación explícito:
entidad "orders" {
* id : INT <<PK>>
--
* user_id : INT <<FK>>
codigo_descuento : VARCHAR(50)
} 
3. Mapeo de cardinalidades y relaciones de pie de cuervo
Para conectar tablas y aplicar restricciones de integridad referencial, utilice una combinación de guiones, corchetes y caracteres de tubería. En la notación IE, estos símbolos forman cabezas distintas de **pie de cuervo** que representan relaciones de base de datos:
||--||**Exactamente uno a exactamente uno:** Un mapeo estricto y obligatorio uno a uno.||--o|**Exactamente uno a cero o uno:** Un mapeo uno a uno opcional.||--|{**Exactamente uno a uno o muchos:** Una dependencia obligatoria uno a muchos.||--o{**Exactamente uno a cero, uno o muchos:** Una relación uno a muchos estándar y opcional.
tabla_usuarios ||--o{ orders : "coloca" 
Mejores prácticas para esquemas de base de datos limpios
- Mantenga las convenciones de mayúsculas y minúsculas: Mantenga sus declaraciones de entidades predecibles. Use snake_case en minúsculas (por ejemplo,
order_items) para tablas reales mapeadas a SQL, o use CamelCase en mayúsculas para modelos de dominio conceptuales. - Documente siempre las claves foráneas: Al vincular dos tablas, especifique siempre la columna de clave foránea dentro del bloque de la tabla hija. Esto proporciona contextos de referencia claros para los equipos de ingeniería durante las migraciones de datos.
- Controle el espaciado del pie de cuervo: Los esquemas de base de datos complejos con decenas de tablas pueden volverse rápidamente abarrotados. Si sus líneas de relación comienzan a cruzarse de forma unnatural, reemplace sus conectores de doble guión (
--) con tres o cuatro guiones (---) para separar las tablas y permitir al motor de diseño más espacio para organizar la cuadrícula.
Ejemplos reales de ERD de PlantUML
Ejemplo 1: Modelo relacional central de comercio electrónico (Claves y asignaciones)
Este plano funcional modela un bucle de transacciones central de base de datos de comercio electrónico, mostrando cómo los usuarios, pedidos y registros de pagos se vinculan entre sí utilizando relaciones estrictas de tipo ‘pata de cuervo’.
@startuml
' Congelar el dibujo de las cajas de entidades en cuadrados modernos y nítidos
ocultar círculo
skinparam LINETYPE ortho
entidad "usuarios" como usuario {
* id : INT <<PK>>
--
* email : VARCHAR(100)
* hash_contraseña : VARCHAR(255)
teléfono : VARCHAR(20)
}
entidad "pedidos" como pedido {
* id : INT <<PK>>
--
* id_usuario : INT <<FK>>
* monto_total : DECIMAL(10,2)
estado : VARCHAR(50)
}
entidad "libros_de_pagos" como libro {
* id : INT <<PK>>
--
* id_pedido : INT <<FK>>
* referencia_transacción : VARCHAR(100)
pasarela : VARCHAR(50)
}
' Definir enlaces del esquema relacional
usuario ||--o{ pedido : "realiza"
pedido ||--|| libro : "genera"
@enduml 
Desglose de sintaxis: La directiva ocultar círculo deshabilita los símbolos predeterminados de clases UML, mientras que skinparam LINETYPE ortho fuerza los caminos de relación a ángulos rectos limpios de 90 grados. El esquema muestra claramente que un usuario puede realizar cero o muchos pedidos (||--o{), mientras que un pedido debe tener exactamente un registro de libro de pagos asociado (||--||).
Ejemplo 2: Esquema de sistema avanzado de gestión de contenidos (Intersección muchos a muchos)
Este plano avanzado de empresa modela una topología completa de un sistema de gestión de contenidos (CMS). Muestra cómo gestionar arquitecturas muchos a muchos de forma limpia aprovechando una tabla de asignación intermedia.
@startuml
ocultar círculo
skinparam LINETYPE ortho
entidad "publicaciones" como publicación {
* id : INT <<PK>>
--
* id_autor : INT <<FK>>
* título : VARCHAR(255)
slug : VARCHAR(255)
cuerpo : TEXT
}
entidad "categorías" como categoría {
* id : INT <<PK>>
--
* nombre : VARCHAR(100)
descripción : VARCHAR(255)
}
entidad "asignaciones_publicación_categoría" como asignación {
* id_publicación : INT <<PK>><<FK>>
* id_categoría : INT <<PK>><<FK>>
--
asignado_en : TIMESTAMP
}
entidad "comentarios" como comentario {
* id : INT <<PK>>
--
* id_publicación : INT <<FK>>
nombre_autor : VARCHAR(100)
* contenido : TEXT
}
' Estructuras de enlaces relacionales
publicación ||--o{ asignación : "contiene"
categoría ||--o{ asignación : "categoriza"
publicación ||--o{ comentario : "adjunta"
@enduml 
Desglose de sintaxis: Esta plantilla modela una relación clásica muchos a muchos entre publicaciones y categorías. En lugar de conectarlas directamente, introduce una tabla intermedia (asignaciones_publicación_categoría) donde ambas columnas actúan como clave primaria compuesta. Los indicadores de pata de cuervo representan explícitamente las relaciones en cascada hasta la capa de comentarios.