Maier (resumo) Capítulo 1
Relações e Esquemas de Relação Uma das maiores vantagens do modelo relacional é a sua uniformidade. Todos os dados são vistos como se estivessem armazenados em tabelas, com cada linha na tabela tendo o mesmo formato. Cada linha da tabela representa algum objecto ou relação no mundo real. 1.1. Brass Tacks example: Um horário de uma companhia aérea NUMBER FROM TO DEPARTS ARRIVES 83 JFK O’Hare 11:30a 1:43p 84 O’Hare JFK 3:00p 5:55p 109 JFK Los Angeles 9:50p 2:52 a 213 JFK Boston 11:43a 12:45p 214 Boston JFK 2:20p 3:12p Cada voo é representado como um conjunto de valores, um em cada coluna. Há restrições no tipo de informação que pode aparecer numa dada coluna. A ordem das colunas é imaterial. Finalmente, como cada voo tem um número único, não há voo que seja representado por mais do que uma linha. A tabela dada é um exemplo exemplo de uma relação do tipo FLIGHTS. O formato formato da relação é dete determ rmin inad ado o pelo pelo conj conjun unto to das das etiq etique ueta tass das das colu coluna nass {NUM {NUMBE BER, R, FROM FROM,, TO, TO, DEPARTS, ARRIVES}. Estes nomes de colunas são os atributos. Correspondentemente Correspondentemente a cada atributo existe um conjunto de valores permitidos para a coluna associada. O domínio de NUMBER pode ser o conjunto de um, dois ou três dígitos decimais inteiros. As linhas desta relação relação são chamadas chamadas 5-tuplos ou só tuplos. Não há linhas repetidas. Finalmente, há um subconjunto de atributos com a propriedade de distinguirem os tuplos: esse subconjunto recebe o nome de chave. 1.2. Formalização das relações Um esquema de relação R é um conjunto finito de atributos {A1, A2, ... , An} Correspondendo a cada atributo Ai há um conjunto Di, chamado domínio de Ai dom(Ai) Os domínios são arbitrários, conjuntos não vazios, finitos ou infinitamente contáveis. Uma relação r no esquema de relação R é um conjunto finito de mappings {t1, t2, ..., tp} de R em D com a restrição de que para cada mapping t ε r, t(Ai) tem de estar em Di. Os mappings são chamados tuplos. ex: t(NUMBER) = 84; t(ARRIVES) = 5:55p Os mappings são usados no nosso formalismo para evitar uma ordem explícita dos atributos na relação de esquema. A-value of t é t(A) A notação usual para t restringido a X é t|X que podemos representar por t(X) e como X-value of t. t(A) é diferente de t({A}). O primeiro é apenas um valor e o outro é um mapping de A para este valor. Iremos confundi-los. Assumimos que há um valor λ tal que t(Φ)= λ As relações não são estáticas mas sim variantes com o tempo, logo tuplos podem ser adicionados, eliminados ou modificados. Mas o esquema de relação é invariante com o tempo. Logo a relação tem estados, mas são sem memória. 1.3. Chaves Uma chave de uma relação r num esquema de relação R é um subconjunto K = {B1, B2, ..., Bn} de R com a seguinte propriedade. Para cada dois tuplos distintos t1 e t2 em r, há um B ε K tal que t1(B) ≠ t2(B). Isto é, não há dois tuplos com os mesmos valores em todo todoss os atri atribu buto toss em K. Logo Logo,, o K-va K-valu lue e é sufi sufici cien ente te para para iden identitififica car r inequivocamente o tuplo.
ex: {NUMBER} e {FROM, TO} são ambos chaves, na tabela dada. Convenções: Letras maiúsculas do início do alfabeto para os atributos Letras maiúsculas do final do alfabeto para os esquemas de relação Letras minúsculas para as relações R={A1, A2,...,An} será representado por R[A1A2...An] ou, por vezes A1A2...An r(R) ou r(A1A2...An) r(ABCD) R[ABCD] , implica que qualquer relação r(R) está restringida a ter AC com chave. ex: FLIGHTS[NUMBER FROM TO DEPARTS ARRIVES]. Se queremos especificar mais do que uma chave para um esquema ou uma relação, temos de listar as chaves separadamente, pois a técnica de sublinhar não resulta. As chaves explicitamente listadas com um esquema de relação são chamadas chaves designadas. Pode haver outras para além das listadas. São as chaves implícitas. Algumas vezes vezes distinguimos uma uma das chaves designadas designadas como chave primária. Podemos restringir mais a definição de chave Definição 1.1. Uma chave de um relação r(R) é um subconjunto K de R tal que para dois quaisquer tuplos distintos t1 e t2 em r, t1(K) ≠ t2(K) e não há subconjunto K’ de K que tenha esta propriedade. K é uma superchave de r se K contém uma chave de r. Esta definição de superchave é a anterior de chave. Mas ainda consideraremos uma chave designada como podendo ser uma superchave. Ex: {NUMBER} é uma chave (e uma superchave), mas {NUMBER, FROM} é só uma superchave. Subt Subtililez eza: a: Em dife difere rent ntes es esta estado doss da rela relaçã ção, o, pode pode have haverr chav chaves es dife difere rent ntes es.. Consideramos esquemas de relação pois eles são invariantes, pois podemos querer que as chaves sejam invariantes. ex: ex: {FRO {FROM, M, TO} TO} é uma uma chav chave e da tabe tabela la inic inicia iall dada dada mas mas pode pode não não ser ser se acrescentarmos mais tuplos. 1.4. Actualizações de Relações Agora que temos relações, relações, que podemos podemos fazer com elas? elas? ADD(r; A1=d1, A2=d2,...,An = dn) ou, quando há ordem assumida ADD(r; d1, d2, ..., dn) é suficiente. Erros possíveis: O tupl tuplo o desc descri rito to não não está está conf confor orme me com com a rela relaçã ção o de esqu esquem ema a da rela relaçã ção o especificada. Alguns valores valores do tuplo não pertencem pertencem aos domínios domínios adequados. adequados. O tuplo descrito é concorda com a chave de um tuplo já na relação. DEL(r; A1=d1, A2=d2,..., An=dn) ou DEL(r; d1, d2, ..., dn) ou ainda, suficientemente, especificando especificando apenas os valores de uma chave. Se há uma chave primária, ainda melhor. Se o tuplo especificado não está na relação, há uma mensagem de erro. A relação vazia vazia é permitida. CH(r; A1=d1, A20d2, ..., An=dn; C1=e1, C2=e2, ..., Cp=ep), Cs contidos em As Também é permitida a versão curta usando apenas a chave do tuplo e novos valores dos atributos que se vão alterar. A operação de alterar é só uma conveniência. O mesmo efeito pode ser obtido por um delete seguido de um add. EXERCÍCIOS 1.1. a) R {EMPLOYEE, MANAGER, JOB, SALARY, YEARS_WORKED} YEARS_WORKED} r (R) --> r(EMPLOYEE MANAGER JOB SALARY YEARS_WORKED) YEARS_WORKED) podia ir por:
ADD(r; EMPLOYEE=Roberts, EMPLOYEE=Roberts, MANAGER=Price, MANAGER=Price, JOB=ticket agent, SALARY=12000, SALARY=12000, YEARS_WORKED=0) Depois, com operações de acrescentar como esta, operações CH e DEL, e ainda o que é especificado no enunciado, obteria facilmente (penso eu) a relação pedida. b) i. CH(r; EMPLOYEE=Ruskin; YEARS_WORKED=2) YEARS_WORKED=2) Os outros eram similares. Por fastidioso, com em a) não faço, pensando que não teria problemas (haverá potenciais problemas?) problemas?) 1.2. R{FLIGHT-NUMBER, DATE, GATE, TIME, DESTINATION} K={FLIGHT-NUMBER} K={GATE, TIME} 1.3. t(X)(Y) Quando Y está contido em X t(Y) simplifica 1.4. a) Não. Só superchave b) Não 1.5. R[A1 A2 ... An] nº máximo de chaves = n nº máximo de superchaves = 2 levantado a n 1.6. K=vazio --> não há chave, isto é, podem aparecer tuplos iguais iguais 1.7. Sim 1.8. Sim; Sim; Não; Não; Não.
Capítulo 2 Operadores Relacionais
As operações de actualização actualização introduzidas introduzidas no capítulo anterior são mais operações sobre tuplos do que sobre relações. Neste capítulo vamos considerar operações que envolvem toda a relação. 2.1. Operadores Booleanos
As relações no mesmo esquema podem ser considerados considerados conjuntos sobre o mesmo universo, o conjunto de todos os possíveis tuplos no esquema de relação. Assim, as operações booleanas podem ser aplicadas a duas daquelas relações e o resultado continua a ser uma relação em R. r ∩ s é a relação q(r) contendo todos os tuplos que estejam em ambas as relações de origem. r U s é a relação q(R) contendo todos os tuplos que estão em r ou s r – s é a relação q(R) contendo todos os tuplos que estão em r mas não em s. Note-se que r ∩ s = r – (r – s). Se o dom(R) for o conjunto de todos os tuplos sobre os atributos de R e seus domínios, então o complemento duma relação r será r/ = dom(R) – r. Contudo se R tiver um domínio infinito, r/ também será infinito e não uma relação como a definimos. Então definimos uma versão modificada, que conduz sempre a uma relação. Definindo domínio activo: adom(Ai, r) = {d ε Di | there exists t ε r with t(Ai) = d} então o complemento activo será r//=adom(R,r) – r ver exemplo da página 12 e 13. É difícil imaginar uma situação natural onde o complemento de uma relação tenha significado, excepto talvez para uma relação unária. O complemento activo pode aparecer naturalmente. Suponhamos uma companhia que tem um programa de treino que tem um grupo de empregados trabalhando trabalhando duas semanas em cada departamento. A informação sobre quem completou o tempo em cada departamento pode ser arquivada numa relação done(EMPLOYEE TRAINED-IN). A relação done// dir-nos-à quem não completou o treino em cada departamento, desde que todos os empregados e todos os departamentos estejam nessa relação. O complemento activo pode ser usado ainda como ferramenta de compressão, quando o complemento activo de uma relação tiver menos tuplos que o da relação, ela própria. O conjunto de todas as relações num dado esquema é fechado sob união, inte inters rsec ecçã ção, o, dife difere renç nça a e comp comple leme ment nto o activ activo. o. Toda Todavi via, a, nem nem toda todas s esta estas s operações preservam as chaves. 2.2. O Operador Selecção
Select é um operador unário em relações. Quando aplicado aplicado a uma relação r, conduz a uma outra relação que é o subconjunto subconjunto de tuplos de r com um certo valor num especificado atributo. Usando notação notação mapping, σA=a(r) (select A equal equal to a on r) é a relação relação r’(R)={t ε r | t(A)=a}. - Os operadores selecção comutam sob composição.
σA=a(σB=b(r)) = σB=b(σA=a(r)) ou σA=a o σB=b é igual a σA=a, B=b - Select é distributiva sobre as operações binárias booleanas, isto é:
σA=a(r γ s) = σA=a(r) γ σA=a(s) com γ = ∩, U ou – 2.3. O Operador Projecção
É também um operador unário.
Enquanto select escolhe um subconjunto de linhas numa relação, project escolhe um subconjunto de colunas. A projecção de r em X, escrita πX(r), é a relação relação r’(X) obtida por por eliminação eliminação de colunas correspondentes aos atributos em R-X e removendo tuplos duplicados no que resta. Em notação mapping: πX(r) é a relação r’X) = {t(X) | t ε r} - Se duas projecções são aplicadas a uma linha, a última subsume a primeira,
isto é, se Y está contido em X e este contido em R, πY(πX(r)) = πY(r). - Projec Projecçã ção o comuta comuta com a selec selecção ção quando quando o atribut atributo o ou atribu atributos tos para a selecção estão entre os atributos no conjunto sobre os quais a projecção é aplicada. - A ligação entre a projecção e os operadores booleanos é tratada nos exercícios
2.8 e 2.9 2.4. O operador Junção
É um operador binário para combinar duas relações. Vamos ilustrar como funciona, através de um exemplo: usable(FLIGHT EQUIPMENT) certified(PILOT EQUIPMENT) 83 727 Simmons 707 83 747 Simmons 727 84 727 Barth 747 84 747 Hill 727 109 707 Hill 747 Suponhamos que queremos uma lista mostrando que pilotos podem usados em cada voo. Criamos uma relação options{FLIGHT, EQUIPMENT, PILOT} a partir das relações usable e certified, por combinação combinação das linhas com o mesmo valor para EQUIPMENT. Obtemos: options(FLIGHT EQUIPMENT PILOT) 83 727 Simmons 83 727 Hill 83 747 Barth 83 747 Hill 84 727 Simmons 84 727 Hill 84 747 Barth 84 747 Hill 109 707 Simmons Uma Uma vez vez que que as rela relaçõ ções es estã estão o comb combin inad adas as,, se não não prec precis isar armo moss mais mais de EQUIPMENT, podemos fazer a projecção π{FLIGHT,PILOT}(options) e obtemos o que queremos. Em geral, a junção combina duas relações em todos os seus atributos comuns. RS=T r >< é a relação q(t) de todos os tuplos t sobre T tal que há tuplos tr ε r e ts ε s, com tr = t(R) e ts=t(S). Desde que R ∩ S é um subconjunto de ambos, R e S, como cons conseq equê uênc ncia ia da defi defini niçã ção o tr(R tr(R∩S ∩S)) = ts(R ts(R∩S ∩S). ). Assi Assim, m, todo todoss o tupl tuplo o em q é a combinação de um tuplo em r e um tuplo em s, com valores valores iguais (R∩S)-values. (R∩S)-values. Assim, options=usable>
Há inúmeras propriedades da junção. Vamos ver apenas algumas. Outras provirão dos exercícios, sendo que ainda assim não as esgotaremos. - Pode ser usada para simular a selecção: Suponhamos Suponhamos que queríamos σA=a(r) Primeiro definimos uma nova relação s(A) com um tuplo único t(A)=a. Depois fazemos r >< s e aí está. - Também podemos fabricar uma selecção generalizada usando a junção: r >> s = σA=a1(r) U σA=a2(r) U ... - Se escolhermos dois atributos A e B de R e fizermos s(AB) ser a relação com um tuplo único t, tal que t(A) = a e t(B)=b, então: r >< s = σA=a,B=b(r). - Há outras variações de selecção disponíveis, disponíveis, adicionando colunas e tuplos a s. - Pode ser notado que o operador junção é comutativo em relação à simetria, na sua definição. É também associativo: (q >< r) >< s = q >< (r >, e das relações s1, s2 e s3, como mostrado: s1(A B) s2(B C) s3(A C) a1 b1 b1 c2 a1 c2 a1 b2 b2 c1 a2 c2 a2 b1 São juntáveis com o resultado e os tuplos , e são juntáveis com o resultado resultado : c2>: s1 >< s2 >< s3 = (A B C) a1 b1 c2 a2 b1 c2 Lema 2.1 A relação s1>< s2 >< ...>
resultado de juntar os tuplos t1, t2,..., tm que são juntáveis em S=S1,S2, ..., Sm. Nem todos os tuplos em todas as relações entram na junção. A relação s1, s2, ..., sm junta completamente se todos os tuplos em cada relação é um membro de alguma lista de tuplos juntáveis em S. Ex: No caso anterior as relações não juntam completamente. Mas se acrescentarmos o tuplo à última relação já juntam completamente. - Os operadores junção e projecção, apesar de não inversos, executam funções complementares. complementares. Façamos r(R) e s(S) s(S) serem relações relações e deixemos q=r>
Isto acontece quando para cada cada tuplo tr ε r, há um tuplo ts ε s com tr(R ∩ S). Contenimento Contenimento também se pode tornar igualdade sem r e s juntarem completamente (ver exercício 2.14). Em todo o caso, se s’=πs(q), então a condição r=r’ e s=s’ é exactamente sinónima de r e s juntarem completamente. completamente. - O que acontecem quando inverto a ordem da projecção e junção? Se r=πR(q) e s = πs(q). Se q’=r >< s= (r >
adom(C m(C,r) ,r) = {c {c,c’} ,c’}
então o complemento ac activo de de r = do dom(R)-r = (A a a a a’ a’ a’ a’ a
B b b’ b’’ b b b’ b’’ b’’
C) c’ c c c c’ c’ c c’
b) Da mesma forma o complemento activo de s = dom(S)-s = (B b’ b’ b’ b’’
C c c c’ c
D) d d’ d’ d’
b’’ c) σA=a(r) = (A a a a
B b b’ b’’
c’
d’
C) c c’ c’
d) 1. πB(r) – πB(s) = (B) b pois πB(r) = (B) e πB(s) = (B) b b’ b’ b’’ b’’ 2. σB=b(r) = (A a
B b
C) c
3. r >< s = (A B a b’ a b’ b’’
C c’ c’
D) d d’
4. Dá o produto cartesiano. 2.3. a) r U s. OK b) r ∩ s. OK c) r – s OK d) co complemento de r. r. e) πK(r) OK. f) r >> s. OK
Não ma mantém ob obrigator toriamente a ch chave.
2.4. Se a’=a então o resultado é vazio. Se a diferente de a’ então o resultado é σA=a(r) 2.5. a) OK b) OK. σA=a - t(A=a) em r∩s pode pode ter os mesmos as ou ou menos as (só os que que estão também em s) σA=a (r) tem todos os as em r mas com a intersecção vou ter também só os que estão em s. 2.6. O tamanho é igual a 1, pois A é chave em r, logo não há repetidos. 2.7. Contraexemplo: r( A B C) a b c a’ b’ c a b c’ a’ b’ c’ a b c’ O lado esquerdo, com X = (B C), dá: b c b c’
O lado direito dá: vazio, pois se faço a projecção em X, e como A não pertence a X, não posso depois fazer uma selecção em A. 2.8. e 2.9. a) Falso. Usando, como contraexemplo: r( A B C D) e s( a’ b’ c d a’ b’ c d’ a b c’ d a b c’ d’ a b’ c’ c’ d a b’ c’ d’ a’ b c d
A a’ a’ a a a a a
B b’ b’ b’ b’ b b b
C c c c c c c’ c’
D) d d’ d’ d d d d’
O lado esquerdo dá a’ b’ + a b e o direito dá a’ b’ + a b + a b’ (logo o lado direito contém o esquerdo). b) OK. Vê-se que aparecem os mesmos fazendo primeiro a união ou a projecção c) Falso. Usando as mesmas relações relações para contraexemplo contraexemplo (acrescentand (acrescentando o primeiro a’ b c d) d) à relação r, vemos que πX(r) dá a´b’ + a b + a b’ + a’ b e mantendo-se πX(s), temos para o lado direito = a’ b. Enquanto isso o lado direito dá a b’ + a’ b. No lado direito só aparecem os que não apareciam em s, enquanto no lado esquerdo podem aparecer todos, desde que haja uma combinação com C D que não esteja em s. Logo, o lado esquerdo contém o direito. d) Falso. No lado direito podem aparecer qualquer nº (os que não estão completos com todas t odas as combinações de ABCD), enquanto o lado direito origina que apareçam todos só os que não têm nenhuma combinação em r. Lado esquerdo contém o direito. Contraexemplo: r( A B C D) a’ b’ c d a’ b’ c d’ a’ b’ c’ d a’ b’ c’ d’ a b c d lado esquerdo dá ab + a’ b + a b’ lado direito dá só a’b + a b’ 2.10.
Capítulo 3 Mais Operações e Relações Neste capítulo estudam-se operadores relacionais menos elementares. Alguns deles são generalizações generalizações dos já estudados, outros são equivalentes a séries dos anteriores. Estes operadores, juntos com um conjunto de relações e constantes, formam a álgebra relacional. relacional. Vamos ver que podemos restringir o conjunto de operadores e ainda assim manter o poder expressivo da álgebra relacional. relacional. Finalmente veremos operadores (2) que não fazendo parte da álgebra relacional, relacional, são por vezes úteis na prática. 3.1. O Opeartor Divisão r(R) e s(S) com S contido em R. R’=R-S. Então r dividido por s é a relação: r’(R’)={t|para todos os tuplos tuplos ts ε s há um tuplo tr ε r com tr(R’) = t e tr(s)=ts} r´ é o quociente de r dividido por s. Uma outra maneira é dizer que r a dividir por s é o conjunto maximal r’ de πR’(r) tal que r’ >< s está contido em r. A junção neste caso é o produto cartesiano. cartesiano. EX: certified(PILOT EQUIPMENT) a dividir por q(EQUIPMENT), dá a relação q’ todos os pilotos que podem conduzir todos os equipamentos equipamentos em q. 3.2. Relações Constantes Vimos que o efeito da selecção pode ser obtido pela junção com uma relação constante. Há uma notação para as relações constantes serem representadas representadas em expressões: expressões: representa a constante sobre o esquema A1A2...An Pode ser uma série de tuplos, o que conduz a uma coisa tipo matriz iniciada e finalizada por chavetas. No caso de um tuplo único podemos omitir as chavetas. Para um atributo único podemos omitir os wickets < > Uma relação constante de qualquer número de tuplos e qualquer núimero de atributos pode ser constituída a partir de um tuplo único com atributo único e aplicando junções e uniões. 3.3. Renomeando Atributos Se considerarmos a relação usedfor(FLIGHT DATE PLANENUM). Supunhamos Supunhamos que queremos saber todos os pares de voos que estão agendados para usar o mesmo avião no mesmo dia. Temos de fazer uma junção de usedfor com ela própria, mas ignorando as ligações na coluna FLIGHT. Podemos conseguir isso fazendo uma junção com uma cópia de usedfor, onde FLIGHT é renomeado, renomeado, para FLIGHT2, por exemplo. Introduzimos então o operador renomear δ: r(R) A ε R e B não pertence a R-A consideremos consideremos R’=(R-A)B. Então r com A renomeado para B, denotado δA<-B(r), é a relação: r’(R’)={t’ | há um tuplo t ε r com t’(R-A)=t(R-A) e t’(B) = t(A)} É requerido que A e B tenham o mesmo domínio. Então teremos que s=π{FLIGHT, FLIGHT2}(usedofr >< δFLIGHT<-FLIGHT2(usedfor)) - Na secção 3.5.1. veremos uma generalização da operação select que pode ser usada para remover a redundância da rerlação obtida com a expressão anterior. - A renomeação simultânea pode ser indicada por: δA1,A2,...,Ak <- B1, B2, ..., Bk(r) 3.4. O Operador Equijunção
Como o operador junção foi definido no capítulo 2, as relações podem apenas ser combinadas em colunas com idêntico nome e têm t êm de ser combinadas em todas as colunas. Na última secção vimos como juntar usando apenas um subconjunto daquelas colunas. As relações podem também ser combinadas em colunas com diferentes nomes de atributos, desde que tenham domínios iguais. EX: routes (NUMBER FROM TO) e based (PILOT AIRPORT), se bem combinadas combinadas permitem obter a relação canfly (NUMBER FROM TO PILOT AIRPORT), que nos dá quais os pilotos que têm a sua base no aeroporto de partida: FROM combina com AIRPORT, naquilo naquilo que se chama uma equijunçã equijunção: o: q(RS)={t | há tr ε r e ts ε s com t(R)=tr e t(S)=ts e t(Ai=t(Bi), 1< s = πABCD(r[B=B’, C=C’]δB,C <-B’,C’(s)) <-B’,C’(s)) - A principal diferença entre a equijunção e a junção natural é que a junção natural não repete as colunas ligadas. 3.5. Extensões para outras Comparações e Domínios. Até este ponto, a única única comparação entre entre valores de um domínio domínio que vimos vimos foi a igualdade. igualdade. Frequentemente, os domínios estão ordenados, pelo que faz sentido usar também os comparadores ≠, <, ≤, ≥ e >. Definido um conjunto de comparadores Θ dizemos que A é θ-comparável com B se θ está no dom(A)Xdom(B) dom(A)Xdom(B) Usamos estes comparadores para generalizar a selecção e junção. É uma restrição artificial requerer que os comparadores comparadores sejam relações binárias. Por exemplo, podemos querer que a relação unária m, no domínio dos tempos, onde hεm quer dizer um tempo na manhã; ou uma relação ternária w nos inteiros, onde w(i,j,k) quer dizer i
Capítulo 4 Dependências Funcionais Dois dos principais propósitos das bases de dados são atenuar a redundância de dados dados e aumen aumentar tar a fiabil fiabilid idade ade dos dados dados.. Qualq Qualquer uer conhec conhecime imento nto à priori priori de restrições e constrangimentos nos conjuntos de dados permissíveis tem considerável utilidade no que toca a tingir essas metas. As dependências de dados são uma das maneiras de formular esse conhecimento à priori. 4.1. Definições As dependências dependências funcionais funcionais são uma generalização generalização das chaves. chaves. ex: assign(PILOT FLIGHT DATE DEPARTS). Nem todas as combinações de pilotos, voos, datas e horas são admissíveis na relação assign. Entre outras, as seguintes restrições aplicam-se: Para cada voo há apenas uma hora de partida Para cada piloto, data, hora, há apenas um voo Para um dado voo e data, há apenas um piloto. As restrições são exemplos exemplos de dependências dependências funcionais. funcionais. Informalmente, uma dependência funcional ocorre quando os valores dum tuplo num subconjunto de atributos determinam inequivocamente inequivocamente os valores de outro conjunto de atributos. Assim: TIME depende funcionalmente de FLIGHT FLIGHT depende funcionalmente funcionalmente de {PILOT, DATE, TIME} PILOT depende funcionalmente funcionalmente de {FLIGHT, DATE} Geralmente a ordem de escrever é revertida: FLIGHT, DATE determinam funcionalmente funcionalmente PILOT ou {FLIGHT, DATE} --> PILOT. Formalmente: r satisfaz a dependência dependência funcional (FD)X->Y se para todos os X-valores x, πY(σX=x(r)) tem no máximo um tuplo. Ou de outra maneira: se t1(X) = t2(X), então t1(Y)=t2(Y). Em FD X --> Y, X é chamado o lado esquerdo e Y o lado direito. Algoritmo 4.1. SATISFIES Input: Uma relação r e uma FD X-->Y Output: true se r satisfaz X-->Y, falso de outro modo. SATISFIES(r, X-->Y); 1. Ordena-se a relação r nas suas X colunas para juntar tuplos com iguais valores de X. 2. Se cada conjunto de tuplos com X-valores iguais tem iguais Y-valores, true. Se não, false. Há dois casos extremos a considerar: X-->Φ é trivialmente satisfeita por qualquer relação. Φ-->Y só é satisfeita para aquelas relações nas quais qualquer tuplo tem o mesmo Yvalor. 4.2. Axiomas de Inferência
Nós queremos a família de FDs F que seja satisfeita em todos os estados permissíveis de r. Encontrar F requer conhecimento semântico da relação r. Há uma possibilidade de encontrar todas as FDs que r satisfaz, aplicando o algoritmo SATISF SATISFIES IES a todas todas as possi possibi bilid lidad ades. es. Mas Mas esta esta aprox aproxima imação ção não é pratic praticáve ável,l, consome muito tempo. Então, conhecendo alguns membros de F, é frequentemente possível inferir outros membros de F. F1: Reflexividade: X --> X F2: Aumentação: X --> Y implica XZ --> Y F3: Aditividade: X --> Y e X --> Z implica X --> YZ F4: Projectividade: X --> YZ implica X --> Y
F5: Transitividade: F6: Pseudotransitividade Pseudotransitividade
X --> Y e Y --> Z X --> Y e YZ --> W A mais poderosa é a transitividade. transitividade.
implica implica
X --> Z XZ --> W
4.3. Aplicando os Axiomas de Inferência
Usando os axiomas F1 a F6 é possível derivar outras regras de inferência: ex1:
de F1: Y --> Y. Aplicando F2: XY --> Y ou, outra maneira de dizer: Se Y estiver contido em X, r satisfaz X --> Y. ex2:
Se XY --> Z e X --> Y. Pelo F6: XX --> Z ou, simplificadamente, simplificadamente, X --> Z Para desprovar qualquer conjectura ( ex: XY --> ZW implica X --> Z) só precisamos de exibir uma relação onde a conjectura não funcione. f uncione. Alguns axiomas axiomas de inferência podem podem ser derivados derivados de outros. Por exemplo, a transitividade é um caso especial de F6 onde Z=Φ; F6 segue-se de F1, F2, F3 e F5. Na próxima secção veremos que os axiomas F1 a F6 são completos, isto é, todas as FDs que sejam implicadas por um conjunto F de FDs podem ser derivadas das FDs em F, por uma ou mais aplicações daqueles axiomas. Dados os axiomas F1, F2 e F6 podemos provar os outros. Assim, os axiomas F1, F2 e F6 são um subconjunto completo de F1 a F6. Os axiomas F1, F2 e F6 são também independentes: Nenhum deles pode ser provado a partir dos outros dois. São por vezes chamados axiomas de Armstrong. O fecho de F, escrito F+ é o mais pequeno conjunto contendo F, tal que os axiomas de Armstrong não podem ser aplicados para obter uma FD que não esteja no conjunto. Assim, podemos, a partir de um conjunto de FDs, aplicando aplicando F1, F2 e F6, obter o fecho de F por derivação. O fecho depende do esquema R. F+ será = (F+)+ idempotência. idempotência. Exemplo: F={AB --> C, C --> B} é um conjunto de FDs em r(A B C). F+ = { ... ver pg.49 e tentar fazer... No próximo capítulo veremos maneiras mais sucintas de expressar F+ 4.4. Complitude dos Axiomas de Inferência
Querem Queremos os mostra mostrarr que os axio axiomas mas F1 a F6 permit permitemem-nos nos inferir inferir todas todas as FDs implicadas implicadas por um conjunto F de FDs. Para provar este resultado, vamos mostrar como construir, para qualquer F, uma relação r que satisfaz todos os FD em F+ mas não outros. Definição 4.1.: X --> Y é uma FD sobre o esquema R se X e Y são ambos subconjuntos de R. F é um conjunto de FDs sobre R se todos os FDs em F forem um FD sobre R. Definição 4.2. Se F é um conjunto de FDs sobre R e G é um conjunto de todas as possíveis FDs sobre R, então F-=G-F+ - F- é o exterior de F Definição 4.3. Uma FD X -->Y é trivial se X contém Y. Se X --> Y é uma FD trivial sobre R, então qualquer relação relação r(R) satisfaz X --> Y. Se F é um conjunto de FDS sobre R e X é um subconjunto de R, então há uma FD X --> Y em F+ que Y é maximal.: para qualquer outra FD X --> Z em F+, Y contém Z. Este resultado segue-se da aditividade. O lado direito y é chamado closure de X e é denotado por X+. A closure de X contém sempre X, por reflexividade. reflexividade.
Exemplo: Consideremos Consideremos F = {A-->D, AB --> DE, CE --> G, E --> H}, então (AB)+ = ABDEH. Teorema 4.1. Os axiomas de inferência F1 a F6 são completos. Prova: ver livro pg50 Corolário: Para qualquer conjunto de FDs sobre o esquema R, há uma relação r(R) satisfazendo F+ e violando todas as Fds em F-. Essa relação é chamada a relação de Armstrong. Prova: ver livro pg50 4.5. Derivações e Derivações DAG
Se F|= X --> Y, então X-->Y está em F, ou uma série de aplicações dos axiomas de inferência a F conduzem a X-->Y. Esta sequência das aplicações dos axiomas e FDs resultantes é uma derivação de X-->Y de F. Mais formalmente, consideremos F como um conjunto de FDs sobre o esquema R. Uma sequência P de FDs sobre R é uma sequência de derivação em F se todas as FDs em P: - Forme membros de F ou - seguirem-se das FDs anteriores em P por aplicação de um dos axiomas de inferência (F1 a F6). P é uma sequência de derivação para X-->Y se X-->Y for uma das FDs em P. ex 4.10.: Consideremos Consideremos F = {AB-->E, AG__>J, BE-->I, E-->G, GI-->H}. A sequência seguinte seguinte é uma sequência sequência de derivação derivação para AB-->GH 1. AB-->E (dado) 2. AB-->AB (reflexividade) 3. AB-->B (projectividade de 2.) 4. AB -->BE (aditividade de 1 e 3) 5. BE -->I (dada) 6. AB -->I (transitividade de 4 e 5) 7. E-->G (dada) 8. AB-->G (transitividade de 1 e 7) 9. AB-->GI (aditividade de 6 e 8) 10. GI-->H (dada) 11. AB-->H (transitividade de 9 e 10) 12. GI-->GI (reflexividade) 13. GI-->I (projectividade de 12) 14. AB-->GH (aditividade de 8 e 11) Esta sequência contém FDs desnecessárias, como as 12 e 13, e é também uma sequência de derivação para outros Fds, como por exemplo AB-->GI Definição 4.4.
Consideremos P uma sequência de derivação em F. O conjunto de uso de P é o conjunto de todas as FDs em F que aparecem em P: Vimos que podemos chegar com P a um lado usando F1 a F6, mas devido à completitude de um subconjunto de regras de inferência, haverá uma sequência P´ que conduzirá ao mesmo resultado. Irem Iremos os usar usar um conj conjun unto to comp comple leto to de axio axioma mass de infe inferê rênc ncia ia que que não não são são um subc subcon onju junt nto o de F1 a F6, F6, cham chamad ados os axio axioma mas-B s-B (C é atri atribu buto to e os outr outros os são são subconjuntos subconjuntos de R): B1. Reflexividade: X --> X B2. Acumulação: X --> YZ e Z --> CW implica X --> YZC
B3. Projectividade:
X – YZ
implica
X --> Y
Como os axiomas-B são completos podemos sempre encontrar uma sequência de derivação usando-os. ex 4.11. Consideremos F o conjunto de FDs do exemplo 4.10. 1. EI-->EI (reflexividade) 2. E-->G (dado) 3. EI-->EGI (acumulação de 1 e 2) 4. EI-->GI (projectividade de 3) 5. GI-->H (dado) 6. EI-->GHI (acumulação de 4 e 5) 7. EI-->GH (projectividade de 6) 8. AB-->AB (reflexividade) 9. AB-->E (dado) 10. AB-->ABE (acumulação de 8 e 9) 11. BE-->I (dado) 12. AB-->ABEI (acumulação de 10 e11) 13. 13. AB-->A -->ABE BEGI GI (ac (acumul umula ação ção de de 4 e 12 (ou (ou 2 e 12? 12??)) 14. 14. AB-->A -->ABE BEGH GHI(a I(accumul umula ação ção de de 7 e 13) 13) 15. AB-->GH (projectividade de de 14) 5.5.1. Sequências de derivação RAP
Consideremos Consideremos sequências de derivação para X-->Y num conjunto de FDs F usando os axiomas-B que satisfazem os seguintes constrangimentos: constrangimentos: - O primeiro FD é X-->X - O último FD é X –Z> Y - Todas as outras FDs para além da primeira e da última são també FD em F ou uma Fd da forma X-->Z que foi derivada pelo axioma axioma B”. Este tipo de sequência de derivação é chamada sequência de derivação RAP , por caus causa a da orde ordem m na qual qual os axio axioma mass são são usad usados os ( Reflexividade Acumulação Projectividade). ex4.12: Consideremos o conjunto F de FDs do exemplo 4.10. 1. AB-->AB (B1) 2. AB-->E (dado) 3. AB-->ABE (B2) 4. BE-->I (dado) 5. AB-->ABEI (B2) 6. E-->G (dado) 7. AB-->ABEGI (B2) 8. GI-->H (dado) 9. AB-->ABEGHI (B2) 10. AB-->GH (B3) Teorema 4.2.
Consideremos F um conjunto de FDs. Se há uma sequência de derivação em F para X-->Y, então há uma sequência de derivação RAP em F para X-->Y Prova: ver livro na pg54 e 55 Na secção seguinte vamos introduzir um meio pictórico – uma DAG etiquetada – para descobrir sequências de derivação RAP.
4.5.2. Derivações DAG
Um Gráfico Acíclico Directo (DAG) é um grafo directo sem caminhos de um nó para ele prórpio. Um DAG etiquetado é um DAG com uma etiqueta associada a cada nó. Definição 4.5.
Consideremos F um conjunto de FDs sobre o esquema R. Uma derivação DAG baseada em F , é uma DAG etiquetada com símbolos de atributos de R construído de acordo com as seguintes regras: R1: Qualquer conjunto de nós desconectados com etiquetas de R é uma derivação DAG baseada em F. R2: Consideremos H ser uma derivação DAG baseada em F que inclui os nós v1, v2,...,vk com etiquetas A1,A2,...,Ak e deixemos A1A2...Ak-->CZ ser uma FD em F. Forma-se H’ adicionando um nó u etiquetado com C e extremos (v1,u), (v2,u),...(vk,u) a H. H´é uma derivação DAG baseada em F. R3: Nada mais é uma derivação DAG baseada em F. Vamos abreviar derivação DAG baseada em F por DDAG baseada em F ex4.13.: Consideremos Consideremos F um conjunto de FDs do exemplo 4.10. A figura seguinte seguinte mostra vários estádios estádios na construção da da DDAG baseada baseada em F. ver figura na pg57 Qualquer DDAG baseado em F é construído por uma aplicação da regra 1 e um qualquer número de aplicações da regra 2. R2 assegura que o grafo construído é realmente um DAG. Definição 4.6. Se H é um DDAG baseado em F, um nó v está em H é um nó inicial se v não tem caminhos que lhe chegam. Qualquer nó inicial foi obrigatoriamente adicionado a H pela regra R1. Definição 4.7. Consideremos Consideremos H um DDAG baseado em F. H é um DDAG para X-->Y se : D1: X é o conjunto das etiquetas dos nós iniciais D2: Todos os atributos em Y etiquetam algum nó em H Definição 4.8. O uso do conjunto ( use set of an) DDAG baseado em F H, denotado U(H), é o conjunto de todas as FDs em F usadas na aplicação da regra R2 durante a construção do DDAG.
Capítulo 6 Bases de Dados e Formas Normais
Antes de mergulharmos nas bases de dados relacionais, relacionais, convém relembrar o que são chaves e superchaves à luz do que sabemos sobre Dependências Funcionais (FDs). Chave Superchave é um conjunto qualquer de atributos que contenham uma chave. EX1: leaves(FLIGHT FROM DEPARTS TO) 16 JFK 9:10a O’Hare 142 Denver 10:32a O’Hare 146 Denver 9:30a JFK 197 Atlanta 1:15a Houston {FROM, DEPARTS, TO} é chave Em termos de FDs, uma cahve para um esquema R é um subconjunto K de R tal que qualquer relação relação r(R) permitida, permitida, satisfaz K-->R, mas não há nenhum nenhum subconjunto subconjunto de K que tenha esta propriedade. Uma Uma supe superc rcha have ve é um subc subcon onju junt nto o K de R tal tal que que K->R K->R,, mas mas não não há esta esta obrigatoriedade de minimalidade. 6.1. Bases de Dados e Esquemas de Bases de Dados
No que se segue assumimos que um esquema de relação é formado por duas partes, S e K, onde S é um conjunto de atributos e K é um conjunto de chaves designadas. Relembrar que uma chave designada pode ser uma superchave. R=(S,K). Definição 6.1. Um Esquema de Bases de Dados Relacional R sobre U é uma colecção de relações de esquema {R1, R2, ..., Rn} onde Ri=(Si, Ki), 1 ≤ i ≤ p, p U Si=U i=1 Base de Dados Dados Relac Relacion ional al d num esquema de base de dados R é uma Uma Base colecção de relações {r1, r2, ..., rn} tal que para cada esquema de relação R=(S,K) em R há uma relação r em d tal que r é uma relação em S que satisfaz todas as chaves em K.
EX 6.2. base de dados d={flies, times}, no esquema de base de dados R={(PILOT FLIGHT DATE, {PILOT DATE}), (FLIGHT DEPARTS, {FLIGHT})} Definição 6.3. Um esquema de base de dados R=({R1, R2, ..., Rn} representa um conjunto de FDs G={X->Y | alguns Ri em R incorporam X->Y}. R caracteriza completamente um conjunto de FDs F se F≡G, onde ≡ significa equivalente. EX 6.3. O esquema de base de dados R no exemplo anterior representa o conjunto de FDs G={PILOT DATE -> PILOT FLIGHT DATE, FLIGHT -> FLIGHT DEPARTS} R caracteriza completamente o conjunto F ={PILOT DATE -> FLIGHT DEPARTS, FLIGHT->DEPARTS}. Nós podemos querer colocar mais restrições sobre as relações nas nossas bases de dados, para além daquelas impostas pelas chaves designadas dos esquemas de relação.
Em alguns casos nós especificamos um conjunto de FDs F que as relações na base de dados devem satisfazer. Nem todas as FD em F se aplicam a todas as relações na base de dados. Como poderia FD AB->C aplicar-se à relação r(A,C)? Temos de modificar a definição de satisfaz para servir às bases de dados. Definição 6.4. FD X->Y aplica-se a R se X->Y é uma FD sobre R. Definição 6.5. d={r1, r2, ..., rp} em R sobre U A base de dados d satisfaz F se para todo o FD X->Y em F+ e todo o Ri em R, se X>Y se aplica a Ri, então ri satisfaz X->Y. Se G for o conjunto de todas as FDs em F+ que se aplicam a algum esquema Ri em R. Qualquer FD em G+ diz-se enforçável em R; qualquer FD em F+-G+ é ineforçável em R. O conjunto F é enforçável em R se todos os FD em F+ é enforçável em R, isto é, G≡F. Para mostrar que um conjunto F é enforçável em R, é suficiente encontrar um conjunto F’≡F tal que todos FDs em F’ se apliquem a algum esquema R em R. Definição 6.6. Uma base de dados d no esquema R obedece a um conjunto de FDs se F é enforçável em R e d satisfaz F+. Se F’ é um conjunto como descrito acima, d obedece a F se d satisfaz F’. EX 6.4. R={R1,R2,R3} R1=ABC, R2=BCD e R3=DE. let F={A->BC, C->A, A->D, D->E, A->E} FDs A->D e A->E não se aplicam a qualquer esquema esquema de relação em R. Todavia, F é enforçável em R, pois G={A->BC, C->A, C->D, D->E} é equivalente a F e todos os FDs em G se aplicam a algum esquema de relação em R. O conjunto F’={A->D} não é enforçável em R. (porquê???) 6.2. Formas Normais para Bases de Dados. Uma form forma a norm norma al é uma res restri trição ção no esqu squema ema de base base de dados que que, presumivelmente, presumivelmente, previne certos comportamentos indesejáveis indesejáveis da bases de dados. As formas normais definem-se primeiro para um esquema de relação num esquma de base de dados, e são depois estendidas para se aplicarem ao esquma de base de dados como umtodo. 6.2.1. Primeira Forma Normal (1NF) Um esquema de relação R está na 1FN se os valores no dom(A) são atómicos em todos os atributos A em R. Um esquema de base de dados R esta na 1FN se todos os seus esquemas de relação estiverem. A definição de atómico pode ser ambígua; Um valor que é atómico numa aplicação pode não o ser noutra. Uma regra geral é considerar um valor como não-atómico se a aplicação lida com parte desse valor. Qual a vantagem da 1FN? - Pode não ser possível expressar FDs em detalhe, como gostaríamos, sem a 1FN. ex: ex: born born(N (NAM AME E BIR BIRTHDA THDATE TE)) e born born(N (NAM AME E BMON BMONTH TH BDAY BDAY BYEA BYEAR) R) para para acrescentar o atributo SIGN e fazê-lo FD: BIRTHDATE->SIGN não é bom. BMONTH BDAY -> SIGN está OK. - As actualizações actualizações podem também ser um problema (ambiguidade) (ambiguidade) se o esquema não está na 1FN ex: CH(gender; Jean, male; SEX=female) 6.2.2. Anomalias e Redundância de Dados
A segunda e terceira forma apareceram para tentar evitar anomalias anomalias (efeito lateral não pretendido) pretendido) quando se actualiza as relações e evitar redundância de dados. ex: Consideremos: assign (FLIGHT DAY PILOT GATE) 112 6 June Bosley 7 112 7 June Brooks 7 203 9 June Bosley 12 FLIGHT DAY é uma chave para assign e a relação deve satisfazer também a FD FLIGHT->GATE. Nós gostaríamos de actualizar a relação especificando valores para a chave e depois dar valores para os restantes atributos. Contudo, se fizermos: CH(assign; 112, 6 June; PILOT=Bosley, GATE = 8), a relação violará a FD FLIGHT -> GATE. Para evitar violações de FD, sempre que uma actualização é feita, temos de varrer a relação e actualizar o número da GATE em todos os lugares que o número do voo surja. Para além disto o número do voo-número da gate, está em duplicado na relação, o que constitui redundância de dados. Então se fizermos: passign(FLIGHT DAY PILOT) gassign(FLIGHT GATE) 112 6 June Bosley 112 7 112 7 June Brooks 203 12 203 9 June Bosley podemos voltar à inicial, fazendo passign >
Definição 6.7. Dado um conjunto de FDs F e uma FD X->Y em F+, Y é parcialmente dependente em X sob F se X->Y não é reduzido à esquerda. Isto é, há um certo subconjunto X’ de X tal que X’->Y está em F+. Se X->Y é reduzido à esquerda, então Y é completamente dependente de X. EX 6.7. F={F F={FLI LIGH GHT T DAY DAY -> PILO PILOT T GATE GATE,, FLIG FLIGHT HT -> GATE GATE}, }, GATE GATE é parc parcia ialm lmen ente te dependente de FLIGHT DAY, enquanto PILOT é totalmente dependente de FLIGHT DAY. Definição 6.8. Dado um esquema de relação R, um atributo A em R, e um conjunto de FDs sobre R, o atributo A é prime em R com respeito a F se A está contido em alguma chave de R. Se não, A é não-prime em R. EX 6.8. R=FLIGHT DAY PILOT GATE e F igual a ao do exemplo anterior FLIGHT e DAY são prime PILOT e GATE são não-prime Definição 6.9. Um esquema de relação R está na 2FN com respeito a um conjunto de FDs se está na 1FN e todos os não-primes são totalmente dependentes de todas as chaves de R. generalização generalização para database... EX 6.9. R e F como no exemplo anterior. R não está na 2FN porque GATE é parcialmente dependente de FLIGHT DAY. Se fizermos R={FLIGHT DAY PILOT, FLIGHT GATE}, então R está na 2FN. 6.2.4. Terceira Forma Normal Consideremos Consideremos a relação assign:
assign(FLIGHT DAY PILOT-ID NAME) 112 6 June 31174 Bosley 112 7 June 30046 Brooks 203 9 June 31174 Bosley Assumimos outra vez que assign tem a chave FLIGHT DAY e satisfaz as FDs PILOTID->NAME e NAME->PILOT-ID Se fizermos a actualização CH(assign; CH(assign; 112, 6 June; PILOT-ID=31039, PILOT-ID=31039, NAME=Bosley), violamos a FD NAME->PILOT-ID. A causa do problema aqui não uma dependência dependência parcial do atributo não-prime, não-prime, apesar de a solução ser a mesma. pass passig ign( n(FL FLIGH IGHT T DAY PILO PILOTT-ID ID)) iden ident( t(PI PILO LOTT-ID ID NAME NAME)) também podemos obter a relação original através de uma junção. Definição 6.10. dado um esquema de relação R, um subconjunto X de R, um atributo A em R, e um conjunto de FDs F, A é transitivamente dependente em de X em R se há um subconjunto Y de R com X->Y, Y não -> X, e Y->A sob F e A não pertence a XY. EX 6.10. let R=FLIGHT DAY PILOT-ID NAME e F={FLIGHT DAY->PILOT-ID NAME, PILOT-ID -> NAME, NAME -> PILOT-ID}. NAME é transitivamente dependente de FLIGHT DAY Definição 6.11. Um esquema de relação está na 3FN com respeito a um conjunto de FDs, se está na 1FN e não há atributos não-primes em R transitivamente dependentes duma chave de R. generalização... generalização... EX 6.11. R={FLIGHT DAY PILOT-ID, PILOT-ID NAME} está na 3FN Lema 6.1. Qualquer esquema de relação R que esteja na 3FN está na 2FN, com respeito a F. Normalização Através da Decomposição Decomposição 6.3. Normalização É sempre possível começar com qualquer esquema de relação R que não esteja na 3FN com respeito a um F e decompô-la num esquema de base de dados que esteja na 3FN com respeito a F. Decompomos R em R1 e R2, tal que qualquer r(R) que satisfaz F decompõe-se sem perdas em R1 e R2, isto é, πR1(r) >< πR2(r) = r Podemos ter que repetir várias vezes a decomposição.