Databases Dependências Funcionais P. Serendero, 2011-13 Referências e exemplos tirados de diversas fontes, excetuando aqueles relacionados com embarcações
Dependências Funcionais (DF) Uma Base de Dados, para ser um modelo que bem represente a realidade, precisa de de ser depurada de anomalias, redundâncias e outros problemas que se presentam quando operamos nela: inserções, apagar, modificar, interrogar Utilizamos a Teoria da Normalização para fazer esta depuração Na base da normalização, estão as chamadas: Dependências Funcionais Utilizando os conceitos de chaves e dependências funcionais podemos desenhar boas relações numa BD As DF constituem um tipo de restrição de integridade, no desenho de BD
Dependências Funcionais Considere a seguinte relação: colaborador(num-empregado,num-projeto, nome-empregado, nome-projeto, num-horas) Anomalias que se podem apresentar: INSERÇÃO: Não se pode inserir um novo projeto, de não ser que um empregado seja atribuído a ele. Inversamente, não se pode inserir um novo empregado sem ter que lhe atribuir um projeto ACTUALIZAÇÃO: se mudarmos o nome dum projeto, vamos ter que atualizar em todos os muitos empregados que colaboram em dito projeto. APAGAR: Se apagarmos um projeto, vamos apagar todos os colaboradores do mesmo Portanto, NÃO É BOA PRÁTICA DE DESENHO, MISTURAR ATRIBUTOS PERTENCENTES A DISTINTAS ENTIDADES NUMA MESMA RELAÇÃO
Dependência Funcional Numa relação R, existe DF sse o valor dum conjunto de atributos X determinam o valor preciso dum outro atributo A X A ex: BI nome O conjunto dos atributos X determinam funcionalmente o atributo A (no ex. o nome depende do BI, mas o BI não depende do nome) X: O conjunto determinante A: o atributo dependente Por outras palavras, dados 2 tuplos em R, se os valores de X são os mesmos, então os valores de A devem ser também os mesmos DF é portanto uma declaração sobre todas as relações permitidas: uma restrição. A relação R satisfaz a depêndencia X Y
Dependências Funcionais Dependência Funcional Esta relação de dependência funcional também se pode expressar como subconjuntos X1,X2,..,Xm A1,...An ou X Y O símbolo da seta se lê determina, portanto o conjunto X determina o conjunto Y Isto é equivalente a dizer que a projecção π x,y R é uma função, isto é, Y é função de X Nota: A convenção em muitos textos utiliza as letras A,B,C,D, para atributos singulares e as letras X,Y,Z para conjuntos de atributos
Dependências Funcionais Portanto, numa tabela representando uma relação R, Se dois tuplos j e m coincidem no valor de todos os seus Tuplos atributos A1A, devem A2 também An coincidir B1em todos B2 os valores B3 dos seus atributos B Tuplo j Tuplo m Se j e m concordam aqui Também devem concordar aqui Efeitos da dependência funcional em dois tuplos Ullman, pag. 119
Dependências Funcionais Exemplo: Repare nos conjuntos modelo e comprimento na relação embarcação -mostrada anteriormente- : Existe um dependência entre os valores destes conjuntos. O comprimento é função do modelo. Dado um modelo de embarcação, posso encontrar o comprimento Essa dependência se expressa assim: modelo comprimento modelo Benetton I 11.25 Hurrican A 10.90 Benetton II 12.50 Laser 470 4.75 comprimento Isto tem uma aplicação imediata nas conhecidas chaves candidatas: Uma chave candidata é o subconjunto mínimo de atributos que determina todos os atributos numa relação
Dependências Funcionais Seria correto escrever a DF: comprimento modelo? Não, porque podem existir diferentes modelos com o mesmo comprimento Da mesma maneira como nome BI indicado anteriormente não é DF porque um mesmo nome (Diana por ex.) não determina um único BI O que quer dizer que se criamos uma relação com estes elementos, modelo seria a chave e comprimento o atributo Como vemos, existe normalmente DF entre a chave e os atributos numa tabela Se K é a chave primária numa relação R, então K determina funcionalmente o valor de cada um dos atributos em R. Em termos de tabelas, nunca temos dois tuplos idênticos, posto que a chave primária é única na tabela
Chaves nas relações Um ou mais atributos {A1, A2,...An } formam uma chave numa relação R, se: 1) Aqueles atributos determinam funcionalmente todos os outros atributos nessa relação Por outras palavras, é impossível que dois tuplos em R concordarem no valor de todos os seus atributos {A1, A2,...An } 2) Nenhum subconjunto em {A1, A2,...An } determina funcionalmente todos os outros atributos da relação R. Isto é, uma chave deve ser mínima. A esta denomina-se chave principal ou primária
modelo comprimento Dependências Funcionais matricula nome da embarcação num-aluno curso curso nome-curso, data-criação aluno,ano,disciplina, epoca nota Exemplos de DF na relação embarcação BI nome-pessoa Bi NIF NIF BI São estas duas dependências verdadeiras?
Dependências Funcionais Outro exemplo: Dada a relação R embarcação(matricula, nome, proprietario, pais, modelo, comprimento, boca, bi_proprietario), e as seguintes dependências funcionais matricula nome, matricula pais, matricula bi_proprietario matricula comprimento Estas dependências são corretas? NÃO!! o BI depende do seu proprietário, e não da matricula do seu barco. Uma pessoa que mude de bi, continuará a ser proprietário da mesma embarcação, identificada pelo número de matrícula A determinação do bi não depende funcionalmente da matrícula do barco Mais uma outra?
DF's Portanto um atributo é funcionalmente dependente, se o seu valor é determinado por um outro atributo que é uma CHAVE Se A B logo dado um valor para A só pode existir um valor para B Se A B e B A, logo A e B estão numa relação 1-1 Se A (B,C) logo A B e A C Se (A,B) C, não é necessariamente verdadeiro que A C e B C
Regras nas Dependências Funcionais A maneira de pensar sobre as dependências funcionais Splitting rule e combination rule Já foi dito que A1, A2,.., An B1, B2,...Bm isto quer dizer que: A1, A2,.., An B1 A1, A2,.., An B2... A1, A2,.., An Bm Podemos separar os atributos no lado direito tal que só 1 atributo aparece à direita de cada dependência funcional Da mesma maneira podemos substituir uma coleção de dependências com um lado esquerdo comum por uma dependência simples com o mesmo lado esquerdo e todos os lados direitos combinados num só conjunto de atributos X Y
Dependências Funcionais Exemplo: o conjunto de dependências: tipo-embarcação, modelo boca tipo-embarcação, modelo comprimento tipo-embarcação, modelo calado são equivalentes a dependência: tipo-embarcação, modelo boca, comprimento, calado Não existe splitting rule para o lado esquerdo da dependência Porque? tipo-embarcação boca modelo boca modelo não determina sozinho o tamanho da boca. E o tipo de embarcação também não. São precisos os dois: superchave
Regras nas Dependências Funcionais Em qualquer evento o novo conjunto de dependências é equivalente ao velho. Isto pode ser utilizado de diversas maneiras: substituindo A1, A2,.., An B1,B2,...Bm por A1, A2,.., An Bi para i = 1,2,..,m A esta transformação chama-se splitting rule Podemos substituir as dependências A1, A2,.., An Bi (i = 1,2,..,m) pela dependência simples: A1, A2,.., An B1,B2,...Bm Chamamos esta transformação, combination rule, regra de combinação
Dependências triviais Dependências Funcionais A dependência funcional A1, A2,.., An B é considerada TRIVIAL se B pertence a algum subconjunto de A Por exemplo: tipo-embarcação, modelo tipo-embarcação Portanto dependências triviais existem sempre numa relação, posto que dois tuplos que coincidem em todas as A1, A2,.., An também concordam numa delas Dependências não triviais: se pelo menos uma das B não está entre as A Dependências completamente não triviais: se nenhuma das B está entre as A
Dependências Funcionais Regras de inferência: propriedades das DF Axiomas de Amstrong: Reflexividade: Se A é um subconjunto de X, logo X A Augmentação: Se X A, logo XZ AZ, (XZ = X Ս Z) Transitividade: Se X A e A B, logo X B Aditividade: Se X Y, Z V, implica X U Z Y U V As primeiras 3 regras formam um conjunto completo de regras de inferência nas relações (U - união)
Dependências Funcionais Das regras anteriores pode-se derivar outras regras adicionais de inferência Descomposição União Se X YZ, logo X Y e X Z Se X Y e X Z, logo X YZ, onde (Y U Z) Pseudotransitividade Se X Y e WY Z, logo WX Z
Computando o fecho dos atributos Como sabemos se um conjunto de atributos é uma super chave? Computando o fecho dum atributo ajuda-nos a responder esta questão O fecho de Y, escrito como Y+ é o conjunto de todos os atributos X dos quais Y+ depende funcionalmente Numa DF olhemos para o lado esquerdo X. Se este determina igualmente um atributo A, então A vai fazer parte do fecho Y+. O fecho dum conjunto Y de DF é o conjunto Y+ de todas as DF que podem serem inferidas desde Y
Computando o fecho dos atributos Algoritmo para calcular o fecho de atributos: Começando com um conjunto de atributos, repetidamente expandimos este conjunto adicionando os lados direitos das DF dadas, na altura que incluirmos os seus lados esquerdos. Eventualmente não podemos expandir mais este conjunto. O conjunto resultante é o FECHO Algoritmo para calcular o fecho de atributos: 1. Y + = Y 2. Se A 1, A 2,..,A m B, adicionar B em Y + (adicionar uma DF) 3. Terminar quando não conseguimos adicionar mais atributos a Y + (como implementava você este algoritmo numa linguagem de programação?)
Computando o fecho dos atributos Y+ A B Se o subconjunto A determina um outro atributo B, adicionamos este ao fecho Y+ Novo Y+
Fecho dos atributos: exemplo Dada a seguinte relação R (A, B, C, D, E) e dado o seguinte conjunto de DF: A BC CD E B D E A Queremos saber se: A é ou não uma super chave desta R? Computamos o fecho A+ 1. A+ = A 2. ABC // porque A BC 3. ABCD // porque B D 4. ABCDE // porque CD E 5. ABCDE A+ = ABCDE, portanto A é uma super chave em R
Fecho dos atributos: exemplo Dada a mesma R (A, B, C, D, E) da página anterior e as mesmas DF: A BC CD E B D E A Será B uma super chave em R? Computamos o fecho B+ 1. B+ = B 2. BD // porque B D 3. BD B+ = BD, portanto B NÃO é uma super chave em R Se K todos os Ai numa R, então K é uma super chave As DF são uma generalização das chaves
Fecho de atributos - Exemplo Dado R = (A, B, C, G, H, I) e dadas DF = { A B, A C, CG H, CG I, B H } desejamos saber se AG será uma chave candidata. Portanto AG é uma super chave? ou seja AG+ R? Existe algum subconjunto de AG que seja também uma super chave? A R? é A+?, ou seja é A+ um subconjunto em R? G R? é G+?, ou seja é G+ um subconjunto em R? Para responder calculamos o fecho para AG+ 1) AG+ = AG 2) AGB //por A B 3) AGBC // por A C 4) AGBCH // por CG H 5) AGBCHI // por CG I e CG é subconjunto de AGBCH 6) ABCGHI, portanto AG é uma super chave
Dependências Funcionais Exemplo Dada a relação R(ABCDEF ) com as seguintes DF s: AB C BC A BC D D E CF B Qual será o fecho de (AB)+ (AB)+ = AB = ABC, porque AB C = ABCD, porque BC D = ABCDE, porque D E = ABCDE Se (AB)+ ser a chave principal desta relação, então o atributo F não é determinado funcionalmente por AB
Dependências funcionais Redundância entre as Dependências A C é redundante em F+ quando {A B, B C} Partes duma DF poderiam ser redundantes No lado ESQUERDO duma regra: {A B, B C, AC D} pode ser simplificada: {A B, B C, A D} No lado DIREITO duma regra: {A B, B C, A CD} Pode ser simplificada: {A B, B C, A D}
Dependências Funcionais Fim