Você está na página 1de 14

Exercício 4.

Nodo SC:
a) LivrariaCatarina  estado=‘SC’ (Livraria)
SC.Livraria  LivrariaCatarina
b) EstoqueCatarina  E.* (LivrariaCatarina  Estoque E)
SC.Estoque  EstoqueCatarina
c) LivroCC  assunto=‘Ciência da Computação’ (Livro)
LivroEsportes  assunto=‘Esportes’ (Livro)
SC.Livro  LivroCC U LivroEsportes ...

d) EstoqueCatarinaCC  E.* (LivroCC  EstoqueCatarina E)


Analogamente para cada um dos outros estados, de modo a
fazer uma partição da base de dados.
Exercício 4.2 – fragmentos e tabelas
materializadas (em negrito)

Leste.Livraria  S1  CEP <= 35000 (Livraria)


Centro.Livraria  S2  CEP>35000 ^ CEP<=70000 (Livraria)
Oeste.Livraria  S3  CEP > 70000 (Livraria)
B1  preco<=20 (Livro)
B2  preco>20 ^ preco<=50 (Livro)
B3  preco>50 ^ preco<=100 (Livro)
B4  preco>100 (Livro)
Leste.Livro  B1 U B4
Centro.Livro  B1 U B2
Oeste.Livro  B1 U B2 U B3 U B4
Exercício 4.2 – fragmentos e tabelas
materializadas (em negrito)

Leste.Livraria  S1  CEP <= 35000 (Livraria)


Centro.Livraria  S2  CEP>35000 ^ CEP<=70000 (Livraria)
Oeste.Livraria  S3  CEP > 70000 (Livraria)
EstoqueLeste  E.* (S1  Estoque E)
Leste.Estoque  EstoqueLeste
EstoqueCentro  E.* (S2  Estoque E)
Centro.Estoque  EstoqueCentro
EstoqueOeste  E.* (S3  Estoque E)
Oeste.Estoque  EstoqueOeste
Exercício 4.2 a)

Nodo Leste:
CREATE VIEW Leste.Parcial AS
SELECT Num_livro , Estoque_Total FROM Leste.Livros
WHERE preco > 15 AND preco <= 20

SELECT * FROM Leste.Parcial UNION Centro.Parcial UNION Oeste.Parcial;

Nodo Centro:
CREATE VIEW Centro.Parcial AS
SELECT Num_livro , Estoque_Total FROM Centro.Livros
WHERE preco > 20 AND preco <= ptoCorte

Nodo Oeste:
CREATE VIEW Oeste.Parcial AS
SELECT Num_livro , Estoque_Total FROM Oeste.Livros
WHERE preco > ptoCorte AND preco < 55
20 < ptoCorte <= 50
(determinado pelo SGBD de acordo com distribuição dos preços dos livros)
Exercício 4.2 b)

Nodo Centro:
DELETE FROM Centro.Livros
WHERE Num_livro = 1234;

Nodo Oeste:
UPDATE Oeste.Livros
SET preco = 55
WHERE Num_livro = 1234;

Todos os nodos (Leste|Centro|Oeste) – exemplo para Leste:


UPDATE Leste.Livraria AS L
SET Valor_estoque_total = Valor_estoque_total + 10 *
( SELECT Qtd FROM Leste.Estoque
WHERE Num_livro = 1234 AND
L.Num_livraria = E.Num_livraria)
WHERE (Num_livraria, 1234) IN (SELECT Num_livraria, NumLivro
FROM Leste.Estoque );
Exercício 4.2 b)

Nodo Centro:
DELETE FROM Centro.Livros
WHERE Num_livro = 1234;

Nodo Oeste:
UPDATE Oeste.Livros
SET preco = 55
WHERE Num_livro = 1234;

Todos os nodos (solução do Leandro Silveira):


UPDATE LESTE.LIVRARIA AS l
SET Valor_estoque_total = Valor_estoque_total + (
( SELECT ISNULL(Qtd, 0)
FROM LESTE.estoque AS II
WHERE ll.Num_livraria = l.Num_livraria AND Num_livro = 1234 ) * 10);
Exercício 4.2 c)

Exemplo de consulta expressa segundo o esquema lógico global e


submetida ao nodo Oeste:

SELECT COUNT(*) FROM LIVRARIA WHERE CEP > 35000;

Subconsultas geradas:

Nodo Centro:
CREATE VIEW Centro.Parcial AS
SELECT COUNT(*) AS n FROM Centro.LIVRARIA;

Nodo Oeste:
CREATE VIEW Oeste.Parcial AS
SELECT COUNT(*) AS n FROM Oeste.LIVRARIA;

SELECT SUM(n) FROM Centro.Parcial UNION Oeste.Parcial;

Obs.: Este é apenas um exemplo de resposta correta, dentre inúmeras.


Exercício 4.3 a)

Esquema global lógico

Funcionario (codF, nome, nroFilial (fk), ...)


Filial (nroFilial, cidade, ...)

Fragmentos e tabelas físicas

Nodo1.Funcionário  Funcionário
 cidade=‘Florianópolis’ (Filial)
FiliaisDeFloripa
Nodo2.Filial  FiliaisDeFloripa ( U … )?
FiliaisDeBlumenau  cidade=‘Blumenau’ (Filial)
Nodo3.Filial  FiliaisDeBlumenau ( U … )?
Exercício 4.3 b) e c)

Estratégia 1

Nodo 1:
CREATE VIEW Nodo1.Resultado AS
SELECT F.codF, F.nome, F.nroFilial
FROM Nodo1.Funcionário F NATURAL JOIN
( Nodo2.Parcial UNION Nodo3.Parcial );

k*(|codF|+|f.nome|+|nroFilial|) 20*|nroFilial|
Nodo 2:
CREATE VIEW Nodo2.Parcial AS
SELECT nroFilial FROM Nodo2.Filial
WHERE cidade=’Florianópolis’;

Nodo 3:
CREATE VIEW Nodo3.Parcial AS
SELECT nroFilial FROM Nodo3.Filial 10*|nroFilial|
WHERE cidade=’Blumenau’;
Exercício 4.3 b) e c)

Estratégia 2
N*(|codF|+|f.nome|+|nroFilial|)
Nodo 1:
CREATE VIEW Nodo1.Funcs AS
SELECT F.codF, F.nome, F.nroFilial
FROM Nodo1.Funcionário F;
Nodo 2:
CREATE VIEW Nodo2.Parcial AS
SELECT nroFilial FROM Nodo2.Filial WHERE cidade=’Florianópolis’;

SELECT F.codF, F.nome, F.nroFilial


FROM Nodo1.Funcs F NATURAL JOIN
( Nodo2.Parcial UNION Nodo3.Parcial );
Nodo 3:
10*|nroFilial|
CREATE VIEW Nodo3.Parcial AS
SELECT nroFilial FROM Nodo3.Filial WHERE cidade=’Blumenau’;
Exercício 4.3 d)

Fluxo(Estratégia 1) < Fluxo (Estratégia 2)

k*(|codF|+|f.nome|+|nroFilial|) + 30*|nroFilial| <

N*(|codF|+|f.nome|+|nroFilial|) + 10*|nroFilial|

K < N – 20 * |nroFilial|

|codF|+|f.nome|+|nroFilial|
Exercício 4.4

2PL não conservativo e não estrito

T1 só ABORTA se SC falhar

T2 só ABORTA se SP falhar
Exercício 4.5 - a)

Nodo SC

AlunoCatarina  estado=‘SC’ (Aluno)


SC.Aluno  AlunoCatarina
CursaCatarina  C.* (AlunoCatarina  Cursa C)
SC.Cursa  CursaCatarina
SC.Disciplina  Disciplina

Nodo RS
RS.Aluno  Aluno
RS.Cursa  Cursa
RS.Disciplina  Disciplina
Exercício 4.5 - b)

Nodo SC
CREATE VIEW SC.Parcial AS
SELECT idD, COUNT(DISTINCT idA) AS nA, SUM(nota) AS s, COUNT(*) AS n
FROM SC.Cursa C GROUP BY idD;

SELECT D.*, SUM(nA) AS nAlunos, ( SUM(s) / SUM(n) ) AS mNotas


FROM SC.Disciplina D NATURAL JOIN (SC.Parcial UNION RS.Parcial)
HAVING nAlunos > 1000 AND mNotas < 7
ORDER BY mNotas ASCENDING nAlunos DESCENDING ;

Nodo RS
CREATE VIEW RS.Parcial AS
SELECT idD, COUNT(DISTINCT idA) AS nA, SUM(nota) AS s, COUNT(*) AS n
FROM RS.Aluno A NATURAL JOIN RS.Cursa C
WHERE A.uf <> SC
GROUP BY idD;

Você também pode gostar