Questão de Banco de Dados — Modelagem e Mapeamento ER-relacional — FGV 2024
Banco de Dados›Modelagem 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:
Achave única em Matricula para o atributo (IDMatricula);
Bchave primária em Matricula para o atributo (IDMatricula);
Cchave única em Matricula para os atributos (IDAluno, IDDisciplina);
Dchave estrangeira em Matricula para os atributos (IDAluno, IDDisciplina);
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)
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ó.