Algebra Relacional
Introdução
A Álgebra Relacional é um modelo teórico e formal de manipulação de dados em bancos de dados relacionais. Ela define um conjunto de operações matemáticas aplicadas a relações (tabelas), permitindo a criação de novas relações a partir de dados existentes. Essas operações incluem seleção (σ), projeção (π), união (∪), diferença (-), produto cartesiano (×), junção (⨝), entre outras.
Ao contrário da SQL, que é uma linguagem prática e implementável, a Álgebra Relacional oferece uma base teórica que permite analisar, validar e prever os resultados de consultas e manipulações de forma precisa e lógica
Metodologia
A aplicação da Álgebra Relacional neste projeto foi realizada com base na estrutura conceitual do banco de dados relacional desenvolvido previamente, a partir do modelo Entidade-Relacionamento. As operações foram construídas em notação algébrica, simulando a execução de consultas sobre as tabelas do jogo, como Jogador, Prisioneiro, Gangue, Sala e Missao.
Foram utilizadas operações fundamentais como seleção (σ) para aplicar filtros, projeção (π) para escolher colunas específicas, e junção natural (⨝) para unir informações relacionadas entre diferentes tabelas.
Álgebra Relacional por tabela
Consulta_Personagem
-
Lista todos os personagens cadastrados:
T ← π(*)(consulta_personagem) -
Exibe o tipo de um personagem específico:
R ← σ(id_personagem = 5)(consulta_personagem)
T ← π(tipo_personagem)(R)
Agente_Penitenciario
-
Consulta todas as informações de um agente penitenciário:
T ← σ(id_personagem = 2)(agente_penitenciario) -
Verifica se um policial específico é corrupto e qual o seu preço:
R ← σ(id_personagem = 2)(agente_penitenciario)
T ← π(corrupto, preco)(R) -
Exibe os agentes penitenciários que estão na sala, ordenados pelo seu nível de perigo:
R ← σ(id_sala = 2)(agente_penitenciario)
T ← π(id_personagem, id_sala, nome, velocidade, nivel_de_perigo, nivel_de_alerta, cargo)(R) -
Exibe a quantidade de agentes na sala:
R ← σ(id_sala = 2)(agente_penitenciario)
S ← γ(id_sala, COUNT(∗) → agentes_na_sala(R))
T ← π(id_sala, agentes_na_sala)(S) -
Exibe os agentes penitenciarios e as informações referentes as salas em que eles estão:
AP ← ρ AP(nome → nome_agente) (agente_penitenciario)
S ← ρ S(nome → nome_sala, nivel_perigo → nivel_perigo_sala) (sala)
R ← AP ⨝ (AP.id_sala = S.id_sala) S
T ← π(AP.id_personagem, nome_agente, S.id_sala, nome_sala, nivel_perigo_sala)(R)
Agente_Penitenciario_Jogador
-
Exibe todos os agentes penitenciários que capturaram um jogador específico:
APJ ← ρ APJ(agente_penitenciario_jogador)
AP ← ρ AP(agente_penitenciario)
W ← APJ ⨝ (APJ.id_personagem_agente_penitenciario = AP.id_personagem) AP
T ← σ(APJ.id_personagem_jogador = 1) W -
Exibe quantas vezes um jogador foi capturado:
R ← σ(id_personagem_jogador = 1)(agente_penitenciario_jogador)
S ← γ(id_personagem_jogador, COUNT(∗) → qtdd_capturas(R))
T ← π(id_personagem_jogador, qtdd_capturas)(S) -
Exibe quantas vezes um jogador foi capturado por um agente específico:
R ← σ(id_personagem_jogador = 1 AND id_personagem_agente_penitenciario = 2)(agente_penitenciario_jogador)
S ← γ(id_personagem_jogador, id_personagem_agente_penitenciario, COUNT(∗) → qtdd_capturas(R))
T ← π(id_personagem_jogador, id_personagem_agente_penitenciario, qtdd_capturas)(S)
Missao_Sala
-
Exibe todas as salas que uma missão desbloqueia:
T ← σ(nome_missao = 'Rota Segura')(missao_sala) -
Exibe as missões necessárias para desbloquear uma sala:
R ← σ(id_sala = 3)(missao_sala)
T ← π(nome_missao)(R)
Jogador
-
Consultar todas as informações de um jogador em especifico:
T ← σ(nome = 'Mauricio')(Jogador) -
Consultar dados importantes para o jogador:
T ← σ(nome = 'Mauricio')(Jogador)
R ← π(nome, velocidade, vida, qtded_recurso, qtded_captura, nome_gangue, id_sala)(T) -
Consultar objetivo da missão do jogador:
T ← σ(jogador.nome = 'Mauricio')(jogador ⨝ jogador.nome_missao = missao.nome_missao missao)
R ← π(jogador.nome_missao, missao.descricao, missao.status)(T) -
Consultar objetivo principal do jogador:
T ← σ(jogador.nome = 'Mauricio')(jogador ⨝ jogador.titulo_objetivo = objetivo_principal.titulo_objetivo objetivo_principal)
R ← π(jogador.titulo_objetivo, objetivo_principal.descricao)(T) -
Consultar missão do jogador:
T ← σ(jogador.nome = 'Mauricio')(jogador ⨝ jogador.nome_missao = missao.nome_missao missao)
R ← π(jogador.nome_missao, missao.descricao, missao.status) -
Consultar informações de um item especifico que esta no inventario:
T ← σ(jogador.nome = 'Mauricio' ∧ item.nome_item = 'Chave inglesa')((jogador ⨝ jogador.id_inventario = instancia_item.id_inventario instancia_item)⨝ instancia_item.nome_item = item.nome_item item)
R ← π(item.nome_item, item.descricao, item.durabilidade, item.pode_ser_vendido,item.utilidade, item.beneficio, instancia_item.nivel_de_gasto)(T) -
Consultar itens que estão no inventario:
T ← σ(jogador.nome = 'Mauricio')((jogador ⨝ jogador.id_inventario = instancia_item.id_inventario instancia_item) ⨝ instancia_item.nome_item = item.nome_item item)
R ← π(item.nome_item)(T) -
Consultar informações dos itens do inventario:
T ← σ(jogador.nome = 'Mauricio')((jogador ⨝ jogador.id_inventario = instancia_item.id_inventario instancia_item) ⨝ instancia_item.nome_item = item.nome_item item)
R ← π(item.nome_item, item.descricao, item.durabilidade, item.pode_ser_vendido, item.utilidade, item.beneficio, instancia_item.nivel_de_gasto)(T)
Prisioneiro
-
Consultar informação de todos os prisioneiros em ordem alfabetica:
T ← π(*)(prisioneiro)
R ← τ_{nome ASC}(T) -
Consultar todas as informações de um prisioneiro em especifico:
T ← σ(nome = 'Michael Scofield')(prisioneiro) -
Consultar todos os dados dos prisioneiros que estão na sala:
T ← σ(id_sala = 1)(prisioneiro) -
Consultar apenas nome e gangue dos prisioneiros que estão na sala:
T ← σ(id_sala = 1)(prisioneiro)
R ← π(nome, nome_gangue)(T) -
Consultar todas as gangues que estão na sala:
T ← σ(id_sala = 1)(prisioneiro)
R ← π(nome_gangue)(T) -
Consultar onde esta o prisioneiro:
T ← (prisioneiro ⨝ prisioneiro.id_sala = sala.id_sala sala)
R ← σ(prisioneiro.nome = 'Michael Scofield')(T)
Z ← π(prisioneiro.nome, sala.nome)(R) -
Consultar localização de todos os prisioneiros em ordem alfabetica:
T ← π(prisioneiro.nome, sala.nome)(prisioneiro ⨝ prisioneiro.id_sala = sala.id_sala sala)
R ← τ_{prisioneiro.nome ASC}(T)
Gangue
-
Consultar informação de todas as gangues ordenados por quantidade de membros:
T ← π(*)(gangue)
R ← τ_{qtdd_membros DESC}(T) -
Consultar gangues ordenadas pelo mais fortes (maiores recursos):
T ← π(*)(gangue)
R ← τ_{qtdd_recurso_gangue DESC}(T) -
Consultar todas as informações de uma gangue em especifico:
T ← σ(nome_gangue = 'Os Fox River Eight')(gangue)
Objetivo_principal
-
Exibe todos os objetivos:
T ← π(*)(Objetivo_Principal) -
Exibe algum objetivo específico com descrição
R ← σ(titulo_objetivo = 'Libertar o prisioneiro')(Objetivo_Principal)
T ← π(titulo_objetivo, descricao)(R) -
Exibe apenas os títulos dos objetivos
T ← π(titulo_objetivo)(Objetivo_Principal) -
Exibe quantos objetivos existem
T ← γ(COUNT(∗) → total_objetivos)(Objetivo_Principal) -
Exibe objetivos com determinada específica
T ← σ(descricao LIKE '%família%')(Objetivo_Principal) -
Exibe se há objetivos duplicados
R ← γ(titulo_objetivo, COUNT(∗) → contagem)(Objetivo_Principal)
T ← σ(contagem > 1)(R)
Objetivo_Principal_Missao
-
Exibe todos os objetivos e suas missoes relacionadas
OPM ← ρ OPM(Objetivo_Principal_Missao)
OP ← ρ OP(Objetivo_Principal)
M ← ρ M(Missao)
R ← OPM ⨝ (OPM.titulo_objetivo = OP.titulo_objetivo) OP
S ← R ⨝ (OPM.nome_missao = M.nome_missao) M
T ← π(OPM.titulo_objetivo, OP.descricao → descricao_objetivo, M.nome_missao, M.descricao → descricao_missao)(S) -
Exibe quantas missoes estão associadas a cada objetivo
OPM ← ρ OPM(Objetivo_Principal_Missao)
M ← ρ M(Missao)
R ← OPM ⨝ (OPM.nome_missao = M.nome_missao) M
S ← γ(M.nome_missao, COUNT(∗) → total_objetivos)(R)
T ← τ(total_objetivos DESC)(S) -
Exibe objetivos que possuem pelo menos uma missao associada
OP ← ρ OP(Objetivo_Principal)
OPM ← ρ OPM(Objetivo_Principal_Missao)
M ← ρ M(Missao)
R ← OP ⨝ (OP.titulo_objetivo = OPM.titulo_objetivo) OPM
S ← R ⨝ (OPM.nome_missao = M.nome_missao) M
W ← σ(M.status = TRUE)(S)
T ← π(OP.titulo_objetivo, OP.descricao)(W)
U ← δ(T) -- Operador de distinção (DISTINCT)
Dialogo
-
Exibe diálogos com nome da missao em ordem
T ← π(nome_missao, ordem, texto)(Dialogo)
U ← τ(nome_missao ASC, ordem ASC)(T) -
Exibe diálogos de uma missao específica
R ← σ(nome_missao = 'Fuga de Fox River')(Dialogo)
T ← τ(ordem ASC)(R) -
Exibe diálogos de um personagem específico
R ← σ(id_personagem = '9')(Dialogo)
T ← τ(ordem ASC)(R) -
Exibe quantos diálogos cada personagem tem
T ← γ(id_personagem, COUNT(∗) → qtd_dialogos)(Dialogo) -
Exibe quantos diálogos existe por missao
T ← γ(nome_missao, COUNT(∗) → qtd_dialogos)(Dialogo) -
Exibe diálogos como nome e descricao da missao
D ← ρ D(Dialogo)
M ← ρ M(Missao)
R ← D ⨝ (D.nome_missao = M.nome_missao) M
T ← π(D.id_dialogo, D.texto, D.ordem, D.nome_missao, M.descricao → descricao_missao)(R)
U ← τ(D.ordem ASC)(T) -
Exibe diálogos e o tipo do personagem de cada um
D ← ρ D(Dialogo)
CP ← ρ CP(Consulta_Personagem)
R ← D ⨝ (D.id_personagem = CP.id_personagem) CP
T ← π(D.texto, CP.tipo_personagem)(R)
Missão
-
Consultar todas as missoes
T ← π(*) (missao) -
Consultar missoes ativas
T ← σ(status = true)(missao) -
Consultar missoes inativas
T ← σ(status = false)(missao) -
Consultar quantas missoes estao ativas e inativas T ← γ_{status} ( COUNT(*) → total ) (missao)
-
Consultar missoes com seus respectivos objetivos
T ← π(missao ⨝ missao.nome_missao = objetivo_principal_missao.nome_missao objetivo_principal_missao) ⨝ (objetivo_principal_missao.titulo_objetivo = objetivo_principal.titulo_objetivo objetivo_principal)
R ← π(m.nome_missao, m.descricao, o.titulo_objetivo, op.descricao)(T) -
Consultar as salas asscociadas a cada missao
T ← π(missao ⨝ missao.nome_missao = missao_sala.nome_missao missao_sala) ⨝ (missao_sala.id_sala = sala.id_sala sala)
R ← π(missao.nome_missao, sala.nome, sala.nivel_perigo)(T) -
Consultar missoes e seus itens associados T ← π(missao ⨝ missao.nome_missao = item.nome_missao item) ⨝ (item.nome_item = instancia_item.nome_item instancia_item) R ← π(missao.nome_missao, missao.descricao, item.nome_item, instancia_item.id_instancia, instancia_item.nivel_de_gasto) (T)
Inventário
-
Retorna todas as informações do inventário
T ← π(id_inventario, qtd_itens, is_full)(Inventario) -
Apenas os Inventários Cheios
R ← (σ (is_full = TRUE)(Inventario))
T ← π (id_inventario, qtd_itens, is_full)(R) -
Apenas os Inventários que Não Estão Cheios
R ← σ(is_full = FALSE)(Inventario)
T ← π(id_inventario, qtd_itens, is_full)(R)
Sala
-
Inventário de uma Sala Específica
R ← σ(S.id_sala = 1)(Inventario⋈I.id_inventario = S.id_inventario Sala) T ← π(I.id_inventario, I.qtd_itens, I.is_full)(R) -
Retorna todas as informações das salas
T ← π(id_sala, id_inventario, nome, descricao, nivel_perigo, bloqueado)(Sala) -
Apenas as Salas que Não Estão Bloqueadas
R ← σ(bloqueado = FALSE)(Sala)
T ← π(id_sala, id_inventario, nome, descricao, nivel_perigo, bloqueado)(R) -
Apenas a Sala que um personagem Está Presente
R ← σ(J.id_personagem = 1)(Sala⋈S.id_sala = J.id_sala)(Jogador)
T ← π(S.id_sala, S.nome, S.descricao, S.nivel_perigo, S.bloqueado, J.nome)(R)
Item_Iventario
-
Exibe todos os itens e suas informações de um inventário específico:
INV ← ρ INV(Inventario)
II ← ρ II(Instancia_Item)
I ← ρ I(Item)
R ← INV ⨝ (INV.id_inventario = II.id_inventario) II
S ← R ⨝ (II.nome_item = I.nome_item) I
W ← σ(INV.id_inventario = 1)(S)
T ← π(INV.id_inventario, INV.qtd_itens, II.id_instancia, I.nome_item, I.descricao, I.durabilidade, II.nivel_de_gasto, I.utilidade, I.beneficio)(W) -
Exibe a quantidade total de cada item em um inventário específico:
I ← ρ I(Item)
II ← ρ II(Instancia_Item)
R ← II ⨝ (II.nome_item = I.nome_item) I
S ← σ(II.id_inventario = 1)(R)
T ← γ(I.nome_item, I.descricao, I.durabilidade, COUNT(II.nome_item) → quantidade_total)(S) -
Exibe o total de itens e tipos diferentes em um inventário específico:
INV ← ρ INV(Inventario)
II ← ρ II(Instancia_Item)
R ← INV ⨝ (INV.id_inventario = II.id_inventario) II
S ← σ(INV.id_inventario = 1)(R)
T ← γ(INV.id_inventario, COUNT(II.id_instancia) → total_itens, COUNT(DISTINCT II.nome_item) → tipos_diferentes_itens)(S)
Item
-
Exibe todas as gangues que vendem um item específico:
I ← ρ I(Item)
IL ← ρ IL(Item_Loja)
L ← ρ L(Loja)
R ← I ⨝ (I.nome_item = IL.nome_item) IL
S ← R ⨝ (IL.nome_gangue = L.nome_gangue) L
W ← σ(I.nome_item = 'Chave Inglesa')(S)
T ← π(I.nome_item, IL.nome_gangue)(W) -
Exibe todos os inventários que possuem um item específico:
I ← ρ I(Item)
II ← ρ II(Instancia_Item)
INV ← ρ INV(Inventario)
R ← I ⨝ (I.nome_item = II.nome_item) II
S ← R ⨝ (II.id_inventario = INV.id_inventario) INV
W ← σ(I.nome_item = 'Chave Inglesa')(S)
T ← π(I.nome_item, INV.id_inventario)(W)
Loja
-
Exibe todos os itens e suas informações de uma gangue específica:
L ← ρ L(Loja)
IL ← ρ IL(Item_Loja)
I ← ρ I(Item)
R ← L ⨝ (L.nome_gangue = IL.nome_gangue) IL
S ← R ⨝ (IL.nome_item = I.nome_item) I
W ← σ(L.nome_gangue = 'Nome da Gangue')(S)
T ← π(L.nome_gangue, L.nome_item, I.descricao, L.preco, I.durabilidade, I.utilidade, I.beneficio)(W) -
Exibe o total de itens e valor total dos itens de uma gangue específica:
L ← ρ L(Loja)
IL ← ρ IL(Item_Loja)
R ← L ⨝ (L.nome_gangue = IL.nome_gangue) IL
S ← σ(L.nome_gangue = 'Nome da Gangue')(R)
T ← γ(L.nome_gangue, COUNT(L.nome_item) → total_itens, SUM(L.preco) → valor_total)(S) -
Exibe a quantidade e valor total de cada item em uma loja de uma gangue específica:
L ← ρ L(Loja)
IL ← ρ IL(Item_Loja)
R ← L ⨝ (L.nome_gangue = IL.nome_gangue AND L.nome_item = IL.nome_item) IL
S ← σ(L.nome_gangue = 'Nome da Gangue')(R)
T ← γ(L.nome_item, L.preco, COUNT(L.nome_item) → quantidade_item, SUM(L.preco) → valor_total_item)(S)
📑 Histórico de versão
Versão | Data | Descrição | Autor |
---|---|---|---|
1.0 |
05/06/2025 | Criação da introdução e metodologia utilizada na Algebra Relacional | Mayara A. Oliveira |
1.1 |
11/06/2025 | Adiciona agente_penitenciario, agente_penitenciario_jogador, consulta_personagem e missao_sala | Maria Alice |
1.2 |
13/06/2025 | Objetivo_Principal, Objetivo_Principal_Missao, Dialogo | Ana Carolina |
1.3 |
13/06/2025 | adicionando algebra relacional jogador, prisioneiro e gangue | Mayara A. Oliveira |
1.4 |
15/06/2025 | adicionando algebra relacional de Inventário, Sala e Missao | Marllon Cardoso |