Escolar Documentos
Profissional Documentos
Cultura Documentos
2023
ATIVIDADE PRÁTICA
BANCO DE DADOS
INTRODUÇÃO
Olá a todos.
Sejam todos muito bem-vindos!
Esta avaliação foi planejada e preparada para a disciplina de Banco de Dados dos Cursos de
Tecnologia do Centro Universitário Internacional UNINTER.
O objetivo desta atividade é fazer com que você, aluno, desenvolva os conhecimentos teóricos
aprendidos na rota de aprendizagem e aulas telepresenciais, de maneira prática e aplicável no
mercado de trabalho. Para tanto, será necessário o uso de ferramentas online como:
• ERDPlus.com
• PlantUML.com
• Mermaid.live
• draw.io
• Bizagi
• Diagramas.net
• lucidchart.com
• PowerPoint
• Paint
Você poderá, ainda, desenvolver seus diagramas e esta atividade em qualquer destas
ferramentas ou qualquer outra que você desejar.
Ao longo desse roteiro serão passadas as orientações gerais para realização da avaliação bem
como os seus critérios de correção. Na sequência, apresenta-se um exemplo comentado de como
se deve ser entregue uma questão. Seguindo o roteiro estarão as práticas a serem realizadas, cada
uma delas possui uma explicação de como deve ser feita, como será cobrada e algumas dicas. Por
fim, apresento uma seção as com as respostas das dúvidas mais frequentes realizadas por vocês.
Bons estudos!
(Não entendi. Pode resumir o que fazer no trabalho?)
1
Roteiro de Atividade Prática de
Banco de Dados
LISTA DE FIGURAS
Figura 1: Diagrama de caso de uso com 3 requisitos funcionais apresentados, o cadastro de usuários, o processo de
venda e o processo de compra. ______________________________________________________________________ 15
2
Roteiro de Atividade Prática de
Banco de Dados
LISTA DE TABELAS
Tabela 1: Possíveis notas no formato de apresentação........................................................................................................ 7
Tabela 2: Possíveis notas critério de Identificação Pessoal................................................................................................... 8
Tabela 3: Possíveis notas na apresentação do código.......................................................................................................... 9
Tabela 4: Possíveis notas na apresentação das imagens/fotos/diagramas ...........................Error! Bookmark not defined.
Tabela 5: Possíveis notas na apresentação das respostas......................................................Error! Bookmark not defined.
3
Roteiro de Atividade Prática de
Banco de Dados
SUMÁRIO
INTRODUÇÃO......................................................................................................................1
SUMÁRIO............................................................................................................................4
FORMATO DA APRESENTAÇÃO....................................................................................................7
RESPOSTA..................................................................................................................... ............ 11
PRÁTICAS ..........................................................................................................................26
MOTIVAÇÃO DO TRABALHO...................................................................................................... 26
4
Roteiro de Atividade Prática de
Banco de Dados
ORIENTAÇÕES GERAIS
A entrega desta atividade prática deverá ser realizada pela área de “Trabalhos”, em formato
PDF com o caderno de resolução da atividade prática (modelo fornecido em sua rota).
O formato de entrega desejável das práticas desse roteiro deve estar de acordo com o que é
visto na seção “EXEMPLO DE APRESENTAÇÃO DE PRÁTICA” e no modelo de resolução da
atividade prática.
Os trabalhos devem ser enviados no formato .pdf.
5
Roteiro de Atividade Prática de
Banco de Dados
CRITÉRIOS DE AVALIAÇÃO
Os critérios de avaliação desse trabalho visam deixar a avaliação o mais justa e transparente
possível. Esta avaliação valerá um total de 100 pontos de trabalho.
O trabalho será composto por:
• Introdução com descritivo do seu código base;
• Um modelo conceitual do banco de dados (MER);
• Um diagrama de entidade e relacionamento (DER/EER – modelo lógico estendido ou
simples);
• Um modelo físico (comandos SQL para criação do banco e suas tabelas);
• Código-fonte alterado para integração com o banco de dados;
• Prints de funcionamento do seu código e banco de dados:
o Print do funcionamento do código executando uma consulta com JOIN;
o Print dos dados sendo alterados pelo software;
o Prints dos dados alterados no banco de dados (print do workbench antes e depois da
alteração dos dados pelo software).
6
Roteiro de Atividade Prática de
Banco de Dados
7
Roteiro de Atividade Prática de
Banco de Dados
8
Roteiro de Atividade Prática de
Banco de Dados
9
Roteiro de Atividade Prática de
Banco de Dados
10
Roteiro de Atividade Prática de
Banco de Dados
11
Roteiro de Atividade Prática de
Banco de Dados
CÓDIGO-FONTE (COD)
Apresentação de seu código-fonte alterado com as devidas implementações de integração
com seu banco de dados com ao menos as seguintes queries:
• 1 SELECT contendo um JOIN
• 1 INSERT
• 1 UPDATE
As possíveis notas para esse critério são apresentadas na tabela a seguir:
12
Roteiro de Atividade Prática de
Banco de Dados
13
Roteiro de Atividade Prática de
Banco de Dados
I. Introdução
O software de gerenciamento de lanchonete que será usado como base para este trabalho
é um sistema back-end que permite o controle e manipulação de várias operações essenciais em
um estabelecimento de alimentos e bebidas. Ele oferece funcionalidades para gerenciar clientes,
pedidos e estoque de produtos e insumos. Os usuários podem adicionar e listar clientes, inserir
novos pedidos com diferentes status (como "Em preparo" ou "Pronto para retirada") e permite
adicionar ou listar itens no estoque. Além disso, o software tem mecanismos para relacionar
produtos a insumos, controlando assim as quantidades necessárias para cada item do menu. O
sistema também possuirá triggers no banco de dados para atualizar automaticamente o estoque
de insumos com base nas alterações feitas nos produtos e pedidos, assim ajudando a manter a
consistência dos dados.
Para facilitar a navegação, o software utiliza uma estrutura de menu em árvore, permitindo
aos usuários escolherem entre diversas opções para realizar as tarefas desejadas. O back-end foi
projetado em Python para interagir com um banco de dados MySQL, onde todas as informações
são armazenadas e recuperadas. Através de várias classes e métodos, o software fará uso de
consultas SQL para inserir, atualizar, deletar e listar dados. Este sistema serve como uma base
robusta para gerenciar operações diárias de uma lanchonete, podendo ser expandido ou adaptado
para requisitos específicos.
O software de gerenciamento de lanchonete armazenará vários tipos de dados no banco de
dados para facilitar a operação e administração do estabelecimento. Os principais dados
armazenados serão:
1. Clientes: Informações sobre os clientes, como ID do cliente, nome, endereço, e
possivelmente outras informações de contato ou preferências.
2. Produtos: Detalhes sobre os produtos oferecidos pela lanchonete, incluindo ID do produto,
nome, descrição, e quantidade em estoque.
3. Insumos: Informações sobre os insumos necessários para criar os produtos, como ID do
insumo, nome e quantidade em estoque.
4. ProdutoInsumo: Uma tabela de relacionamento que armazena o ID do produto, ID do
insumo e a quantidade de cada insumo necessária para criar uma unidade do produto.
Esta tabela serve para manter o controle sobre a composição dos produtos.
5. Pedidos: Informações sobre os pedidos feitos pelos clientes, incluindo ID do pedido, status
(como "Em preparo", "Pronto para retirada", etc.), data e hora do pedido e ID do cliente que
fez o pedido.
6. PedidoCardapio: Uma tabela de relacionamento que contém os diferentes itens do
cardápio que fazem parte de um pedido específico, incluindo a quantidade de cada item.
14
Roteiro de Atividade Prática de
Banco de Dados
Figura 1: Modelo conceitual (MER) do início do projeto de banco de dados para o ERP de lanchonetes. Neste MER vemos 5
entidades simples e 3 entidades associativas. Todas relacionadas com no mínimo um outra entidade e todos os devidos
atributos são apresentados.
Figura 2: Modelo lógico (EER) do projeto de banco de dados após normalização. Neste EER vemos 8 tabelas
relacionadas entre si e com suas devidas chaves primárias e diversas chaves estrangeiras, além de todas as demais colunas
e seus respectivos tipos de dados que serão armazenados no banco de dados.
--
15
Roteiro de Atividade Prática de
Banco de Dados
--
-- Table structure for table `cardapioproduto`
--
--
-- Table structure for table `cliente`
--
--
-- Table structure for table `insumo`
--
--
-- Table structure for table `pedido`
--
16
Roteiro de Atividade Prática de
Banco de Dados
--
-- Table structure for table `pedidocardapio`
--
17
Roteiro de Atividade Prática de
Banco de Dados
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode =
'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SU
BSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `PedidoCardapio_AFTER_DELETE` AFTER DELETE ON
`pedidocardapio` FOR EACH ROW BEGIN
DECLARE TotalPedido DECIMAL(10,2);
--
-- Table structure for table `produto`
--
OPEN cur;
read_loop: LOOP
FETCH cur INTO insumo_id, quantidade_necessaria;
IF done THEN
LEAVE read_loop;
END IF;
18
Roteiro de Atividade Prática de
Banco de Dados
END LOOP;
CLOSE cur;
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `produto_AFTER_UPDATE` AFTER UPDATE ON `produto`
FOR EACH ROW BEGIN
DECLARE insumo_id INT;
DECLARE quantidade_necessaria DOUBLE;
DECLARE quantidade_diferenca DOUBLE;
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR
SELECT IdInsumo, Quantidade FROM ProdutoInsumo WHERE IdProduto = NEW.IdProduto;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
read_loop: LOOP
FETCH cur INTO insumo_id, quantidade_necessaria;
IF done THEN
LEAVE read_loop;
END IF;
CLOSE cur;
END IF;
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
--
-- Table structure for table `produtoinsumo`
--
19
Roteiro de Atividade Prática de
Banco de Dados
--
-- Dumping routines for database 'lanchonete'
--
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
V. Código-fonte (COD)
Aqui será mostrado apenas o código-fonte referente à interação com o banco de
dados:
'''
Classes de conexão com o banco de dados
'''
import os
import mysql.connector
from dotenv import load_dotenv
DB_HOST = os.getenv("DB_HOST")
DB_USER = os.getenv("DB_USER")
DB_PASSWORD = os.getenv("DB_PASSWORD")
DB_NAME = os.getenv("DB_NAME")
class LanchoneteDB:
'''
Classe de conexão com o banco de dados - tabela lanchonete
'''
def __init__(self):
self.connection = mysql.connector.connect(
host=DB_HOST,
user=DB_USER,
password=DB_PASSWORD,
database=DB_NAME
)
self.cursor = self.connection.cursor()
def close(self):
self.cursor.close()
self.connection.close()
class Cliente(LanchoneteDB):
'''
Classe Cliente permite o cadastro de um novo cliente e também a visualização
dos clientes cadastrados.
Métodos:
- inserir(nome, endereço): None
- listar(): Lista de todos os nomes dos clientes e seus IDs
- listaDados(idCliente): Nome e Endereço de um cliente
'''
def inserir(self, nome, endereco):
query = "INSERT INTO Cliente (Nome, Endereco) VALUES (%s, %s)"
self.cursor.execute(query, (nome, endereco))
self.connection.commit()
def listar(self):
"""Lista todos os clientes cadastrados e seus IDs
Returns:
tupla: tuplas com ((Nome), (idCliente)) para cada cliente cadastrado
"""
query = "SELECT Nome, idCliente FROM Cliente"
self.cursor.execute(query)
return self.cursor.fetchall()
20
Roteiro de Atividade Prática de
Banco de Dados
Returns:
tupla: tuplas com os dados do cliente
"""
query = "SELECT * FROM Cliente WHERE idCliente = %s LIMIT 1"
self.cursor.execute(query, id_cliente)
return self.cursor.fetchall()
class Pedido(LanchoneteDB):
def inserir(self, status, data_hora, id_cliente):
query = "INSERT INTO Pedido (Status, DataHora, IdCliente) VALUES (%s, %s, %s)"
self.cursor.execute(query, (status, data_hora, id_cliente))
self.connection.commit()
def listar(self):
query = "SELECT * FROM Pedido"
self.cursor.execute(query)
return self.cursor.fetchall()
class Cardapio(LanchoneteDB):
def inserir(self, nome, descricao, categoria, valor, disponibilidade):
query = "INSERT INTO Cardapio (Nome, Descricao, Categoria, Valor, Disponibilidade) VALUES
(%s, %s, %s, %s, %s)"
self.cursor.execute(query, (nome, descricao, categoria, valor, disponibilidade))
self.connection.commit()
def listar(self):
query = "SELECT * FROM Cardapio"
self.cursor.execute(query)
return self.cursor.fetchall()
from lanchonete_db import LanchoneteDB # Certifique-se de que este arquivo seja importado
corretamente
class PedidoCardapio(LanchoneteDB):
'''
Classe PedidoCardapio permite o gerenciamento das relações entre pedidos e itens do cardápio.
Métodos:
- adicionar(IdPedido, IdProduto, Quantidade): None
- apagar(IdPedidoCardapio): None
- listar(): Lista de todos os registros da tabela PedidoCardapio
- alterar(IdPedidoCardapio, IdPedido, IdProduto, Quantidade): None
'''
def listar(self):
query = "SELECT * FROM PedidoCardapio"
self.cursor.execute(query)
return self.cursor.fetchall()
21
Roteiro de Atividade Prática de
Banco de Dados
query = "UPDATE PedidoCardapio SET IdPedido = %s, IdProduto = %s, Quantidade = %s WHERE
IdPedidoCardapio = %s"
self.cursor.execute(query, (id_pedido, id_produto, quantidade, id_pedido_cardapio))
self.connection.commit()
class Produto(LanchoneteDB):
def inserir(self, nome, quantidade, valor, unidade_medida):
query = "INSERT INTO Produto (Nome, Quantidade, Valor, UnidadeMedida) VALUES (%s, %s, %s,
%s)"
self.cursor.execute(query, (nome, quantidade, valor, unidade_medida))
self.connection.commit()
def listar(self):
query = "SELECT * FROM Produto"
self.cursor.execute(query)
return self.cursor.fetchall()
def get_last_insert_id(self):
query = "SELECT LAST_INSERT_ID()"
self.cursor.execute(query)
result = self.cursor.fetchone()
if result:
return result[0]
else:
return None
class CardapioProduto(LanchoneteDB):
'''
Classe CardapioProduto permite o gerenciamento das relações entre cardápios e produtos.
Métodos:
- adicionar(IdCardapio, IdProduto, Quantidade): None
- apagar(IdCardapioProduto): None
- listar(): Lista de todos os registros da tabela CardapioProduto
- alterar(IdCardapioProduto, IdCardapio, IdProduto, Quantidade): None
'''
def listar(self):
query = "SELECT * FROM CardapioProduto"
self.cursor.execute(query)
return self.cursor.fetchall()
class Insumo(LanchoneteDB):
'''
Classe Insumo permite o cadastro de um novo insumo e também a visualização
dos insumos cadastrados.
Métodos:
- inserir(nome, categoria, unidade_medida, quantidade, preco): None
- listar(): Lista de todos os insumos e seus IDs
- listar_dados(idInsumo): Todos os dados de um insumo específico
22
Roteiro de Atividade Prática de
Banco de Dados
'''
def listar(self):
"""Lista todos os insumos cadastrados e seus IDs
Returns:
tupla: tuplas com todos os dados de cada insumo cadastrado
"""
query = "SELECT * FROM Insumo"
self.cursor.execute(query)
return self.cursor.fetchall()
Returns:
tupla: tuplas com os dados do insumo
"""
query = "SELECT * FROM Insumo WHERE idInsumo = %s LIMIT 1"
self.cursor.execute(query, (id_insumo,))
return self.cursor.fetchall()
class ProdutoInsumo(LanchoneteDB):
'''
Classe ProdutoInsumo permite o gerenciamento das relações entre produtos e insumos.
Métodos:
- adicionar(IdProduto, IdInsumo, Quantidade): None
- apagar(IdProdutoInsumo): None
- listar(): Lista de todos os registros da tabela ProdutoInsumo
- alterar(IdProdutoInsumo, IdProduto, IdInsumo, Quantidade): None
- buscar_por_nome(nome_produto): Retorna os registros do produto pelo nome
'''
def listar(self):
query = "SELECT * FROM ProdutoInsumo"
self.cursor.execute(query)
return self.cursor.fetchall()
23
Roteiro de Atividade Prática de
Banco de Dados
24
Roteiro de Atividade Prática de
Banco de Dados
2 Prints dos dados alterados no banco de dados (print do workbench antes e depois da
alteração dos dados pelo software): Antes está na imagem anterior.
VII. Conclusão
Neste projeto, o foco principal foi na modelagem e implementação de um banco de dados
robusto e eficiente que serve como espinha dorsal para o sistema de gerenciamento da
lanchonete. Utilizamos diversas tabelas para representar entidades como clientes, pedidos,
produtos, insumos e o cardápio, e criamos relações bem definidas entre elas. Triggers e consultas
SQL complexas foram empregadas para manter a integridade dos dados e para automatizar
tarefas como a atualização do estoque de insumos.
A integração do banco de dados com o software foi feita de forma modular, permitindo
escalabilidade e manutenção mais fáceis. Cada aspecto do negócio, seja ele o gerenciamento de
clientes ou de pedidos, é manipulado por classes Python distintas que interagem com o banco de
dados. Isso não só torna o sistema mais organizado, mas também permite uma grande
flexibilidade na implementação de novas funcionalidades. Em resumo, o sucesso deste sistema
deve-se em grande parte à sua sólida estrutura de banco de dados e à integração eficaz deste
com as funcionalidades do software.
25
Roteiro de Atividade Prática de
Banco de Dados
PRÁTICAS
MOTIVAÇÃO DO TRABALHO
Vivenciar um projeto de implementação de banco de dados em um software real e aplicar os
conhecimentos adquiridos em sala.
OBJETIVO DO PROJETO
Implementar um banco de dados relacional do início ao fim com integração em um software.
26
Roteiro de Atividade Prática de
Banco de Dados
27
Roteiro de Atividade Prática de
Banco de Dados
Passo 5 – Altere seu código para que ele faça conexão com seu banco de dados e inclua ao
menos 1 SELECT com JOIN, 1 INSERT e 1 UPDATE.
Passo 7 – Teste seu software e banco de dados, realizando prints das telas de
funcionamento.
Passo 8 – Preencha o modelo de relatório com todos os dados e imagens que você criou e
finalize com uma breve conclusão.
28