O Problema: Sistema Acadêmico da UnDF
Este documento descreve, em texto corrido, os requisitos de informação de uma universidade fictícia. Ao longo do curso, você desenvolverá o modelo conceitual (diagrama ER) e o modelo lógico (schemas relacionais) que resolvem esse problema — e verá esses modelos sendo implementados e consultados em SQL com dados reais.
Use este texto como ponto de partida: leia com atenção, identifique as entidades, os atributos e as relações entre elas, e tente esboçar um modelo antes de avançar para os próximos capítulos.
Descrição do Problema
A Universidade do Distrito Federal (UnDF) está modernizando seu sistema de gestão acadêmica. O sistema legado armazena informações em planilhas espalhadas por departamentos, sem integração, causando inconsistências frequentes — cursos cadastrados em uma planilha sem professores associados em outra, alunos vinculados a disciplinas inexistentes, turmas sem registro de sala. A reitoria decidiu migrar para um banco de dados relacional centralizado.
A equipe de TI coletou os requisitos com os coordenadores acadêmicos e o registro de alunos. O resultado está descrito a seguir.
Estrutura Organizacional
A UnDF está organizada em centros acadêmicos, cada um com um código curto (como “COETI” ou “COEMAG”) e um nome completo que descreve sua área de atuação. Cada centro agrupa um conjunto de escolas — unidades acadêmicas menores, também identificadas por um código e um nome. Uma escola pertence a exatamente um centro, e um centro pode abrigar diversas escolas.
Cada escola é responsável por oferecer um ou mais cursos de graduação. Todo curso tem um nome completo, uma sigla identificadora única na universidade (como “ENS” para Engenharia de Software), um número de semestres previsto para conclusão, uma carga horária total em horas e uma modalidade — bacharelado, licenciatura ou tecnólogo. Um curso é vinculado a uma única escola; uma escola pode ofertar vários cursos.
Corpo Docente
Os professores da UnDF são identificados por um número inteiro de matrícula institucional. Além da matrícula, o sistema precisa armazenar o nome completo, a qual escola o professor está vinculado, o regime de trabalho semanal em horas (tipicamente 20 ou 40 horas semanais) e o salário bruto mensal.
Um professor é lotado em exatamente uma escola — independentemente de quais disciplinas ele ministra. Professores de escolas diferentes podem, em princípio, ministrar disciplinas de qualquer curso, embora na prática isso raramente ocorra.
Corpo Discente
Os alunos são identificados por uma matrícula própria. O sistema deve guardar o nome completo, o ano de ingresso na universidade e o curso ao qual o aluno está vinculado. Cada aluno é matriculado em exatamente um curso. Um curso pode ter nenhum, um ou muitos alunos matriculados.
Grade Curricular
A grade curricular de cada curso é composta por disciplinas. Cada disciplina tem um identificador inteiro único, um nome, o semestre recomendado de oferta dentro do curso (1º, 2º, 4º semestre etc.) e uma carga horária em horas.
Uma disciplina pertence a exatamente um curso; um curso é composto por diversas disciplinas. Não existem disciplinas compartilhadas entre cursos: se dois cursos abordam o mesmo conteúdo, cada um tem sua própria disciplina com identificador distinto.
Algumas disciplinas têm pré-requisitos: para se matricular em determinada disciplina, o aluno precisa ter cursado e sido aprovado em uma ou mais disciplinas anteriores do mesmo curso. Uma disciplina pode ter zero, um ou vários pré-requisitos. Da mesma forma, uma disciplina pode ser pré-requisito de zero, uma ou várias outras disciplinas do curso. Pré-requisitos são sempre disciplinas do mesmo curso e de semestres anteriores ao da disciplina que os exige.
Oferta de Turmas
A cada semestre letivo, cada escola define quais disciplinas serão ofertadas e quem as ministrará. Uma turma é identificada pela combinação de disciplina, ano letivo, semestre (1 ou 2) e um número de turma (como 1 ou 2, para quando há mais de uma turma da mesma disciplina no mesmo semestre). Uma turma tem um horário semanal (ex.: “SEG/QUA 08:00-10:00”) e uma sala.
Cada turma é ministrada por exatamente um professor. Um professor pode ministrar múltiplas turmas ao longo do semestre — de disciplinas iguais ou diferentes. Uma disciplina pode ter turmas ministradas por professores diferentes em semestres diferentes (e até turmas simultâneas com professores distintos no mesmo semestre, quando há mais de uma turma).
Matrículas em Disciplinas
Os alunos se matriculam nas turmas oferecidas. Para cada matrícula em uma turma, o sistema registra a nota final obtida pelo aluno (um valor real entre 0 e 10, com uma casa decimal) e se o aluno foi aprovado ou reprovado naquela turma. Um aluno pode se matricular em múltiplas turmas no mesmo semestre e pode cursar a mesma disciplina em semestres diferentes (em caso de reprovação ou reopção). Uma turma pode ter nenhum, um ou muitos alunos matriculados.
O que Você Deve Produzir
Com base nessa descrição, você será capaz de desenvolver, ao longo deste curso:
Modelo Conceitual (Capítulo 4 — Modelo ER)
- Identificar todos os conjuntos de entidades e seus atributos (incluindo quais são chaves, quais são multivalorados, quais são deriváveis)
- Identificar todos os conjuntos de relacionamentos, suas cardinalidades (1:1, 1:N ou N:N) e se a participação é total ou parcial
- Reconhecer onde há entidades fracas, especializações ou necessidade de agregação
- Desenhar o diagrama ER completo
Modelo Lógico (Capítulo 2 — Modelo Relacional)
- Converter o diagrama ER em schemas relacionais, definindo tabelas, atributos, chaves primárias e chaves estrangeiras
- Representar o schema resultante em um diagrama de schema com as relações entre tabelas
Implementação (Capítulo 3 — SQL)
- Escrever o DDL completo:
CREATE TABLEcom tipos de dados,NOT NULL,PRIMARY KEY,FOREIGN KEY - Popular o banco com dados de exemplo usando
INSERT INTO - Escrever consultas que respondam perguntas de negócio: quais alunos estão reprovados, quais professores ministram mais disciplinas, quais disciplinas têm pré-requisito em cascata
Releia o texto acima sublinhando os substantivos — eles geralmente revelam os conjuntos de entidades. Em seguida, identifique os verbos que conectam esses substantivos — eles revelam os relacionamentos. Por fim, procure os adjetivos e complementos associados a cada substantivo — eles revelam os atributos.
Exemplo da primeira frase relevante: “os professores da UnDF são identificados por um número inteiro de matrícula institucional… o sistema precisa armazenar o nome completo, a qual escola o professor está vinculado, o regime de trabalho semanal e o salário” → entidade professor com atributos id_prof (PK), nome, id_escola (FK), ch_semanal, salário.
Gabarito
Tente desenvolver os modelos de forma independente antes de consultar as respostas. O objetivo é exercitar o raciocínio de projeto — não há uma única resposta correta, mas há escolhas mais justificáveis do que outras.
Modelo Conceitual — Conjuntos de Entidades e Atributos
| Entidade | Atributos | Chave Primária |
|---|---|---|
centro |
id_centro, sigla, nome_centro | id_centro |
escola |
id_escola, sigla, nome_escola, id_centro (FK) | id_escola |
curso |
id_curso, sigla_curso, nome_curso, id_escola (FK), n_semestres, carga_horaria, tipo_curso | id_curso |
professor |
id_prof, nome, id_escola (FK), ch_semanal, salario | id_prof |
aluno |
id_aluno, nome, ano_ingresso, id_curso (FK) | id_aluno |
disciplina |
id_disciplina, nome_disciplina, id_curso (FK), semestre, carga_horaria | id_disciplina |
Modelo Conceitual — Relacionamentos e Cardinalidades
| Relacionamento | Entidades | Cardinalidade | Participação |
|---|---|---|---|
pertence_a |
escola → centro | N:1 | Total em escola (toda escola tem um centro) |
ofertado_por |
curso → escola | N:1 | Total em curso |
lotado_em |
professor → escola | N:1 | Total em professor |
matriculado_em |
aluno → curso | N:1 | Total em aluno (todo aluno tem um curso) |
compoe |
disciplina → curso | N:1 | Total em disciplina |
prereq |
disciplina ↔︎ disciplina | N:N autorreferencial | Parcial (algumas disciplinas não têm pré-requisitos) |
ministra |
professor ↔︎ disciplina | N:N | Parcial nos dois lados; atributos: ano, semestre, turma, horario, sala |
cursa |
aluno ↔︎ ministra (agregação) |
N:N | Parcial; atributos: nota, aprovado |
Nota sobre agregação: cursa associa aluno ao relacionamento ministra — não a disciplina diretamente. Isso é necessário para registrar em qual turma específica (professor + disciplina + ano + semestre) o aluno se matriculou.
Nota sobre prereq: é um relacionamento autorreferencial sobre disciplina, com dois papéis distintos — “disciplina que exige” e “disciplina exigida”.
Diagrama ER:
Modelo Lógico — Schemas Relacionais
centro(id_centro, sigla, nome_centro)
PK: id_centro
escola(id_escola, sigla, nome_escola, id_centro)
PK: id_escola
FK: id_centro → centro(id_centro)
curso(id_curso, sigla_curso, nome_curso, id_escola, n_semestres, carga_horaria, tipo_curso)
PK: id_curso
FK: id_escola → escola(id_escola)
professor(id_prof, nome, id_escola, ch_semanal, salario)
PK: id_prof
FK: id_escola → escola(id_escola)
aluno(id_aluno, nome, id_curso, ano_ingresso)
PK: id_aluno
FK: id_curso → curso(id_curso)
disciplina(id_disciplina, nome_disciplina, id_curso, semestre, carga_horaria)
PK: id_disciplina
FK: id_curso → curso(id_curso)
prereq(id_disciplina, id_prereq)
PK: (id_disciplina, id_prereq)
FK: id_disciplina → disciplina(id_disciplina)
FK: id_prereq → disciplina(id_disciplina)
ministra(id_disciplina, ano, semestre, turma, id_prof, horario, sala)
PK: (id_disciplina, ano, semestre, turma)
FK: id_disciplina → disciplina(id_disciplina)
FK: id_prof → professor(id_prof)
matricula_disciplina(id_disciplina, ano, semestre, turma, id_aluno, nota, aprovado)
PK: (id_disciplina, ano, semestre, turma, id_aluno)
FK: (id_disciplina, ano, semestre, turma) → ministra(...)
FK: id_aluno → aluno(id_aluno)
Decisões de projeto:
- Os relacionamentos N:1 (
pertence_a,ofertado_por,lotado_em,compoe,matriculado_em) foram absorvidos como FKs nas tabelas do lado N — não geraram tabelas próprias. prereqgerou tabela própria por ser N:N autorreferencial.ministragerou tabela própria por ser N:N com atributos.matricula_disciplinarepresenta a agregaçãocursa: referencia a PK composta deministrae a PK dealuno.
Diagrama de Schema:
Modelo Lógico — DDL (estrutura das tabelas)
CREATE TABLE centro (
id_centro INTEGER PRIMARY KEY,
sigla VARCHAR(10) NOT NULL UNIQUE,
nome_centro VARCHAR(100) NOT NULL
);
CREATE TABLE escola (
id_escola INTEGER PRIMARY KEY,
sigla VARCHAR(10) NOT NULL UNIQUE,
nome_escola VARCHAR(100) NOT NULL,
id_centro INTEGER REFERENCES centro(id_centro)
);
CREATE TABLE curso (
id_curso INTEGER PRIMARY KEY,
sigla_curso VARCHAR(5) NOT NULL UNIQUE,
nome_curso VARCHAR(100) NOT NULL,
id_escola INTEGER REFERENCES escola(id_escola),
n_semestres INTEGER NOT NULL,
carga_horaria INTEGER NOT NULL,
tipo_curso VARCHAR(20) NOT NULL
);
CREATE TABLE professor (
id_prof INTEGER PRIMARY KEY,
nome VARCHAR(50) NOT NULL,
id_escola INTEGER REFERENCES escola(id_escola),
ch_semanal INTEGER NOT NULL,
salario NUMERIC(10,2) NOT NULL
);
CREATE TABLE aluno (
id_aluno INTEGER PRIMARY KEY,
nome VARCHAR(50) NOT NULL,
id_curso INTEGER REFERENCES curso(id_curso),
ano_ingresso INTEGER NOT NULL
);
CREATE TABLE disciplina (
id_disciplina INTEGER PRIMARY KEY,
nome_disciplina VARCHAR(100) NOT NULL,
id_curso INTEGER REFERENCES curso(id_curso),
semestre INTEGER NOT NULL,
carga_horaria INTEGER NOT NULL CHECK (carga_horaria > 0)
);
CREATE TABLE prereq (
id_disciplina INTEGER REFERENCES disciplina(id_disciplina),
id_prereq INTEGER REFERENCES disciplina(id_disciplina),
PRIMARY KEY (id_disciplina, id_prereq)
);
CREATE TABLE ministra (
id_disciplina INTEGER REFERENCES disciplina(id_disciplina),
ano INTEGER NOT NULL,
semestre INTEGER NOT NULL,
turma INTEGER NOT NULL,
id_prof INTEGER REFERENCES professor(id_prof),
horario VARCHAR(50),
sala VARCHAR(20),
PRIMARY KEY (id_disciplina, ano, semestre, turma)
);
CREATE TABLE matricula_disciplina (
id_disciplina INTEGER NOT NULL,
ano INTEGER NOT NULL,
semestre INTEGER NOT NULL,
turma INTEGER NOT NULL,
id_aluno INTEGER REFERENCES aluno(id_aluno),
nota NUMERIC(4,1),
aprovado SMALLINT,
PRIMARY KEY (id_disciplina, ano, semestre, turma, id_aluno),
FOREIGN KEY (id_disciplina, ano, semestre, turma)
REFERENCES ministra(id_disciplina, ano, semestre, turma)
);