Partilhar: WhatsApp
aulify
UC UC00602 · T. Desenv. Software, T. Inform. Gestão

Ficha 01 · ER e cardinalidades

Modelar entidades, atributos e relações
Versão · Aluno
Tempo · 45 minutos
Cotação · 100 pontos
Aluno(a)
Turma
Data
Objectivos da ficha

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:

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).