PTENES
MÓDULO 1.1

Fundamentos y modelado

Entiende cómo se organizan los datos en tablas, cómo garantizar la integridad y cómo modelar antes de escribir una línea de SQL.

6 temas
30 min
Básico
Teoría + Práctica
1

Modelo relacional

El modelo relacional es la base de prácticamente todas las bases de datos que vas a usar en tu carrera. Creado por Edgar F. Codd en IBM en 1970, organiza los datos en tablas (llamadas relaciones) con filas y columnas bien definidas. Cada tabla representa una entidad del mundo real.

Conceptos fundamentales

  • Tabla (relación): Estructura que almacena datos de una entidad. Ej.: cliente, pedido
  • Fila (Tupla/Registro): Una instancia de la entidad. Ej.: un cliente específico
  • Columna (atributo): Una propiedad de la entidad. Ej.: nombre, correo electrónico, fecha_nacimiento
  • Dominio: El tipo de datos que acepta una columna. Ej.: TEXT, INTEGER, DATE

Consejo práctico

Piensa en una tabla como una hoja de cálculo de Excel, pero con reglas estrictas: cada columna tiene un tipo, cada fila es única y el orden de las filas no importa. La gran diferencia es que, en la base de datos relacional, las reglas son impuestas por el sistema, no por la disciplina del usuario.

-- Exemplo: tabela cliente
-- Cada linha = um cliente, cada coluna = um atributo

CREATE TABLE cliente (
  id    SERIAL PRIMARY KEY,    -- Coluna: identificador unico
  nome  TEXT NOT NULL,          -- Coluna: nome obrigatorio
  email TEXT UNIQUE             -- Coluna: email unico
);

-- Inserindo uma "tupla" (linha/registro)
INSERT INTO cliente (nome, email)
VALUES ('Ana Silva', 'ana@email.com');
2

Claves primarias y foráneas

Las claves son el mecanismo que da identidad a los registros y conecta las tablas entre sí. La clave primaria (PK) garantiza que cada registro sea único. La clave foránea (FK) crea un vínculo entre tablas al hacer referencia a la PK de otra tabla.

Cómo funcionan

  • PRIMARY KEY: Identifica cada registro de forma única. No acepta NULL ni duplicados.
  • FOREIGN KEY: Columna que referencia la PK de otra tabla y crea una relación.
  • REFERENCES: Palabra clave SQL que define a qué tabla/columna apunta la FK.
  • ON DELETE CASCADE: Cuando se elimina el registro padre, los registros hijos se eliminan automáticamente.
  • Integridad referencial: Garantiza que toda FK apunte a un registro existente en la tabla padre.

HAZLO

  • Usa SERIAL o UUID para las PK
  • Define las FKs con REFERENCES
  • Piensa en ON DELETE de antemano

NO HAGAS

  • Usar datos de negocio como PK (¡el CPF cambia!)
  • Ignorar FKs por "rendimiento"
  • Usar CASCADE sin pensar
-- PK: identifica o cliente
CREATE TABLE cliente (
  id    SERIAL PRIMARY KEY,
  nome  TEXT NOT NULL,
  email TEXT UNIQUE
);

-- FK: conecta pedido ao cliente
CREATE TABLE pedido (
  id         SERIAL PRIMARY KEY,
  cliente_id INT NOT NULL REFERENCES cliente(id)
               ON DELETE CASCADE,
  total      NUMERIC(10,2) NOT NULL,
  criado_em  TIMESTAMP DEFAULT NOW()
);

-- Tentativa de inserir pedido com cliente inexistente:
-- INSERT INTO pedido (cliente_id, total) VALUES (999, 50.00);
-- ERRO: violacao de chave estrangeira!
3

Restricciones de integridad

Las restricciones son reglas declarativas en el esquema que impiden que entren datos no válidos en la base de datos. Son la última línea de defensa garantiza la integridad, aunque la aplicación tenga errores. La base de datos rechaza los datos que infringen las restricciones.

Tipos de restricciones

  • NOT NULL: La columna no acepta valores nulos. Obliga a completar el campo.
  • UNIQUE: Impide valores duplicados en la columna (pero acepta varios NULL).
  • CHECK: Valida que el valor cumpla una condición. Ej.: CHECK (idade >= 0)
  • DEFAULT: Define un valor predeterminado cuando no se proporciona ninguno en INSERT.

Validación en capas

La buena práctica es validar en varias capas: frontend (UX rápida), backend (reglas de negocio), y base de datos (última defensa). Nunca confíes solo en la validación del frontend. La base de datos es la única capa que controlas al 100%.

CREATE TABLE produto (
  id        SERIAL PRIMARY KEY,
  nome      TEXT NOT NULL,                    -- obrigatorio
  sku       TEXT UNIQUE NOT NULL,             -- unico e obrigatorio
  preco     NUMERIC(10,2) NOT NULL
            CHECK (preco > 0),               -- deve ser positivo
  estoque   INT NOT NULL DEFAULT 0
            CHECK (estoque >= 0),            -- nao pode ser negativo
  ativo     BOOLEAN DEFAULT true              -- padrao: ativo
);

-- Tentativas que o banco REJEITA:
-- INSERT INTO produto (nome, sku, preco) VALUES ('X', 'ABC', -10);
-- ERRO: violacao de CHECK (preco > 0)

-- INSERT INTO produto (sku, preco) VALUES ('DEF', 25.00);
-- ERRO: violacao de NOT NULL (nome)
4

Normalización (1FN a 3FN)

La normalización es el proceso de reorganizar tablas para eliminar redundancia y evitar anomalías. Sigue etapas progresivas llamadas formas normales. En la práctica, llegar hasta la 3FN resuelve la mayoría de los problemas.

Las tres formas normales

  • 1FN (Atomicidad): Cada celda contiene un valor único e indivisible. Nada de listas en una columna. Por ejemplo: en vez de telefones: "11-9999, 11-8888", crea una tabla telefone separada.
  • 2FN (Sin dependencia parcial): Todo atributo que no sea clave depende de la clave primaria completa, no de una parte de ella. Es relevante cuando la PK es compuesta.
  • 3FN (Sin dependencia transitiva): Ningún atributo no clave depende de otro atributo no clave. Si A depende de B y B depende de C, mueve B a su propia tabla.

En la práctica

Las tablas no normalizadas causan tres tipos de anomalías: inserción (no puedo insertar un dato sin el otro), actualización (tengo que actualizar en N lugares) y eliminación (pierdo datos que no quería). La normalización elimina las tres.

-- ANTES (nao normalizado, violando 1FN):
-- | id | nome | telefones          |
-- | 1  | Ana  | 11-9999, 11-8888   |  <- lista em uma celula!

-- DEPOIS (normalizado, 1FN):
CREATE TABLE cliente (
  id   SERIAL PRIMARY KEY,
  nome TEXT NOT NULL
);

CREATE TABLE telefone (
  id         SERIAL PRIMARY KEY,
  cliente_id INT REFERENCES cliente(id),
  numero     TEXT NOT NULL
);

-- Cada telefone e um registro separado
INSERT INTO telefone (cliente_id, numero) VALUES (1, '11-9999');
INSERT INTO telefone (cliente_id, numero) VALUES (1, '11-8888');
5

Modelado ER

Antes de escribir SQL, modelas. El Diagrama entidad-relación (ER) es el plano de la base de datos. Muestra qué entidades existen, qué atributos tiene cada una y cómo se relacionan entre sí.

Componentes del diagrama ER

  • Entidad: Objeto del mundo real (Cliente, Pedido, Producto). Se convierte en una tabla en la base de datos.
  • Atributo: Propiedad de la entidad (nombre, precio, fecha). Se convierte en columna.
  • Relación: Conexión entre entidades. Ej.: Cliente hace Solicitud.
  • Cardinalidad: Cuántos de un lado se relacionan con el otro:
    • 1:1 - Uno a uno (persona y CPF)
    • 1:N - Uno a muchos (cliente y pedidos)
    • N:N - Muchos a muchos (alumno y asignatura; necesita una tabla intermedia)

Consejo práctico

Siempre modela antes de crear tablas. Usa herramientas como dbdiagram.io, draw.io o incluso papel y lápiz. Un buen diagrama ER ahorra horas de refactorización. Recuerda: una relación N:N siempre necesita una tabla asociativa (tabla puente).

-- Exemplo de N:N: aluno cursa disciplina
-- Precisa de tabela associativa "matricula"

CREATE TABLE aluno (
  id   SERIAL PRIMARY KEY,
  nome TEXT NOT NULL
);

CREATE TABLE disciplina (
  id   SERIAL PRIMARY KEY,
  nome TEXT NOT NULL
);

-- Tabela ponte (resolve o N:N)
CREATE TABLE matricula (
  aluno_id      INT REFERENCES aluno(id),
  disciplina_id INT REFERENCES disciplina(id),
  semestre      TEXT NOT NULL,
  PRIMARY KEY (aluno_id, disciplina_id, semestre)
);
6

Cuándo usar una base de datos relacional

Una base de datos relacional no es la respuesta para todo. Saber cuándo usarlo y cuándo no es tan importante como saber SQL. La elección correcta depende de la naturaleza de los datos y de los requisitos del sistema.

Cuándo una base de datos relacional es ideal

  • OLTP: Sistemas transaccionales (comercio electrónico, ERP, bancario). Muchas escrituras pequeñas con integridad sólida.
  • Datos estructurados: Cuando el esquema está bien definido y cambia poco.
  • Integridad sólida: Cuando los errores en los datos son costosos (finanzas, salud, asuntos legales).
  • Relaciones complejas: Cuando los datos se relacionan de distintas formas y necesitas JOINs.

USA UNA BASE DE DATOS RELACIONAL

  • Transacciones financieras
  • Registros con reglas estrictas
  • Datos con muchas relaciones
  • Informes SQL complejos

CONSIDERA ALTERNATIVAS

  • Logs de alto volumen (usa series temporales)
  • Datos semiestructurados (usa documentos/JSON)
  • Caché de sesión (usa clave-valor)
  • Grafos sociales (usa una base de datos de grafos)

Regla de oro

Si tienes dudas, empieza con una base de datos relacional. PostgreSQL y MySQL cubren el 80% de los casos de uso. Migra a NoSQL solo cuando tengas un problema real de escala o de formato que una base de datos relacional no resuelva bien. "La optimización prematura es la raíz de todos los males."

Resumen del módulo 1.1

Modelo relacional: tablas, filas, columnas, dominios
PK identifica, FK conecta, la integridad referencial protege
Las restricciones (UNIQUE, NOT NULL, CHECK, DEFAULT) protegen los datos
La normalización (1FN-3FN) elimina redundancia y anomalías
Diagrama ER: modela antes de programar
Relacional es ideal para OLTP, datos estructurados e integridad sólida