O Modelo Relacional representa dados em tabelas (relações). Cada linha é uma tupla; cada coluna, um atributo. Proposto por E. F. Codd (IBM, 1970).
Conjunto de tuplas com o mesmo esquema. Nome único no banco.
Uma ocorrência / instância da relação. Não há ordem entre tuplas.
Propriedade com nome e domínio. Valores atômicos (sem repetição).
Identifica unicamente cada tupla. Não pode ser NULL.
Referencia a PK de outra tabela. Garante integridade referencial.
O DER é um modelo conceitual. O Modelo Relacional é lógico. O mapeamento traduz um para o outro seguindo regras.
Entidade, Atributo, Relacionamento, Cardinalidade, Especialização
Tabela, Coluna, PK, FK, Restrições
Cada entidade forte do DER vira uma tabela. Seus atributos viram colunas. O atributo identificador vira a chave primária.
Atributos multivalorados NÃO viram colunas diretamente — geram uma tabela auxiliar com FK para a entidade-pai.
A chave primária do lado 1 migra como chave estrangeira para a tabela do lado N.
| codTurma | sala | horario |
|---|---|---|
| T01 | Lab 2 | Ter 7h30 |
| T02 | 205 | Qui 9h10 |
| matricula | nome | codTurma (FK) |
|---|---|---|
| 2024001 | Ana | T01 |
| 2024002 | Bia | T01 |
| 2024003 | Carlos | T02 |
codTurma na tabela Aluno é a FK — cada aluno pertence a uma turma, mas uma turma tem vários alunos.
Relacionamentos N:M geram uma tabela associativa cujas colunas são as chaves primárias das duas entidades participantes (formando uma PK composta).
Exemplo: Aluno se matricula em várias Disciplinas; cada disciplina tem vários alunos.
| Tabela | Colunas | Observação |
|---|---|---|
| Aluno | matricula, nome | PK: matricula |
| Disciplina | codDisc, nome, carga | PK: codDisc |
| Matricula | matricula, codDisc, nota, semestre | PK composta; FKs p/ Aluno e Disciplina |
Atributos do relacionamento (ex.: nota) ficam na tabela associativa.
| matricula | nome |
|---|---|
| 2024001 | Ana |
| 2024002 | Bia |
| 2024003 | Carlos |
| codDisc | nome | carga |
|---|---|---|
| BD1 | Banco de Dados I | 60h |
| POO | Prog. Orientada a Obj. | 60h |
| matricula | codDisc | nota |
|---|---|---|
| 2024001 | BD1 | 8.5 |
| 2024001 | POO | 7.0 |
| 2024002 | BD1 | 9.0 |
| 2024003 | POO | 6.5 |
PK de Matricula é composta: matricula + codDisc. Ambas são também FKs. A nota (atributo do relacionamento) fica na tabela associativa.
Um Funcionário (CPF, nome) é alocado em exatamente uma Sala (número, andar). Cada sala pertence a no máximo um funcionário.
Como ficam as tabelas? Onde vai a FK?
Um Funcionário (CPF, nome) pode ter vários Dependentes (nome, parentesco, dataNasc). Dependente não existe sem o funcionário.
Qual é a PK da tabela Dependente?
Escreva as tabelas no formato: NomeTabela(PK, col1, col2, FK)
Funcionario(CPF, nome, numSala)
Sala(numero, andar)
FK numSala em Funcionário (lado com participação total). Sala pode existir sem funcionário; funcionário sempre tem sala.
Funcionario(CPF, nome)
Dependente(cpfFunc, nome, parentesco, dataNasc)
PK composta: CPF do funcionário (FK) + nome do dependente. Sem o funcionário, o dependente não existe.
Regra geral: na entidade fraca, a PK = FK da entidade forte + chave parcial da entidade fraca.
| pedidoID | clienteNome | clienteEmail | produtoNome | categoria | preco |
|---|---|---|---|---|---|
| 1 | Ana | ana@x.com | Notebook | Eletrônicos | 3200 |
| 2 | Ana | ana@x.com | Mouse | Eletrônicos | 80 |
| 3 | Bruno | bru@y.com | Notebook | Eletrônicos | 3200 |
Não posso cadastrar produto sem pedido associado.
Mudar o e-mail de Ana exige atualizar múltiplas linhas.
Remover o pedido 3 apaga informação do produto Notebook.
Dizemos que X → Y (X determina Y) quando, para cada valor de X, existe exatamente um valor de Y.
matricula → nome, email — matrícula determina nome e e-mail do alunocodProduto → descricao, preco — código determina o produto{pedidoID, codProduto} → quantidade — chave composta determina a quantidadeY depende de parte de uma chave composta. Viola a 2FN.
X → Z via Y (X → Y → Z, Y não é chave). Viola a 3FN.
Uma relação está em 1FN quando todos os seus atributos contêm apenas valores atômicos (indivisíveis) e não há grupos repetitivos.
Pedido(pedidoID, cliente, itens: {prod1, prod2, ...})
Atributo multivalorado dentro da tupla.
Pedido(pedidoID, cliente)
ItemPedido(pedidoID, codProd, qtd)
Cada célula tem um único valor.
Uma relação está em 2FN se está em 1FN e todo atributo não-chave depende funcionalmente da chave primária inteira (sem dependências parciais).
⚠️ Só é relevante quando a chave primária é composta.
ItemPedido(pedidoID, codProd, qtd, nomeProd, preco)
nomeProd e preco dependem só de codProd, não da chave inteira.
ItemPedido(pedidoID, codProd, qtd)
Produto(codProd, nomeProd, preco)
Dependência parcial removida.
Uma relação está em 3FN se está em 2FN e não há dependências transitivas: nenhum atributo não-chave depende de outro atributo não-chave.
Funcionario(id, nome, codDept, nomeDept)
id → codDept → nomeDept. nomeDept depende de codDept (não da PK diretamente).
Funcionario(id, nome, codDept)
Departamento(codDept, nomeDept)
Dependência transitiva removida.
Regra prática: "Todo atributo não-chave deve depender da chave, de toda a chave, e somente da chave."
| Forma Normal | Condição eliminada | Como resolver |
|---|---|---|
| 1FN | Valores não-atômicos / grupos repetitivos | Extrair em nova tabela com FK |
| 2FN | Dependência parcial da chave composta | Separar atributo + parte da chave em nova tabela |
| 3FN | Dependência transitiva (não-chave → não-chave) | Extrair o determinante em nova tabela com FK |
Normalizar = eliminar redundância + preservar dados + manter integridade.
Tabela original (não normalizada):
| pedidoID | data | clienteNome | clienteCidade | produtos (lista) |
|---|---|---|---|---|
| 101 | 2026-04-01 | Ana | Belém | Notebook, Mouse |
Separar produtos em ItemPedido(pedidoID, codProd, qtd). Pedido(pedidoID, data, clienteNome, clienteCidade).
nomeProd / preco dependem só de codProd → Produto(codProd, nome, preco).
clienteCidade depende de clienteNome, não de pedidoID → Cliente(codCliente, nome, cidade). Pedido recebe codCliente (FK).
Um hospital tem médicos (CRM, nome, especialidade) que atendem pacientes (CPF, nome, cidade). Cada atendimento tem uma data e diagnóstico. Um paciente pode ser atendido por vários médicos; um médico atende vários pacientes.
Quais entidades? Qual cardinalidade do relacionamento? Há entidade fraca?
Converta para tabelas relacionais com PKs e FKs. Onde fica o atributo diagnóstico?
Suas tabelas estão em 3FN? Identifique e elimine dependências parciais ou transitivas.
📖 Heuser, cap. 4–5 | Silberschatz, cap. 7