Operação de divisão no RelaX

Operação de divisão no RelaX

por Vinicius Daguano Gastaldi -
Número de respostas: 4

Olá,

 

Alguém conseguiu utilizar a operação de divisão no Relax?

 

Quando tento fazer uma divisão no mesmo formato da feita na Consulta 4 da Aula 11, o erro que tenho é: schemas are not unifiable: types are different or size is different: __schemaA__ and __schemaB__

 

Eu entendo o motivo do erro, mas não deveria funcionar essa operação? Na consulta do exemplo as duas relações também não são iguais.

 

Abraços.

Em resposta à Vinicius Daguano Gastaldi

Re: Operação de divisão no RelaX

por Luciana de Melo e Abud -

Boa tarde, Vinicius.

 

Usando os dados do script fornecido pela professora criacao_bd_alunos_relax.txt, eu fiz a seguinte consulta em álgebra relacional no RelaX:

 

cursosPopulares = π nomeCurso (σ qtdeAlunos > 1 (γ nomeCurso; count(nroAluno)-> qtdeAlunos (Matriculado)))
Matriculado ÷ (cursosPopulares)

 

Basicamente a consulta recupera os alunos que estão matriculados em todas as disciplinas com mais de um 1 aluno matriculado (que eu apelidei de "cursosPopulares").

A operação de divisão funcionou aqui nesse caso.

Se você puder mostrar o exemplo que você tentou rodar e não funcionou, talvez possamos entender melhor o que está acontecendo sorriso 

 

 

Em resposta à Luciana de Melo e Abud

Re: Operação de divisão no RelaX

por Kelly Rosa Braghetto -

Olás,

No início da aula de hoje, me mostraram um exemplo quase igual esse da Luciana, mas que realmente não funcionava no RelaX. A mensagem de erro exibida era a seguinte: "schemas are not unifiable: types are different or size is different: __schemaA__ and __schemaB__"  (mas os esquemas era sim compatíveis para a divisão!).

Depois de muito matutar para tentar entender o erro, descobri o problema: o RelaX faz a correspondência entre os atributos das tabelas "dividendo" e "divisora" não apenas por meio do nome deles,  mas também pela posição. Os atributos da "divisora" têm que aparecer como um "sufixo" dos atributos da "dividendo".

Exemplo:

A seguinte consulta funciona no RelaX:

cursosPopulares = π nomeCurso (σ qtdeAlunos > 1 (γ nomeCurso; count(nroAluno)-> qtdeAlunos (Matriculado)))
Matriculado ÷ (cursosPopulares)

Mas se eu inverter a ordem dos atributos da tabela "dividendo" (Matriculado), a operação dará o erro ""schemas are not unifiable: ..." :

cursosPopulares = π nomeCurso (σ qtdeAlunos > 1 (γ nomeCurso; count(nroAluno)-> qtdeAlunos (Matriculado)))
MatriculadoInvertido = π nomeCurso,nroAluno (Matriculado)
MatriculadoInvertido ÷ cursosPopulares

 

Mais uma da série "Bizarrices do RelaX"!

 

Kelly

Em resposta à Kelly Rosa Braghetto

Re: Operação de divisão no RelaX

por Vanderlin Amorim Palmeira Junior -

Bom dia,

Também quando fiz a inversão dos atributos no exemplo citado da apostila da aula 10 página 46, funcionou a divisão no Relax, veja a seguir:

group: TESTE-DIVISION-IBI5013

R = {A:string, B:string
'a1','b1'
'a1','b2'
'a1','b3'
'a1','b4'
'a2','b1'
'a2','b3'
'a3','b2'
'a3','b3'
'a3','b4'
'a4','b1'
'a4','b2'
'a4','b3'
}

S = {B:string
'b1'
'b2'
'b3'
}

 

Funcionou no RelaX:

(R) ÷ (S)

Também a equivalente:

T1 = π R.A (R)
T2 = π R.A ((T1 ⨯ S) - R)
T1 - T2


Vanderlin