Bases de Dados Revisão da matéria Programa Modelação • modelo Entidade – Associação • modelo e álgebra relacionais Implementação • SQL básico e avançado • desenvolvimento de aplicações • normalização Optimização • ficheiros e índices • optimização de consultas • transacções, concorrência, recuperação IST ▪ DEI ▪ Bases de Dados 2 1 Diagrama E-A IST ▪ DEI ▪ Bases de Dados 3 Sumário da notação IST ▪ DEI ▪ Bases de Dados 4 2 Exemplo do banco branch account depositor loan borrower customer IST ▪ DEI ▪ Bases de Dados 5 Chaves Como distinguir tuplos? • não pode haver 2 tuplos exactamente iguais • super-chave ▫ o conjunto de atributos que identificam univocamente • chave candidata ▫ conjunto mínimo de atributos • chave primária ▫ a chave candidata escolhida ▫ normalmente prefere-se um atributo separado por si só ◦ atenção aos atributos (supostamente) únicos IST ▪ DEI ▪ Bases de Dados 6 3 Chaves estrangeiras Chave estrangeira • referência entre relações IST ▪ DEI ▪ Bases de Dados 7 Restrições de integridade As restrições de integridade garantem a consistência da BD • exemplos ▫ RI 1: o saldo de uma conta não pode ser null ▫ RI 2: nenhuma conta pode ter o mesmo número de outra ▫ RI 3: todos os números de conta em depositor tem que existir em account ▫ RI 4: o salário de um funcionário tem que ser pelo menos 5€/hora ▫ … IST ▪ DEI ▪ Bases de Dados 8 4 Resumo Operações fundamentais da álgebra relacional • σp ((E1) em qque p é um ppredicado sobre os atributos de E1 • ∏s(E1) em que S é uma lista de atributos de E1 • E1 U E2 • E1 – E2 • E1 x E2 • ρ x (E1) em que x é o novo nome para E1 IST ▪ DEI ▪ Bases de Dados 9 Exemplo de renomeação Maior saldo em conta Πbalance (account) – Πaccount.balance ( σaccount.balance < d.balance ( account x ρd (account) ) ) IST ▪ DEI ▪ Bases de Dados 10 5 Outro exemplo de renomeação Encontrar o nome de todos os clientes que vivem na mesma rua e cidade que o cliente chamado Smith Πcustomer.customer_name ( σcustomer.customer_street = smith_addr.street Λ customer.customer_city = smith_addr.city ( customer x ρsmith_addr(street,city) ( Πcustomer_street, customer_city ( σcustomer_name = “Smith” (customer) ) ) ) ) IST ▪ DEI ▪ Bases de Dados 11 Resumo Operações adicionais de álgebra relacional • E1 ∩ E2 • E1 ڇE2 • E1 ڇθ E2 • E1 ÷ E2 IST ▪ DEI ▪ Bases de Dados 12 6 Agrupamento e agregação branch_nameGsum(salary) (works) IST ▪ DEI ▪ Bases de Dados 13 Atribuição (←) Operador que permite guardar resultados em variáveis temporárias ou tabelas existentes • exemplo: temp1 ← ∏R-S (r) temp2 ← ∏R-S ( (temp1 x s) – ∏R-S,S (r) ) result ← temp1 – temp2 IST ▪ DEI ▪ Bases de Dados 14 7 Estrutura básica de perguntas em SQL Pergunta típica em SQL select l t A1, A2, ..., An from r1, r2, ..., rm where P Π A1 , A2 , An (σ ( P (r ( 1 x r2 x ... x rm) ) IST ▪ DEI ▪ Bases de Dados 15 Operações em conjuntos – exemplos Nomes dos clientes com conta ou empréstimo (select customer_name from depositor) union (select customer_name from borrower) Nomes dos clientes com conta e empréstimo (select customer_name from depositor) intersect (select customer_name from borrower) IST ▪ DEI ▪ Bases de Dados 16 8 Ordenação de tuplos – order by A cláusula order by permite ordenar tuplos • exemplo: listar por ordem alfabética os nomes dos clientes com empréstimo na agência de Perryridge select distinct customer_name from borrower, loan where borrower.loan_number = loan.loan_number and branch_name = ‘Perryridge’ y g order by customer_name IST ▪ DEI ▪ Bases de Dados 17 Funções de agregação Operam no conjunto de valores de uma coluna • avg, min, max, sum, count Exemplo: saldo médio das contas da agência de Perryridge select avg(balance) from account where branch_name = ‘Perryridge’ IST ▪ DEI ▪ Bases de Dados 18 9 Funções de agregação – group by (outro exemplo) Número de titulares em cada agência select branch_name, count(distinct customer_name) from depositor, account where depositor.account_number = account.account_number group by branch_name branch name IST ▪ DEI ▪ Bases de Dados 19 Funções de agregação – having saldo médio das contas de cada agência, mas só agências com saldo médio superior a 1200 select branch_name, avg(balance) from account group by branch_name having avg (balance) > 1200 • predicados de having são aplicados depois do agrupamento • predicados de where são aplicados antes do agrupamento IST ▪ DEI ▪ Bases de Dados 20 10 Exemplo 6 Nomes dos clientes com contas na mesma agência onde o cliente Hayes tem conta select distinct d.customer_name from depositor as d, account as a where d.account_number = a.account_number and a.branch_name in (select a2.branch_name f from d depositor it as d2, d2 accountt as a2 2 where d2.account_number = a2.account_number and d2.customer_name = 'Hayes'); 21 Exemplo 11 Nome da agência com o maior saldo médio select branch_name from account group by branch_name having avg(balance) >= all (select avg(balance) from account group by branch_name); 22 11 Exemplo 14 Quem são os clientes com conta em todas as agências da cidade de Brooklyn select distinct customer_name from depositor as d where not exists ( (select branch_name from branch where branch_city = 'Brooklyn') except ( l t branch_name (select b h from depositor as d2, account as a2 where d2.account_number = a2.account_number and d2.customer_name = d.customer_name) ); 23 Integridade referencial Outro exemplo: create table depositor (customer_name char(20), account_number char(10), primary key (customer_name, account_number), foreign key (account_number) references account, foreign key (customer_name) references customer) customer depositor IST ▪ DEI ▪ Bases de Dados account 24 12 Funções – exemplo (Postgres) create function account_count (c_name varchar(255)) returns integer as $$ declare a_count integer; begin select count(*) into a_count from depositor where customer_name = c_name; return a_count; a count; end $$ language plpgsql; "A CREATE FUNCTION command is defined in SQL:1999 and later. The PostgreSQL version is similar but not fully compatible. The attributes are not portable, neither are the different available 25 IST ▪ DEI ▪ Bases de Dados languages." (Postgres manual) Procedimentos (Postgres) create function account_count_proc (in c_name varchar(255), out a_count integer) as $$ begin select count(*) into a_count from depositor where customer_name = c_name; end $$ language plpgsql; select * from account_count_proc ('Smith'); IST ▪ DEI ▪ Bases de Dados 26 13 Exemplo (Postgres) Criação da função que implementa o trigger create or replace function overdraft_trigger_proc() returns trigger as $$ begin if new.balance < 0 then insert into loan values (new.account_number, new.branch_name, (-1)*new.balance); insert into borrower (select customer_name, account_number from depositor where depositor.account_number = new.account_number); update account set balance = 0 where account.account_number = new.account_number; end d if; if return new; end $$ language plpgsql; 27 Papéis (roles) – exemplo create role caixa create role gestor grant select on account to caixa grant update(balance) on account to caixa grant caixa to gestor grant all privileges on account to gestor grant caixa to alice, jorge grant gestor to susana IST ▪ DEI ▪ Bases de Dados 28 14 PHP e Postgres 1. Abrir a ligação e escolher a BD $user = “istxxxxxx"; $host = “db.ist.utl.pt"; $port = 5432; $password = “xxxxxxxx“; $dbname = $user; /* username sigma */ /* password psql_reset */ /* porquê? */ $connection = pg_connect("host=$host port=$port user=$user password=$password dbname=$dbname") or die(pg_last_error()); IST ▪ DEI ▪ Bases de Dados 29 PHP e Postgres 2. Fazer uma consulta $sql = "select * from customer"; $result = pg_query($sql) or die(pg_last_error()); IST ▪ DEI ▪ Bases de Dados 30 15 PHP e Postgres 4. Iterar pelos resultados echo("<table>"); while($row_array = pg_fetch_assoc($result)) { echo("<tr>"); echo("<td>{$row_array['customer_name']}</td>"); echo("<td>{$row_array['customer_street']}</td>"); echo("<td>{$row_array['customer_city']}</td>"); echo("</tr>"); } echo("</table>"); IST ▪ DEI ▪ Bases de Dados 31 1FN Uma tabela está na 1FN se e só se: • todas as colunas contém valores atómicos • i.e., cada coluna pode ter apenas um valor para cada linha IST ▪ DEI ▪ Bases de Dados 32 16 2FN Uma tabela está na 2FN se e só se: • estiver na 1FN • cada atributo não-chave depende de todos os atributos da chave primária • (i.e., não há dependências parciais da chave) 33 IST ▪ DEI ▪ Bases de Dados Axiomas de Armstrong Transitividade • se α → β e β → γ, então α → γ Reflexividade • se β ⊆ α, então α → β Aumento • se α → β, então γα → γβ IST ▪ DEI ▪ Bases de Dados (p.ex. AB → A ou A → A) (p.ex. AB → AC) 34 17 Chaves Seja R o esquema de uma relação • exemplo: R = (A,B,C,D,E) Seja K um subconjunto de R • exemplo: K = AB K é uma super-chave em R se K → R • exemplo: AB → ABCDE IST ▪ DEI ▪ Bases de Dados 35 3FN Uma tabela está na 3FN se e só se: • para cada dependência α → β ▫ (α e β são sub-conjuntos dos atributos da tabela) • ou α é super-chave • ou β está contido numa chave candidata IST ▪ DEI ▪ Bases de Dados 36 18 FNBC Uma tabela está na FNBC se e só se: • para cada dependência α → β ▫ (α e β são sub-conjuntos dos atributos da tabela) • α é super-chave. 37 IST ▪ DEI ▪ Bases de Dados Decomposição Se uma dependência α → β infringe uma FN então decompõe-se a relação customer_name branch_name branch_city • (α U β ) Smith Downtown Brooklyn • (R – (β – α)) Johnson • no exemplo ▫ α = branch_name ▫ β = branch_city Perryridge Washington Hayes Perryridge Washington Jones Downtown Brooklyn • e a relação decompõe decompõe-se se em ▫ (α U β ) = (branch_name, branch_city) ▫ (R – (β – α)) = (customer_name, branch_name) IST ▪ DEI ▪ Bases de Dados 38 19 Decomposição sem perdas Uma decomposição de R em R1 e R2 não tem perdas (lossless) se r = ∏R1 (r ) ∏R2 (r ) Uma decomposição de R em R1 e R2 não tem perdas se uma destas dependências se verificar • R1 ∩ R2 → R1 • R1 ∩ R2 → R2 39 IST ▪ DEI ▪ Bases de Dados Exercício a) 5 1 9 1 5 1 1 3 6 9 8 8 5 5 9 5 3 5 9 9 3 1 1 6 9 1 9 3 5 6 9 5 8 9 8 9 4 1 3 4 5 4 IST ▪ DEI ▪ Bases de Dados 9 5 6 8 9 40 20 Hashing dinâmico – inserção IST ▪ DEI ▪ Bases de Dados 41 Chaves de procura compostas Chaves de procura compostas • chaves de procura com mais de um atributo • p.ex. (branch_name, balance) Ordem lexicográfica • (a1, a2) < (b1, b2) se ▫ (a1 < b1) ou ▫ (a1= b1) e (a2 < b2) IST ▪ DEI ▪ Bases de Dados 42 21 Ordenação externa – exemplo 1 registo ocupa 1 bloco M=3 Passo 1: ler 3 blocos colocar em Ri dá N=4 ficheiros Passo 2 N>M, logo juntar M-1 ficheiros de cada vez dá N/(M-1) = 2 ficheiros agora já temos N<M fazer merge final IST ▪ DEI ▪ Bases de Dados 43 Algoritmos para junções Há vários algoritmos para junções • nested-loop join • indexed nested-loop join • merge-join • hash-join IST ▪ DEI ▪ Bases de Dados 44 22 Merge-join Para calcular a junção natural (r ڇs) 1. ordenar relações r e s pelo atributo da junção 2. fundir as duas relações numa só (merge) ▫ semelhante ao passo 2 da ordenação IST ▪ DEI ▪ Bases de Dados 45 Hash-join Para calcular a junção natural (r ڇs) • subdividir os registos de r e s em n partições • função de hash diz qual é a partição para um dado registo ▫ a função calcula a partição com base no atributo da junção • aplicar build-and-probe a cada par de partições IST ▪ DEI ▪ Bases de Dados 46 23 Materialização e pipelining no Postgres select customer_name from depositor natural join account group by customer_name having sum(balance) >= all (select sum(balance) from depositor natural join account group by customer_name); 47 IST ▪ DEI ▪ Bases de Dados Propriedades ACID Atomicidade • se a transação falhar entre os passos 4 – 6, 6 os passos 1 – 3 ficam sem efeito Consistência • a soma A+B tem que ser igual antes e depois 1 2 3 4 5 6 Ti : read(A) A := A – 50 write(A) read(B) B := B + 50 write(B) Isolamento • nenhuma outra operação deve ler os valores de A e B entre os passos 3 e 6 Durabilidade • se a transacção termina com sucesso, as alterações são definitivas IST ▪ DEI ▪ Bases de Dados 48 24 Serialização por conflitos Existe conflito se as instruções de T1 e T2 tiverem de ser feitas numa certa ordem • se não houver conflito, podem ser trocadas IST ▪ DEI ▪ Bases de Dados 49 Teste de serialização – exemplo 4 O escalonamento 4 não é serializável 4 IST ▪ DEI ▪ Bases de Dados 50 25 Escalonamentos recuperáveis Considerar apenas escalonamentos recuperáveis • estes escalonamentos devem obedecer à seguinte condição: Para qualquer par de transacções Ti e Tk se Ti executa write(Q) antes de Tk executar read(Q) então Ti faz commit antes de Tk fazer commit commit commit IST ▪ DEI ▪ Bases de Dados 51 Rollback encadeado Considerar apenas escalonamentos sem hipótese de rollback encadeado • estes escalonamentos devem obedecer à seguinte condição: Para qualquer par de transacções Ti e Tk se Ti executa write(Q) antes de Tk executar read(Q) então Ti faz commit antes de Tk fazer read commit IST ▪ DEI ▪ Bases de Dados 52 26 Protocolo de 2 fases – exemplo Pode haver rollbacks encadeados IST ▪ DEI ▪ Bases de Dados 53 Protocolo em árvore – exemplo IST ▪ DEI ▪ Bases de Dados 54 27 Regras do protocolo com timestamps Quando Ti pretende fazer read(Q) • se W-timestamp(Q) > TS(Ti) então rollback Ti ▫ está a tentar ler valor que já não está presente no objecto • se W-timestamp(Q) ≤ TS(Ti) executar read(Q) ▫ e se R-timestamp(Q) ≤ TS(Ti) ◦ fazer R-timestamp(Q) := TS(Ti) IST ▪ DEI ▪ Bases de Dados 55 Regras do protocolo com timestamps Quando Ti pretende fazer write(Q) • se R-timestamp(Q) > TS(Ti) então rollback Ti ▫ a operação de escrita já vem tarde demais • se W-timestamp(Q) > TS(Ti) então rollback Ti ▫ tentativa de escrita de um valor obsoleto • senão, executar write(Q) ▫ e fazer W-timestamp(Q) := TS(Ti) IST ▪ DEI ▪ Bases de Dados 56 28 Protocolo com timestamps – exemplo IST ▪ DEI ▪ Bases de Dados 57 Exemplo <T0 start > <T0 , A, 0, 10 > <T0 commit > <T1 start > <T1 , B, 0, 10 > <T2 start > <T2 , C, 0, 10 > <T2 , C, 10, 20 > < checkpoint T1 ,T2 > <T3 start > <T3 , A, 10, 20 > <T4 start > <T3 , D, 0, 10 > <T4 , E, 0, 10 > <T3 commit > --- crash!! --58 29 Exemplo – construção das listas <T0 start > <T0 , A, 0, 10 > <T0 commit > <T1 start > <T1 , B, 0, 10 > <T2 start > <T2 , C, 0, 10 > <T2 , C, 10, 20 > < checkpoint T1 ,T2 > <T3 start > <T3 , A, 10, 20 > <T4 start > <T3 , D, 0, 10 > <T4 , E, 0, 10 > <T3 commit > undo-list = { T4 , T1 , T2 } redo-list = { T3 } IST ▪ DEI ▪ Bases de Dados 59 Exemplo – fase 1 <T0 start > <T0 , A, 0, 10 > <T0 commit > <T1 start > <T1 , B, 0, 10 > <T2 start > <T2 , C, 0, 10 > <T2 , C, 10, 20 > < checkpoint T1 ,T2 > <T3 start > <T3 , A, 10, 20 > <T4 start > <T3 , D, 0, 10 > <T4 , E, 0, 10 > <T3 commit > undo-list = { T4 , T1 , T2 } repõe valor 0 em B repõe valor 0 em C repõe valor 10 em C repõe valor 0 em E IST ▪ DEI ▪ Bases de Dados 60 30 Exemplo – fases 2 e 3 <T0 start > <T0 , A, 0, 10 > <T0 commit > <T1 start > <T1 , B, 0, 10 > <T2 start > <T2 , C, 0, 10 > <T2 , C, 10, 20 > < checkpoint T1 ,T2 > <T3 start > <T3 , A, 10, 20 > <T4 start > <T3 , D, 0, 10 > <T4 , E, 0, 10 > <T3 commit > redo-list = { T3 } repete escrita de valor 20 em A repete escrita de valor 10 em D IST ▪ DEI ▪ Bases de Dados 61 Exemplo de transformações múltiplas IST ▪ DEI ▪ Bases de Dados 62 31 Regras mais usadas 1. Decompor selecções conjuntivas em sequências de selecções (regra 1) 2. Mover selecções mais para baixo na árvore para serem executadas mais cedo (regras 2, 7, 11) 3. Executar primeiro as selecções e junções que produzirem menores relações (regra 6) 4. Substituir produtos cartesianos seguidos de selecção por operações de junção (regra 4) 5. Decompor e empurrar projecções para baixo na árvore, criando novas projecções se necessário (regras 3 3, 8 8, 12) 6. Nas sub-árvores em que seja possível, executar as operações via pipelining IST ▪ DEI ▪ Bases de Dados 63 32