Ficha 01 · ER e cardinalidades
- Identificar entidades e atributos
- Determinar cardinalidades
- Desenhar diagramas ER
- Resolver N:M
Parte I · Identificar entidades
Exercício 1 · Da descrição ao modelo (20 pts)
Lê o seguinte requisito e identifica entidades, atributos e relações:
"Uma escola tem vários professores, cada um com nome, email e disciplina principal. Cada professor lecciona uma ou mais turmas. Cada turma tem um código, ano lectivo e vários alunos (cada aluno tem número, nome e data de nascimento). Cada aluno pertence a apenas uma turma de cada vez."
a) Lista as 3 entidades (5 pts).
b) Para cada entidade, lista atributos (10 pts).
c) Indica cardinalidades (5 pts).
a) Entidades: Professor, Turma, Aluno.
b) Atributos: - Professor: id (PK), nome, email, disciplina. - Turma: id (PK), codigo, ano_lectivo. - Aluno: id (PK), numero, nome, data_nascimento.
c) Cardinalidades: - Professor ↔ Turma → N:M (um professor lecciona várias turmas; uma turma pode ter vários professores se for de várias disciplinas). - Turma ↔ Aluno → 1:N (uma turma tem vários alunos; cada aluno pertence a uma turma).
Exercício 2 · Cardinalidades (15 pts)
Para cada situação, indica 1:1, 1:N ou N:M:
a) Pessoa ↔ Cartão Cidadão ___
b) Cliente ↔ Encomenda ___
c) Aluno ↔ Disciplina ___
d) País ↔ Capital ___
e) Autor ↔ Livro ___
a) 1:1 — cada pessoa tem 1 CC; cada CC pertence a 1 pessoa. b) 1:N — cliente faz várias encomendas; cada encomenda tem 1 cliente. c) N:M — aluno faz várias disciplinas; disciplina tem vários alunos. d) 1:1 — cada país tem 1 capital; cada capital pertence a 1 país. e) N:M — autor escreve vários livros; livro pode ter vários autores.
Parte II · Resolver N:M
Exercício 3 · Tabela de associação (20 pts)
Modela o caso Aluno ↔ Disciplina com nota e ano lectivo associados.
a) Desenha as 3 tabelas necessárias (com colunas). (15 pts)
b) Justifica porque é que nota e ano_lectivo ficam na tabela de associação, não nas outras. (5 pts)
a) Tabelas:
Aluno (id PK, nome, num_aluno)
Disciplina (id PK, nome, codigo)
Inscricao (
aluno_id FK,
disciplina_id FK,
ano_lectivo,
nota,
PRIMARY KEY (aluno_id, disciplina_id, ano_lectivo)
)
b) nota e ano_lectivo são propriedades da relação, não do aluno nem da disciplina isoladamente. A nota só faz sentido quando se relaciona um aluno com uma disciplina num ano. Pôr na tabela Aluno daria um valor por aluno; pôr em Disciplina daria um valor por disciplina. Tem de ficar onde ambos se encontram: na tabela de associação.
A PK composta inclui ano_lectivo porque um aluno pode repetir a mesma disciplina em anos diferentes.
Parte III · Chaves
Exercício 4 · Escolher PK (15 pts)
Para cada entidade, identifica uma boa chave primária e justifica:
a) Cliente (nome, email, telefone). ___
b) Município (nome, distrito, código DGT). ___
c) Inscricao (aluno_id, disciplina_id, ano). ___
d) Livro (isbn, titulo, autor). ___
a) PK artificial id INT AUTO_INCREMENT — email é único mas pode mudar; nome pode repetir. PK sintética é a prática moderna recomendada.
b) codigo_dgt (chave natural) ou id artificial. Nome pode haver repetidos em distritos diferentes.
c) PK composta (aluno_id, disciplina_id, ano) — chave natural composta. Faz sentido aqui porque a combinação já é única e não há motivo para PK artificial.
d) isbn (chave natural) — globalmente único, normalizado internacionalmente. Em sistemas pequenos, id artificial também serve.
Parte IV · Cenário
Exercício 5 · Modelar biblioteca (30 pts)
Pretende-se modelar uma biblioteca municipal. Requisitos:
- Catálogo de livros (título, autor, ISBN, ano, editora).
- Vários exemplares físicos do mesmo livro (cada um com código de barras único).
- Sócios (id, nome, email).
- Empréstimos: um sócio leva um exemplar com data de saída e data prevista de retorno; quando devolve, regista-se data efectiva.
a) Identifica as entidades (5 pts).
b) Desenha tabelas com colunas, PK e FK (20 pts).
c) Indica restrições adicionais úteis (5 pts).
a) Entidades: Livro, Exemplar, Socio, Emprestimo.
(Autor e Editora podiam ser entidades separadas se quisermos modelar relação N:M com livros — versão mais completa.)
b) Modelo:
CREATE TABLE Livro (
id INT PRIMARY KEY AUTO_INCREMENT,
isbn VARCHAR(20) UNIQUE,
titulo VARCHAR(200) NOT NULL,
autor VARCHAR(150),
ano INT,
editora VARCHAR(100)
);
CREATE TABLE Exemplar (
id INT PRIMARY KEY AUTO_INCREMENT,
codigo_barras VARCHAR(30) UNIQUE NOT NULL,
livro_id INT NOT NULL,
estado ENUM('disponivel','emprestado','perdido') DEFAULT 'disponivel',
FOREIGN KEY (livro_id) REFERENCES Livro(id)
);
CREATE TABLE Socio (
id INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(150) NOT NULL,
email VARCHAR(150) UNIQUE
);
CREATE TABLE Emprestimo (
id INT PRIMARY KEY AUTO_INCREMENT,
socio_id INT NOT NULL,
exemplar_id INT NOT NULL,
data_saida DATE NOT NULL,
data_prevista_retorno DATE NOT NULL,
data_efectiva_retorno DATE,
FOREIGN KEY (socio_id) REFERENCES Socio(id),
FOREIGN KEY (exemplar_id) REFERENCES Exemplar(id)
);
c) Restrições úteis:
- CHECK (data_prevista_retorno > data_saida).
- CHECK (data_efectiva_retorno IS NULL OR data_efectiva_retorno >= data_saida).
- Trigger ou aplicação que actualiza Exemplar.estado para 'emprestado' ao criar empréstimo, e 'disponivel' ao registar retorno.
- Limitar um empréstimo activo por exemplar (regra de aplicação ou índice parcial: UNIQUE (exemplar_id) WHERE data_efectiva_retorno IS NULL em PostgreSQL).