Saltar a contenido

1 – Modelado y definición de tablas en PostgreSQL

Elementos gráficos del Diagrama Entidad-Relación (ER)

Elemento Forma en el diagrama Representa
Entidad Rectángulo Una tabla
Relación Rombo Asociación entre dos o más entidades
Atributo Óvalo Propiedad de una entidad o una relación
Flecha Flecha → Une entidad (rectángulo) a relación (rombo)

Las flechas siempre van desde una entidad hacia una relación, nunca al revés. Un atributo puede estar conectado a:

  • Una entidad: se convertirá en una columna en la tabla correspondiente.
  • Una relación: si la relación tiene atributos, se transforma en una tabla propia.

Representación de cardinalidades

Las cardinalidades indican cuántas veces una entidad puede intervenir en una relación. Hay dos formas de representarlas gráficamente:

Forma 1 – Dos grupos de números (más precisa)

Alumno Curso se matricula 0..N 1..M
  • Cada alumno puede estar matriculado de 1 o mas cursos.
  • Cada curso puede tener matriculados 0 o más alumnos.

Esta forma es muy explícita, ya que indica claramente el mínimo y máximo de participación de cada entidad en la relación.

Forma 2 – Un solo grupo de números en el rombo

Alumno Curso se matricula N:M
  • Se entiende que un alumno puede estar inscrito en varios cursos.
  • Un curso tiene varios alumnos inscritos.
  • No se distingue entre 0..N y 1..N, ni entre 1..1 y 0..1. Es más compacta pero menos precisa.
Aspecto Forma 1: dos lados Forma 2: en el rombo
Precisión Muy alta Media (general)
Muestra mínimos Sí (0..N, 1..1, etc.) No
Claridad visual Detallada Más simple visualmente
Ambigüedad Ninguna Puede generar confusión
Uso común Formal, académico Bocetos, esquemas rápidos

Traducción del modelo ER al modelo relacional (SQL)

Elemento ER Traducción SQL
Entidad Tabla con CREATE TABLE
Atributo Columna
Relación 1:N Clave foránea en el lado N
Relación N:M Nueva tabla intermedia con 2 claves foráneas
Relación con atributos propios Tabla adicional con claves foráneas y columnas extra
Atributo clave primaria PRIMARY KEY
Atributo clave foránea FOREIGN KEY
Atributo obligatorio NOT NULL
Atributo único UNIQUE
Atributo con condición CHECK (condición)

Sintaxis general de CREATE TABLE

CREATE TABLE IF NOT EXISTS nombre_tabla (
    columna1 tipo [restricciones],
    columna2 tipo [restricciones],
    ...
    CONSTRAINT nombre_restriccion CHECK (...),
    PRIMARY KEY (...),
    FOREIGN KEY (...) REFERENCES otra_tabla(columna)
        ON DELETE ... ON UPDATE ...
);

Tipos de datos más usados en PostgreSQL

Tipo Descripción
INTEGER Números enteros
TEXT Texto de longitud variable
BOOLEAN TRUE o FALSE
DATE Fecha (YYYY-MM-DD)
TIMESTAMP Fecha y hora combinadas
NUMERIC Números decimales de precisión fija
SERIAL Entero autoincremental

El tipo SERIAL

INTEGER NOT NULL DEFAULT nextval('nombre_secuencia')

Al usar SERIAL, PostgreSQL crea una secuencia automática asociada.


Claves primarias

id_empleado SERIAL PRIMARY KEY

Garantiza unicidad y no permite valores nulos. No necesita NOT NULL ni UNIQUE porque ya están implícitos.

PRIMARY KEY (id_alumno, id_curso)

Se utiliza cuando la combinación de varios campos debe ser única. Muy común en relaciones N:M.


Claves foráneas

id_departamento INTEGER REFERENCES departamentos(id_departamento)
FOREIGN KEY (id_departamento)
    REFERENCES departamentos(id_departamento)
    ON DELETE CASCADE
    ON UPDATE RESTRICT
Acción Efecto
CASCADE Borra/modifica también las filas relacionadas
SET NULL Asigna NULL al campo en la tabla dependiente
SET DEFAULT Asigna el valor por defecto
RESTRICT Impide borrar/modificar si hay filas relacionadas
NO ACTION Igual que RESTRICT pero verificado al final de la transacción

Restricciones adicionales

Restricción ¿Dónde se aplica? Significado
NOT NULL Columna El valor no puede ser nulo
UNIQUE Columna o grupo No puede haber valores repetidos
CHECK Columna o tabla Condición que debe cumplirse (CHECK (edad > 0))

Identificadores con comillas dobles

CREATE TABLE "Empleados Activos" (
    "ID Usuario" SERIAL,
    "Nombre Completo" TEXT
);
SELECT "Nombre Completo" FROM "Empleados Activos";

Una vez creado así, debes usar comillas dobles siempre para referenciar ese campo o tabla.


Ejemplo final con todos los elementos aplicados

CREATE TABLE IF NOT EXISTS empleados (
    id_empleado SERIAL PRIMARY KEY,
    nombre TEXT NOT NULL,
    dni TEXT UNIQUE,
    edad INTEGER CHECK (edad > 17),
    id_departamento INTEGER REFERENCES departamentos(id_departamento)
        ON DELETE SET NULL
        ON UPDATE CASCADE,
    fecha_ingreso DATE DEFAULT CURRENT_DATE
);
  • id_empleado es autoincremental y clave primaria.
  • dni debe ser único.
  • edad debe ser mayor de 17.
  • id_departamento es una clave foránea con ON DELETE SET NULL.
  • fecha_ingreso tiene un valor por defecto (la fecha actual).