Imagina que você tem duas tabelas: uma com dados dos estudantes e outra com dados dos cursos. Como você acha que dá pra mostrar quais estudantes estão inscritos em quais cursos? Dá pra colocar uma coluna na tabela de estudantes pra guardar todos os cursos que eles estão inscritos, mas isso vira bagunça rapidinho. Uma das melhores soluções é usar chaves estrangeiras!
Chave estrangeira (FOREIGN KEY) é uma coluna ou um conjunto de colunas que serve pra criar uma ligação entre tabelas. Ela aponta pra uma coluna (geralmente o PRIMARY KEY) em outra tabela, garantindo a integridade referencial dos dados entre elas. Então, se um estudante tá inscrito num curso, a gente pode ter certeza que esse curso realmente existe.
Chaves estrangeiras:
- Te ajudam a manter a integridade dos dados, garantindo que os registros em uma tabela correspondam aos dados em outra.
- Deixam o banco de dados mais organizado e lógico.
- Facilitam o trabalho com os dados, evitando duplicidade e erros.
Exemplo da vida real
Pensa numa biblioteca. A tabela books tem a lista de livros, e a tabela members tem a lista de leitores. Pra saber quem pegou qual livro, a gente pode criar uma tabela borrowed_books, que vai referenciar books e members usando chaves estrangeiras. Assim, toda vez que alguém pega um livro, a gente sabe exatamente quem foi e qual livro pegou.
Tipos de relacionamentos entre tabelas
Chaves estrangeiras permitem descrever diferentes tipos de relacionamentos entre tabelas. Bora ver três tipos principais:
1. Relacionamento "Um-para-Um" (ONE-TO-ONE)
Esse é o mais simples: um registro em uma tabela corresponde exatamente a um registro em outra tabela. Por exemplo, a tabela users pode ter informações dos usuários, e a tabela profiles pode ter informações extras, tipo endereço ou foto deles.
Exemplo de SQL pra relacionamento ONE-TO-ONE:
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
username TEXT NOT NULL
);
CREATE TABLE profiles (
profile_id SERIAL PRIMARY KEY,
user_id INT UNIQUE REFERENCES users(user_id), -- referencia users.user_id
address TEXT
);
Aqui a coluna user_id na tabela profiles funciona como chave estrangeira, apontando pra user_id na tabela users.
Exemplo da tabela users:
| user_id - PRIMARY KEY | username |
|---|---|
| 1 | alice |
| 2 | bob |
| 3 | charlie |
Exemplo da tabela profiles:
| profile_id - PRIMARY KEY | user_id - FOREIGN KEY | endereço |
|---|---|---|
| 1 | 1 | Berlin, Germany |
| 2 | 2 | Paris, France |
| 3 | 3 | Tokyo, Japan |
2. Relacionamento "Um-para-Muitos" (ONE-TO-MANY)
Esse é o mais comum. Por exemplo, um cliente pode fazer vários pedidos. Nesse caso, a tabela customers vai se ligar à tabela orders usando uma chave estrangeira.
Exemplo de SQL pra relacionamento ONE-TO-MANY:
CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INT REFERENCES customers(customer_id), -- referencia customers.customer_id
order_date DATE NOT NULL
);
A tabela orders pode ter vários registros apontando pra um registro só na tabela customers
Exemplo da tabela customers:
| customer_id - PRIMARY KEY | nome |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
Exemplo da tabela orders:
| order_id - PRIMARY KEY | customer_id - FOREIGN KEY | data_do_pedido |
|---|---|---|
| 1 | 1 | 2024-12-01 |
| 2 | 1 | 2024-12-05 |
| 3 | 2 | 2024-12-03 |
| 4 | 3 | 2024-12-07 |
3. Relacionamento "Muitos-para-Muitos" (MANY-TO-MANY)
Às vezes, um registro numa tabela pode estar ligado a vários registros em outra tabela, e vice-versa. Por exemplo, estudantes se inscrevem em cursos, e um curso pode ter vários estudantes. Pra isso, normalmente a gente cria uma tabela intermediária.
Exemplo de SQL pra relacionamento MANY-TO-MANY:
-- estudantes
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
-- cursos
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
title TEXT NOT NULL
);
-- "inscrição de um estudante em um curso"
CREATE TABLE enrollments (
student_id INT REFERENCES students(student_id), -- referencia id do estudante
course_id INT REFERENCES courses(course_id), -- referencia id do curso
PRIMARY KEY (student_id, course_id)
);
Aqui a tabela enrollments faz o papel de "ponte" entre as tabelas students e courses.
Exemplo da tabela students:
| student_id - PRIMARY KEY | nome |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
Exemplo da tabela courses:
| course_id - PRIMARY KEY | título |
|---|---|
| 1 | SQL Básico |
| 2 | Estruturas de Dados |
| 3 | Algoritmos |
Exemplo da tabela enrollments:
| student_id - FOREIGN KEY | course_id - FOREIGN KEY |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 3 | 3 |
Vantagens de usar chaves estrangeiras
- Os dados ficam consistentes. Se a chave estrangeira apontar pra um registro que não existe, o PostgreSQL não deixa inserir ou atualizar os dados.
- Facilita o trabalho com tabelas. Chaves estrangeiras deixam fácil conectar dados entre tabelas e fazer queries mais complexas, tipo
JOIN. - Comportamento automático. Dá pra configurar o que acontece quando você deleta ou atualiza registros relacionados (tipo deletar em cascata, colocar
NULLetc).
Como é uma chave estrangeira no PostgreSQL?
Sintaxe pra criar uma chave estrangeira quando você cria a tabela:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INT REFERENCES customers(customer_id) -- chave estrangeira
);
Aqui:
customer_id— é a chave estrangeira.- Ela aponta pra
customer_idna tabelacustomers.
Você também pode declarar a chave estrangeira explicitamente usando FOREIGN KEY:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
Curiosidade
O termo "chave estrangeira" (FOREIGN KEY) veio da teoria dos bancos de dados relacionais, criada nos anos 1970 pelo Edgar Codd. Incrível como a ideia é tão forte que até hoje é parte fundamental dos bancos de dados modernos. Quem disse que clássico sai de moda?
Agora você já sabe o que é uma chave estrangeira e porque ela é tão importante. Ainda vai aprender como criar elas na hora de criar tabelas e como usar direito as operações em cascata. Mas isso fica pras próximas aulas!
GO TO FULL VERSION