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.
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.
cliente, pedidoPiensa 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');
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.
-- 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!
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.
CHECK (idade >= 0)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)
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.
telefones: "11-9999, 11-8888", crea una tabla telefone separada.
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');
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í.
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)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)
);
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.
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."