Pular para o conteúdo principal

Questão de Banco de Dados — Modelagem e Mapeamento ER-relacional — FGV 2024

Banco de DadosModelagem e Mapeamento ER-relacional
Código
fg165247
Banca
FGV
Órgão
TJ MS
Ano
2024
Cargo
Tec NS ( )
João está encarregado de projetar um banco de dados PostgreSQL para gerenciar informações de cursos universitários, segundo o modelo lógico simplificado:   Para assegurar a unicidade dos dados, João deverá garantir que cada "Aluno" possa realizar a "Matricula" em uma "Disciplina" apenas uma vez.   Para tanto, ele deverá evitar a duplicidade de matrículas e criar a restrição de integridade:Imagem associada para resolução da questão
  1. Achave única em Matricula para o atributo (IDMatricula);
  2. Bchave primária em Matricula para o atributo (IDMatricula);
  3. Cchave única em Matricula para os atributos (IDAluno, IDDisciplina);
  4. Dchave estrangeira em Matricula para os atributos (IDAluno, IDDisciplina);
  5. Echave primária em Matrícula para os atributos (IDMatricula, IDAluno, IDDisciplina).
Revelar gabarito e comentário

GabaritoC — chave única em Matricula para os atributos (IDAluno, IDDisciplina);

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Restrições de Integridade e Unicidade em Banco de Dados Relacional

Gabarito: letra C. Para garantir que um aluno não se matricule duas vezes na mesma disciplina, é necessário criar uma chave única (UNIQUE) sobre a combinação dos atributos (IDAluno, IDDisciplina) na tabela Matricula. Essa restrição impede a duplicidade de pares aluno-disciplina, assegurando a unicidade exigida no enunciado.

O problema apresentado é um clássico de modelagem de banco de dados relacional: como garantir que uma combinação específica de valores não se repita em uma tabela. A resposta envolve o conceito de chave única (UNIQUE), que é uma restrição de integridade que garante que todos os valores de um atributo (ou combinação de atributos) sejam distintos. Diferente da chave primária, que identifica cada linha de forma única e não pode conter valores nulos, a chave única também impede duplicatas, mas permite valores nulos (em bancos que seguem o padrão SQL, como o PostgreSQL).

No cenário descrito, a tabela Matricula relaciona um Aluno a uma Disciplina. A necessidade é que cada par (IDAluno, IDDisciplina) apareça apenas uma vez. Isso não é resolvido por uma chave primária simples em IDMatricula, pois essa chave apenas garante que cada matrícula tenha um identificador único, mas não impede que o mesmo aluno se matricule na mesma disciplina duas vezes (gerando dois registros com IDMatricula diferentes, mas com o mesmo par de IDAluno e IDDisciplina). A solução correta é aplicar a restrição UNIQUE sobre a combinação desses dois atributos, criando uma chave única composta.

Na prática, em SQL, isso seria feito com o comando:

ALTER TABLE Matricula ADD CONSTRAINT uk_matricula UNIQUE (IDAluno, IDDisciplina);

Essa restrição garante que o banco de dados rejeite qualquer tentativa de inserir uma nova matrícula que já exista para o mesmo aluno e a mesma disciplina, cumprindo exatamente o requisito de unicidade.

A distinção crucial aqui é entre chave primária e chave única. A chave primária é usada para identificar unicamente cada registro na tabela, enquanto a chave única é usada para garantir que valores específicos não se repitam, mesmo que não sejam o identificador principal. No caso, a chave primária IDMatricula já existe para identificar cada matrícula, mas a unicidade do par (IDAluno, IDDisciplina) é uma regra de negócio adicional que deve ser imposta por uma chave única.

A banca explora a confusão entre esses dois conceitos. O candidato pode pensar que a chave primária em IDMatricula resolve o problema, mas ela não impede a duplicidade lógica. A alternativa correta é a que aplica a restrição UNIQUE sobre os atributos que devem ser únicos em conjunto.

Critério

Chave Única em (IDAluno, IDDisciplina) — Gabarito (C)

Chave Primária em IDMatricula (B)

Chave Única em IDMatricula (A)

Chave Estrangeira em (IDAluno, IDDisciplina) (D)

Chave Primária Composta (IDMatricula, IDAluno, IDDisciplina) (E)

Objetivo: impedir matrícula duplicada do mesmo aluno na mesma disciplina

✅ Impede, pois rejeita qualquer novo par (IDAluno, IDDisciplina) já existente

❌ Não impede — cada nova matrícula tem IDMatricula diferente, mesmo com mesmo par

❌ Não impede — mesma lógica da coluna anterior

❌ Apenas valida referências a Aluno/Disciplina; não impede repetição do par

❌ Não impede — IDMatricula diferente torna a combinação sempre única

Tipo de restrição

UNIQUE (chave única composta)

PRIMARY KEY (identifica a linha)

UNIQUE (identifica a linha, permite NULL)

FOREIGN KEY (relacionamento entre tabelas)

PRIMARY KEY composta (identifica a linha)

Permite NULL nos atributos da restrição?

Sim, em PostgreSQL (mas aqui IDAluno/IDDisciplina são FKs, normalmente NOT NULL)

Não

Sim

Não se aplica (FK referencia PK)

Não

Relação com a regra de negócio

Direta — é a regra de negócio em si

Indireta — apenas identifica registros

Indireta — apenas identifica registros

Nenhuma — não trata unicidade

Indireta — redundante e ineficaz para a regra

Exemplo SQL

ALTER TABLE Matricula ADD CONSTRAINT uk_matricula UNIQUE (IDAluno, IDDisciplina);

ALTER TABLE Matricula ADD PRIMARY KEY (IDMatricula);

ALTER TABLE Matricula ADD CONSTRAINT uq_matricula UNIQUE (IDMatricula);

ALTER TABLE Matricula ADD FOREIGN KEY (IDAluno) REFERENCES Aluno(IDAluno); (e similar para IDDisciplina)

ALTER TABLE Matricula ADD PRIMARY KEY (IDMatricula, IDAluno, IDDisciplina);

Alternativa A — ❌ Incorreta

Criar uma chave única apenas no atributo IDMatricula não resolve o problema. Isso apenas garante que cada IDMatricula seja único, mas não impede que o mesmo aluno se matricule na mesma disciplina duas vezes, pois cada nova matrícula teria um IDMatricula diferente. A unicidade exigida é sobre a combinação (IDAluno, IDDisciplina), não sobre o identificador da matrícula.

Alternativa B — ❌ Incorreta

Definir IDMatricula como chave primária é uma prática comum e necessária para identificar cada registro, mas não atende ao requisito de unicidade do par (IDAluno, IDDisciplina). A chave primária garante que cada IDMatricula seja único, mas não impede que o mesmo aluno se matricule na mesma disciplina mais de uma vez, pois cada matrícula teria um IDMatricula diferente.

Alternativa C — ✅ Correta ⟵ GABARITO

Aplicar uma chave única sobre os atributos (IDAluno, IDDisciplina) é exatamente o que garante que um aluno não possa se matricular duas vezes na mesma disciplina. Essa restrição impede a inserção de um novo registro com a mesma combinação de valores, assegurando a unicidade exigida. É a solução correta para o problema apresentado.

Alternativa D — ❌ Incorreta

Uma chave estrangeira é usada para estabelecer um relacionamento entre tabelas, referenciando a chave primária de outra tabela. Ela não serve para garantir a unicidade de valores dentro da própria tabela. No caso, IDAluno e IDDisciplina são chaves estrangeiras que referenciam as tabelas Aluno e Disciplina, mas isso não impede que o mesmo par se repita. A unicidade deve ser garantida por uma restrição UNIQUE, não por uma chave estrangeira.

Alternativa E — ❌ Incorreta

Definir uma chave primária composta por (IDMatricula, IDAluno, IDDisciplina) é desnecessário e não resolve o problema. A chave primária composta garantiria que a combinação de todos os três atributos fosse única, mas como IDMatricula já é único, a combinação também seria. No entanto, isso não impede que o mesmo aluno se matricule na mesma disciplina duas vezes, pois cada matrícula teria um IDMatricula diferente, tornando a combinação única mesmo com o mesmo par (IDAluno, IDDisciplina). Além disso, incluir IDMatricula na chave primária é redundante, pois ele já é único por si só.

Gabarito: letra C

Link permanente: /questoes/fg165247