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

erDiagram A ||--|| B : possui A { int id_B PK } B { int id_A PK }

Cardinalide 1:N

erDiagram A ||--o{ B : possui A { int id PK } B { int id PK int id_A FK }

Cardinalide N:N

erDiagram A }o--o{ B : possui A { int id PK } B { int id PK }

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.

erDiagram PESSOAS ||--|| CPF : possui PESSOAS { int numero_cpf PK string nome } CPF { string numero_cpf PK }

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.

erDiagram PESSOAS ||--|| FOTO : possui PESSOAS { int id PK string nome } FOTO { int id_pessoa PK blob imagem }

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.

erDiagram SEXO ||--o{ PESSOAS : possui SEXO { int id PK string descricao } PESSOAS { int id PK int id_sexo FK string nome }

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.

erDiagram ALUNO }o--o{ DISCIPLINA : matricula ALUNO { string nome } DISCIPLINA { string nome }

Expressão relacional:

(matricula.id_aluno = aluno.id)

(matricula.id_disciplina = disciplina.id)

Exemplo sistema acadêmico:

erDiagram ALUNO ||--o{ MATRICULA : possui DISCIPLINA ||--o{ MATRICULA : recebe ALUNO { int id PK string nome } MATRICULA { int id PK int aluno_id FK int disciplina_id FK string semestre float nota } DISCIPLINA { int id PK string nome int professor_id FK }

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.

erDiagram PRODUTO }o--o{ NOTA_FISCAL : compoe PRODUTO { int id PK string nome float preco } NOTA_FISCAL { string numero date data_emissao float total }

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;