AV3 - BANCO DE DADOS 1 Final
AV3 - BANCO DE DADOS 1 Final
Índice
Conclusão ...................................................................................................................................... 39
Bibliografia .................................................................................................................................... 40
3
1.1 - Introdução
O presente trabalho de banco de dados resulta de uma série de aprendizado teórico e prático durante
o período das aulas do 4º bloco das aulas referente ao 2º ano do curso de informática. Em destaque,
estão alguns conceitos sobre banco de dados com maior enfoque para solução de um problema
relacionado com a criação de banco de dados de uma universidade.
4
1.2 - Objectivos
Objectivo Geral
Criar um banco de dados para gestão de uma universidade;
Objectivo Especifico
Fazer levantamento dos requisitos para o banco de dados;
Implementar alguns softwares auxiliares como servidores;
Corrigir possíveis inconsistências do banco de dados e testar.
5
1.3 – Metodologia
A criação de um banco de dados para uma universidade visa fazer um controle centralizado dos
estudantes, professores, cursos, disciplina, histórico escolar, e turmas.
Assim sendo, a prior, tem-se como entidades, com excepção de faculdades e departamentos:
Na sequência, o banco de dados (BD) está previsto para obedecer as seguintes fases:
i. Levantamento dos requisitos;
ii. Identificar Entidades e Relacionamentos;
iii. Representar o MER (Modelo Entidade – Relacionamento);
iv. Normalizar o BD;
v. Implementar utilizando um SGBD (Sistema de Gestão de Bancos de Dados) MySql;
vi. Testes (Consultas para ver o funcionamento) – utilizando álgebra relacional.
7
Para o caso em estudo, temos os relacionamentos que se seguem, nas suas respectivas entidades.
8
Para representar o MER (Modelo Entidade – Relacionamento), há que recorrer o DER (Diagrama
Entidade – Relacionamento).
Enquanto o MER aplica-se mais para a parte conceitual, o Diagrama Entidade Relacionamento é
a sua representação gráfica e é uma das principais ferramentas no acto de elaboração de uma base
de dados.
10
Desta maneira, para o caso em estudo, segue o diagrama composto por entidades, atributos, e
relacionamentos.
id. cod_matricula
Segunda Forma Normal (2FN) - se ela atende todos os requisitos da 1FN e se os registos
na tabela, que não são chaves, dependam da chave primária em sua totalidade e não apenas
parte dela;
Terceira Forma Normal (3FN) – é quando uma tabela está na 1FN e 2FN, mas ao se analisar
um registo encontra-se um atributo não chave dependente de outro atributo não chave.
13
Para o caso em estudo, será necessário, primeiro, preencher alguns campos em forma de exemplos,
de modo a normalizar o banco de dados.
id. Cod_matricula
1 unInsc001
2 unInsc002
Tabela 26 - Atributo da Matricula (1FN)
Como definido anteriormente, a 2FN depende da 1FN porém com a prorrogativa de permitir que
todos os atributos dependam da chave primária.
De acordo com esta descrição, segue primeiro as tabelas da 1FN.
18
id. cod_matricula
Com o objectivo de analisar atributos dependentes não chaves, a 3FN requer remover qualquer
atributo nestas condições.
Tabela 55 - universidade
Tabela 56 - universidade_tem_faculdade
Tabela 57 - faculdade
Tabela 58 - departamento
Tabela 59 – dados_do_curso
22
Tabela 60 – departamento_tem_professor
Tabela 61 – departamento_tem_disciplina
Tabela 62 - curso
Tabela 63 – curso_tem_disciplina
Tabela 64 - disciplina
Tabela 65 – disciplina_contida_no_departamento
23
Tabela 66 - professor
id. cod_matricula
Tabela 67 - matricula
Tabela 68 - estudante
Tabela 69 – situação_de_estudante_na_disciplina
Tabela 70 – resultado_de_estudante
Tabela 71 – histórico_final_de_estudante
Tabela 72 – turma
24
Tabela 73 – turma_tem_disciplina
De acordo com a regra da 3FN, existem atributos que deviam ser removidos como forma de
normalizar, porém não compensa.
Chegado este momento, há que se recorrer o sistema de gestão de banco de dados, caso do MySql,
para representar todas entidades obtidas na Terceira Forma Normal.
-- -----------------------------------------------------
-- Schema bd_universidade
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema bd_universidade
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `bd_universidade` DEFAULT CHARACTER SET utf8 ;
USE `bd_universidade` ;
-- -----------------------------------------------------
-- Table `bd_universidade`.`matricula`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`matricula` (
`id` INT NOT NULL AUTO_INCREMENT,
`cod_matri` VARCHAR(45) NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `cod_matri_UNIQUE` (`cod_matri` ASC) VISIBLE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `bd_universidade`.`estudante`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`estudante` (
`id` INT NOT NULL AUTO_INCREMENT,
`status_ativo_inativo` CHAR(6) NULL,
`status_final_aprov_repr` CHAR(6) NULL,
`matricula_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_estudante_matricula1_idx` (`matricula_id` ASC) VISIBLE,
CONSTRAINT `fk_estudante_matricula1`
FOREIGN KEY (`matricula_id`)
REFERENCES `bd_universidade`.`matricula` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
29
-- -----------------------------------------------------
-- Table `bd_universidade`.`turma`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`turma` (
`id` INT NOT NULL AUTO_INCREMENT,
`designacao` VARCHAR(45) NULL,
`n_total_disciplinas` INT NULL,
`n_geral_estudantes` VARCHAR(45) NULL,
`estudante_id` INT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `designacao_UNIQUE` (`designacao` ASC) VISIBLE,
INDEX `fk_turma_estudante1_idx` (`estudante_id` ASC) VISIBLE,
CONSTRAINT `fk_turma_estudante1`
FOREIGN KEY (`estudante_id`)
REFERENCES `bd_universidade`.`estudante` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `bd_universidade`.`curso`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`curso` (
`id` INT NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(45) NULL,
`turma_id` INT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `nome_UNIQUE` (`nome` ASC) VISIBLE,
INDEX `fk_curso_turma1_idx` (`turma_id` ASC) VISIBLE,
CONSTRAINT `fk_curso_turma1`
FOREIGN KEY (`turma_id`)
REFERENCES `bd_universidade`.`turma` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `bd_universidade`.`dados_do_curso`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`dados_do_curso` (
`id` INT NOT NULL AUTO_INCREMENT,
`n_de_cursos` INT NULL,
`curso_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_dados_do_curso_curso1_idx` (`curso_id` ASC) VISIBLE,
CONSTRAINT `fk_dados_do_curso_curso1`
FOREIGN KEY (`curso_id`)
REFERENCES `bd_universidade`.`curso` (`id`)
30
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `bd_universidade`.`disciplina`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`disciplina` (
`id` INT NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(45) NULL,
`cod_disciplina` CHAR(6) NULL,
`opcional_nao_opcional` CHAR(3) NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `nome_UNIQUE` (`nome` ASC) VISIBLE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `bd_universidade`.`departamento`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`departamento` (
`id` INT NOT NULL AUTO_INCREMENT,
`n_estud_existentes` INT NULL,
`n_estud_novos` INT NULL,
`n_capac_maxima` INT NULL,
`dados_do_curso_id` INT NOT NULL,
`disciplina_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_departamento_dados_do_curso1_idx` (`dados_do_curso_id` ASC) VISIBLE,
INDEX `fk_departamento_disciplina1_idx` (`disciplina_id` ASC) VISIBLE,
CONSTRAINT `fk_departamento_dados_do_curso1`
FOREIGN KEY (`dados_do_curso_id`)
REFERENCES `bd_universidade`.`dados_do_curso` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_departamento_disciplina1`
FOREIGN KEY (`disciplina_id`)
REFERENCES `bd_universidade`.`disciplina` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `bd_universidade`.`faculdade`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`faculdade` (
`id` INT NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(45) NULL,
`n_estudantes_inscritos` INT NULL,
31
-- -----------------------------------------------------
-- Table `bd_universidade`.`universidade`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`universidade` (
`id` INT NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(45) NULL,
`n_estud_existentes` INT NULL,
`n_estud_novos` INT NULL,
`n_total_disciplinas` INT NULL,
`faculdade_id` INT NOT NULL,
UNIQUE INDEX `nome_UNIQUE` (`nome` ASC) VISIBLE,
PRIMARY KEY (`id`),
INDEX `fk_universidade_faculdade_idx` (`faculdade_id` ASC) VISIBLE,
CONSTRAINT `fk_universidade_faculdade`
FOREIGN KEY (`faculdade_id`)
REFERENCES `bd_universidade`.`faculdade` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `bd_universidade`.`professor`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`professor` (
`id` INT NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(45) NULL,
`cod_profr` VARCHAR(45) NULL,
`departamento_id` INT NOT NULL,
`disciplina_id` INT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `cod_profr_UNIQUE` (`cod_profr` ASC) VISIBLE,
INDEX `fk_professor_departamento1_idx` (`departamento_id` ASC) VISIBLE,
INDEX `fk_professor_disciplina1_idx` (`disciplina_id` ASC) VISIBLE,
CONSTRAINT `fk_professor_departamento1`
FOREIGN KEY (`departamento_id`)
REFERENCES `bd_universidade`.`departamento` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
32
CONSTRAINT `fk_professor_disciplina1`
FOREIGN KEY (`disciplina_id`)
REFERENCES `bd_universidade`.`disciplina` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `bd_universidade`.`situacao_de_estudante_na_disciplina`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`situacao_de_estudante_na_disciplina` (
`id` INT NOT NULL AUTO_INCREMENT,
`cod_disciplina_aprov` CHAR(6) NULL,
`cod_disciplina_repr` CHAR(6) NULL,
`estudante_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_situacao_de_estudante_na_disciplina_estudante1_idx` (`estudante_id` ASC) VISIBLE,
CONSTRAINT `fk_situacao_de_estudante_na_disciplina_estudante1`
FOREIGN KEY (`estudante_id`)
REFERENCES `bd_universidade`.`estudante` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `bd_universidade`.`resultado_de_estudante`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`resultado_de_estudante` (
`id` INT NOT NULL AUTO_INCREMENT,
`nome_estudante` VARCHAR(45) NULL,
`resultado_final` VARCHAR(45) NULL,
`estudante_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_resultado_de_estudante_estudante1_idx` (`estudante_id` ASC) VISIBLE,
CONSTRAINT `fk_resultado_de_estudante_estudante1`
FOREIGN KEY (`estudante_id`)
REFERENCES `bd_universidade`.`estudante` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `bd_universidade`.`historico_final_do_estudante`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`historico_final_do_estudante` (
`id` INT NOT NULL AUTO_INCREMENT,
`nota_final_disciplina_aprovada` INT NULL,
`cod_disciplina_aprov` CHAR(6) NULL,
33
-- -----------------------------------------------------
-- Table `bd_universidade`.`curso_tem_disciplina`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`curso_tem_disciplina` (
`id` INT NOT NULL AUTO_INCREMENT,
`curso_id` INT NOT NULL,
`disciplina_id` INT NOT NULL,
PRIMARY KEY (`id`, `curso_id`, `disciplina_id`),
INDEX `fk_curso_has_disciplina_disciplina1_idx` (`disciplina_id` ASC) VISIBLE,
INDEX `fk_curso_has_disciplina_curso1_idx` (`curso_id` ASC) VISIBLE,
CONSTRAINT `fk_curso_has_disciplina_curso1`
FOREIGN KEY (`curso_id`)
REFERENCES `bd_universidade`.`curso` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_curso_has_disciplina_disciplina1`
FOREIGN KEY (`disciplina_id`)
REFERENCES `bd_universidade`.`disciplina` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `bd_universidade`.`turma_tem_disciplina`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `bd_universidade`.`turma_tem_disciplina` (
`id` INT NOT NULL AUTO_INCREMENT,
`turma_id` INT NOT NULL,
`disciplina_id` INT NOT NULL,
PRIMARY KEY (`id`, `turma_id`, `disciplina_id`),
INDEX `fk_turma_has_disciplina_disciplina1_idx` (`disciplina_id` ASC) VISIBLE,
INDEX `fk_turma_has_disciplina_turma1_idx` (`turma_id` ASC) VISIBLE,
CONSTRAINT `fk_turma_has_disciplina_turma1`
FOREIGN KEY (`turma_id`)
REFERENCES `bd_universidade`.`turma` (`id`)
34
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_turma_has_disciplina_disciplina1`
FOREIGN KEY (`disciplina_id`)
REFERENCES `bd_universidade`.`disciplina` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Código 1 - Script gerado a partir do MySql
No processo de testagem do banco de dados há que se recorrer a álgebra relacional. Segundo o site
[Link], a Álgebra Relacional é uma linguagem de consulta formal, porém requer
procedimentos (o usuário dá as instruções ao sistema para que o mesmo realize uma sequência de
operações na base de dados para calcular o resultado desejado).
Para esta fonte, a álgebra relacional apresenta seis operações fundamentais e algumas destas foram
emprestadas da teoria de conjunto:
i. Selecção;
ii. Projecção;
iii. Produto cartesiano;
iv. União;
v. Diferença entre conjuntos;
vi. Renomear.
Para não tornar este trabalho volumoso, será demostrada o funcionamento de algumas operações.
35
Em Banco de Dados, a selecção é uma operação que para um conjunto inicial fornecido como
argumento, produz um outro conjunto (subconjunto) com estrutura idêntica, porém com apenas os
elementos do conjunto inicial que satisfazem a condição dada.
Exemplo:
Seja dada a relação (tabela)
Alunos (id, nome, genero, idade)
Values
(1, ‘Filomena’, ‘F’, 13),
(2, ‘Zito’, ‘M’, 12),
(3, ‘Rosa’, ‘F’, 10),
(4, ‘Jorgina’, ‘F’, 13),
(5, ‘Joel’, ‘M’, 16);
Para o caso em estudo, tem-se primeiro a descrição de algumas entidades como mostra a imagem
seguinte.
36
A projecção é uma operação que produz um conjunto onde há elementos para cada elemento do
conjunto de entrada, sendo que a estrutura dos membros do conjunto resultante é definida nos
argumentos da operação.
Exemplo:
Dada a relação (tabela):
Alunos (id, nome, genero, idade)
Values
(1, ‘Filomena’, ‘F’, 13),
(2, ‘Zito’, ‘M’, 12),
(3, ‘Rosa’, ‘F’, 10),
(4, ‘Jorgina’, ‘F’, 13),
(5, ‘Joel’, ‘M’, 16);
Conclusão
A criação de banco de dados para gestão de qualquer instituição como a universidade do caso do
trabalho requer definir os parâmetros/requisitos bem claros. Notou-se uma ligeira complexidade
neste trabalho devido algumas inconformidades e embasamento. No caso concreto é a diferença
entre faculdade e departamento, entre curso e turma. Todavia, foi muito importante enfrentar o
desafio e serviu de aprendizagem em matéria de manipulação de bancos de dados usando o
software caso do MySql.
40
Bibliografia