Integridade Referencial e Cardinalidade
Integridade referencial garante que os relacionamentos entre tabelas sejam válidos, evitando registros órfãos e inconsistências.
O relacionamento efetiva-se através de uma expressão relacional que indica como deve ser feita a comparação entre os campos comuns às Entidades, só que agora com uma característica diferente. A comparação é realizada entre campos das entidades e campos do relacionamento, formando uma expressão composta:
(sexo.id = pessoas.id_sexo)
- Tabela sexo: id PK (chave primária)
- Tabela pessoas: id_sexo FK (chave estrangeira)
(atendentes.id_pessoa = pessoas.id)
- Tabela atendentes: id_pessoa PK (chave estrangeira)
- Tabela pessoas: id PK (chave primária)
Observação: Utilize a estrutura de tabelas da aula Restrições de Integridade
O que é Cardinalidade?
Cardinalidade define quantas ocorrências de uma entidade podem se relacionar com outra em um relacionamento.
Cardinalide 1:1
Cardinalide 1:N
Cardinalide N:N
Sintaxe dos relacionamentos
- Valor esquerda - Valor Direita - Siginificado
|o-o|: Zero ou um||-||:Exatamente um}o-o{:Zero ou mais (sem limite)}|-|{:One ou mais (sem limite)
Tipos de Cardinalidade
1:1 (Um para Um)
Cada elemento de uma entidade se relaciona com no máximo um elemento da outra.
Exemplo - Pessoas e CPF:
Uma pessoa tem no máximo um CPF, e um CPF pertence a no máximo uma pessoa.
Expressão relacional:
(pessoas.numero_cpf = cpf.numero_cpf)
Exemplo - Pessoas e Foto:
Uma pessoa tem no máximo uma foto, e um foto pertence a no máximo uma pessoa.
Expressão relacional:
(pessoas.id = foto.id_pessoa)
1:N (Um para Muitos)
Um elemento da entidade A se relaciona com múltiplos elementos da entidade B, mas cada elemento de B se relaciona com apenas um de A.
Exemplo de 1:N (Sexo e pessoas)
Um campo Sexo pode ter várias pessoas, e cada pessoa pertence a apenas um sexo.
Expressão relacional:
(sexo.id = pessoas.id_sexo)
N:N (Muitos para Muitos)
Instâncias de ambas as entidades podem se relacionar com múltiplas instâncias da outra.
Exemplo de N:N (Aluno e Disciplina)
Um aluno pode se matricular em várias disciplinas, e uma disciplina pode ter vários alunos matriculados.
Expressão relacional:
(matricula.id_aluno = aluno.id)
(matricula.id_disciplina = disciplina.id)
Exemplo sistema acadêmico:
Expressão relacional:
matricula.aluno_id = aluno.id
matricula.disciplina_id = disciplina.id
Perceba que a tabela MATRICULA é uma tabela associativa criada para representar o relacionamento N:N entre ALUNO e DISCIPLINA. Ela possui como chaves primárias compostas as chaves das tabelas envolvidas, permitindo registrar cada matrícula de aluno em disciplina de forma única e garantindo a integridade referencial entre as entidades.
Comandos SQL:
CREATE TABLE professor (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL
);
CREATE TABLE disciplina (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
professor_id INT REFERENCES professor(id)
);
CREATE TABLE aluno (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL
);
CREATE TABLE matricula (
id SERIAL PRIMARY KEY,
aluno_id INT REFERENCES aluno(id),
disciplina_id INT REFERENCES disciplina(id),
semestre VARCHAR(20),
nota NUMERIC(4,2),
UNIQUE (aluno_id, disciplina_id, semestre)
);
Exemplo clássico de N:N (Produto e Nota Fiscal)
Um produto pode aparecer em várias notas fiscais, e uma nota fiscal pode conter vários produtos.
Expressão relacional:
(produto_nota.id_produto = produto.id)
(produto_nota.id_nota = nota_fiscal.id)
Esses exemplos mostram como cardinalidade e integridade referencial são aplicadas na modelagem de dados.
Consultas de Relacionamento
SELECT p.nome, s.descricao
FROM pessoas p
JOIN sexo s ON p.id_sexo = s.id;
SELECT p.nome, f.imagem
FROM pessoas p
JOIN foto f ON p.id = f.id_pessoa;
SELECT a.nome, d.nome, m.semestre, m.nota
FROM aluno a
JOIN matricula m ON a.id = m.aluno_id
JOIN disciplina d ON m.disciplina_id = d.id;