O Problema: Sistema Acadêmico da UnDF

Autor

Douglas Braga

NotaSobre este arquivo

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 TABLE com 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
DicaDica para começar

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

AvisoAntes de ver o 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:

er_undf_gabarito centro centro escola escola pertence_a pertence_a escola->pertence_a N curso curso ofertado_por ofertado_por curso->ofertado_por N professor professor lotado_em lotado_em professor->lotado_em N ministra_r ministra professor->ministra_r N aluno aluno matriculado_em matriculado_em aluno->matriculado_em N cursa_r cursa (agregação) aluno->cursa_r N disciplina disciplina compoe compoe disciplina->compoe N prereq_r prereq disciplina->prereq_r disciplina pertence_a->centro 1 ofertado_por->escola 1 lotado_em->escola 1 matriculado_em->curso 1 compoe->curso 1 ministra_r->disciplina N ano_m ano ministra_r->ano_m sem_m semestre ministra_r->sem_m turma_m turma ministra_r->turma_m horario_m horario ministra_r->horario_m sala_m sala ministra_r->sala_m prereq_r->disciplina pré-requisito cursa_r->ministra_r N nota_c nota cursa_r->nota_c aprov_c aprovado cursa_r->aprov_c

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.
  • prereq gerou tabela própria por ser N:N autorreferencial.
  • ministra gerou tabela própria por ser N:N com atributos.
  • matricula_disciplina representa a agregação cursa: referencia a PK composta de ministra e a PK de aluno.

Diagrama de Schema:

schema_undf_gabarito centro centro id_centro sigla nome_centro escola escola id_escola sigla nome_escola id_centro escola->centro id_centro curso curso id_curso sigla_curso nome_curso id_escola n_semestres carga_horaria tipo_curso curso->escola id_escola professor professor id_prof nome id_escola ch_semanal salario professor->escola id_escola aluno aluno id_aluno nome id_curso ano_ingresso aluno->curso id_curso disciplina disciplina id_disciplina nome_disciplina id_curso semestre carga_horaria disciplina->curso id_curso prereq prereq id_disciplina id_prereq prereq->disciplina id_disciplina prereq->disciplina id_prereq ministra ministra id_disciplina ano semestre turma id_prof horario sala ministra->professor id_prof ministra->disciplina id_disciplina mat_disc matricula_disciplina id_disciplina ano semestre turma id_aluno nota aprovado mat_disc->aluno id_aluno mat_disc->ministra (id_disc,ano,sem,turma)

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