22.1 INTRODUO Nota: Hugh Darwen foi o autor original deste captulo. Em termos informais, um banco de dados temporal aquele que contm dados histricos em vez de, ou alm de, dados atuais. Esses bancos de dados esto sob investigao ativa desde a metade dos anos setenta. Algumas dessas investigaes adotam a posio extrema de que os dados em um banco de dados desse tipo so apenas inseridos, nunca eliminados ou atualizados (veja a discusso sobre data warehouses no captulo anterior) e, nesse caso, o banco de dados contm somente dados histricos. O outro extremo um banco de dados snapshot,* que contm apenas dados atuais, e os dados so eliminados ou atualizados quando os fatos representados por esses dados deixam de ser verdadeiros (em outras palavras, um banco de dados snapshot apenas um banco de dados no sentido usual, e no um banco de dados temporal). Como exemplo, considere mais uma vez o banco de dados de fornecedores e peas da Figura 3.8. Esse banco de dados naturalmente um banco de dados snapshot, e mostra entre outras coisas que o status do fornecedor F1 atualmente 20. Em contraste, uma verso temporal desse banco de dados poderia mostrar no apenas que o status atualmente 20, mas tambm que ele 20 desde 12 de julho, e talvez que era 15 desde 5 dc abril at 30 de junho, e assim por diante. Em um banco de dados snapshot, a hora do instantneo normalmente considerada agora (isto , a hora em que o banco de dados de fato inspecionado). Ainda que a hora do instantneo seja alguma outra hora diferente de agora, isso no faz nenhuma diferena para o modo como os dados so administrados e usados. Porm, como veremos, a maneira como os dados so administrados e utilizados em um banco de dados temporal difere em uma variedade de aspectos importantes da forma como eles so administrados e usados em um banco de dados snapshot; essa a razo deste captulo. A caracterstica que distingue um banco de dados temporal , naturalmente, o prprio tempo. A pesquisa de bancos de dados temporais envolveu assim muita investigao sobre a natureza do tempo. Aqui esto algumas questes que foram exploradas: - A questo filosfica de saber se o tempo tem um incio e/ou um fim. - A questo cientfica de saber se o tempo contnuo ou ocorre em unidades (quanta) discretas. - A questo psicolgica de como melhor caracterizar o importante conceito de agora (com frequncia referenciado como o ponto mvel agora). E assim por diante. Porm, essas questes, embora sejam interessantes por si ss, no so questes especialmente relacionadas a bancos de dados, e assim no nos aprofundaremos em seu estudo neste ca 62 * No h nenhuma relao com instantneos no sentido do Captulo 9. ptulo; em vez disso, vamos apenas fazer o que esperamos sejam suposies razoveis em lugares apropriados. Essa abordagem permite que nos concentremos em assuntos mais diretamente relevantes ao nosso propsito global. Contudo, observamos que uma parte dessa pesquisa temporal resultou em generalizaes interessantes, sugerindo fortemente que as idias desenvolvidas para dar suporte a dados temporais tambm poderiam ter aplicao em outras reas. (Porm, apesar desse ltimo ponto, seguimos conveno de fazer referncia em todo este captulo a chaves temporais, operadores temporais, relaes temporais, e assim por diante, ainda que os conceitos em questo muitas vezes no sejam exclusivos para dados temporais propriamente ditos.) Cuidado, leitor! No texto seguinte, vamos nos concentrar naquelas que nos parecem ser as mais interessantes e importantes entre as vrias idias de pesquisa (em outras palavras, o captulo nossa tentativa de divulgar e explicar as partes boas dessa pesquisa, embora nos afastemos da literatura em alguns pontos sobre questes de nomenclatura e outras questes menores). Contudo, esteja ciente de que apenas uma pequena parte da tecnologia que descreveremos j est includa em qualquer SGBD comercial. As razes possveis para isso situao incluem: - Apenas recentemente o espao de armazenamento em disco se tornou econmico o bastante para fazer do armazenamento de grandes volumes de dados histricos uma proposta prtica. Porm, como vimos no Captulo 21, os data warehouses agora esto se tornando uma realidade difundida; como resultado, os usurios estaro cada vez mais diante de problemas de bancos de dados temporais e comearo a buscar solues para esses problemas. - Embora a maioria, se no todos, dos recursos que descrevemos tenham sido implementados sob a forma de prottipos, sua incorporao a produtos existentes em especial os produtos de SQL, nos quais o afastamento do modelo relacional por parte da SQL ter de ser compensado poderia ser uma perspectiva assustadora. Alm disso, a maioria dos fornecedores atualmente tem em mos vrias tentativas de fornecer suporte de relacional/objeto (consulte o Captulo 25). - A comunidade de pesquisa ainda est um pouco dividida sobre a melhor maneira de abordar o problema (e essa falta de consenso pode ter sobrado para os fornecedores). Alguns pesquisadores defendem uma abordagem muito especializada uma abordagem que envolve um certo abandono dos princpios relacionais que favorece especificamente os dados temporais e deixa alguns outros problemas sem soluo (por exemplo, consulte a referncia [22.4]). Outros defendem a oferta de mais operadores de uso geral que possam fornecer uma base para o desenvolvimento de um enfoque especializada, se necessrio, embora no se afastando da estrutura relacional (por exemplo, consulte a referncia [22.3]). E desnecessrio dizer que preferimos essa ltima abordagem. Adiamos uma explicao sobre a estrutura deste captulo para a seo imediatamente seguinte. 22.2 DADOS TEMPORAIS Se os dados so uma representao codificada dos fatos, ento os dados temporais so uma representao codificada de fatos marcados com timestamps. Em um banco de dados temporal, de acordo com a interpretao extrema desse termo, todos os dados so temporais, significando que todo fato registrado marcado com um timestamps. Segue-se que uma relao temporal aquela na qual cada tupla inclui pelo menos um timestamps (isto , o cabealho inclui ao menos um atributo de algum tipo de timestamps). Segue-se ainda que uma varivel de relao temporal aquela cujo cabealho o de uma relao temporal, e um banco de dados temporal (relacional) aquela no qual todas as variveis de relaes so temporais. Nota: estamos sendo deliberadamente vagos aqui sobre a aparncia que poderiam ter dados de algum tipo de timestamps. Comearemos a estudar esse assunto nas Sees 22.3 a 22.5. Tendo oferecido uma definio razoavelmente precisa do conceito de banco de dados temporal (em sua forma extrema), agora deixamos de lado esse conceito por no ser muito til! Vamos ignor-lo porque, ainda que as variveis de relaes originais no banco de dados fossem todas temporais, muitas 629 relaes que podem ser derivadas desse banco de dados (por exemplo, como resultados de consultas) no so temporais. Por exemplo, a resposta consulta Obter os nomes de todas as pessoas que j empregamos poderia ser obtida de algum banco de dados temporal, mas ela prpria no uma relao temporal. E esse SGBD seria realmente estranho certamente no um SGBD relacional se nos permitisse obter resultados que no pudessem ser eles prprios mantidos no banco de dados. Ento, neste captulo, consideraremos um banco de dados temporal como um banco de dados que inclui alguns dados temporais, mas no est limitado apenas a dados temporais. O restante do captulo apresenta esses bancos de dados em detalhes. Portanto, o plano do captulo : - O restante desta seo e a Seo 22.3 definem o cenrio para as sees subsequentes. Em particular, a Seo 22.3 mostra por que os dados temporais parecem exigir tratamento especial. - As Sees 22.4 e 22.5 introduzem intervalos como um modo conveniente de marcar os dados com timbres de hora. As Sees 22.6 e 22.7 discutem ento uma variedade de operadores escalares e de agregados para lidar com tais intervalos. - A Seo 22.8 introduz alguns importantes e novos operadores relacionais para uso sobre relaes temporais. - A Seo 22.9 examina a questo de restries de integridade para dados temporais. A seo 22.10 discute os problemas especiais de atualizar tais dados. - Por fim, a Seo 22.11 prope algumas idias relevantes (e possivelmente novas) sobre projeto de bancos de dados, e a Seo 22.12 apresenta um resumo. Nota: importante entender que com apenas uma exceo, o gerador de tipo de intervalo introduzido na Seo 22.5 todos os novos operadores e outras construes a serem discutidas a seguir so apenas abreviaes. Isto , todas elas podem ser expressas (embora de modo muito enfadonho, s vezes) em termos de caractersticas j disponveis em uma linguagem relacional completa como Tutorial D. Justificaremos essa afirmao medida que prosseguirmos (em alguns casos, mas no em todos). Alguns conceitos e perguntas bsicas Comeamos chamando a ateno para o modo como as pessoas expressam o que se pode denominar declaraes marcadas com timestamps em linguagem natural. Aqui esto trs exemplos: 1. O fornecedor Fi foi designado (isto , colocado sob contrato) em 12 de julho de 1999. 2. O fornecedor Fi um fornecedor contratado desde 12 de julho de 1999. 3. O fornecedor Fi foi um fornecedor contratado durante o perodo de 12 de julho de 1999 at o dia de hoje. Cada uma dessas declaraes uma interpretao possvel de uma 2-tupla contendo o nmero de fornecedor Fi' e o timestamps 12 de julho de 199 9, e cada uma delas pode ser a representao apropriada dessa 2-tupla se ela aparece em um banco de dados snapshot que mostra a situao atual em alguma empresa. As preposies, destacadas em negrito, em, desde e durante caracterizam as interpretaes diferentes. Nota: ao longo deste captulo, usamos desde e durante no sentido estrito de desde ento e ao longo de (o perodo em questo), respectivamente, exceto se houver instrues explcitas em contrrio. Agora, embora tenhamos acabado de nos referir a trs interpretaes possveis, pode-se argumentar que as declaraes 1, 2 e 3 esto na realidade dizendo todas a mesma coisa, com ligeiras diferenas. De fato, consideramos as declaraes 2 e 3 equivalentes, mas no as declaraes 1 e 2 (ou 1 e 3). Vamos examinar algumas consideraes: - A declarao 1 afirma claramente que Fi no era um fornecedor contratado na data (30 de junho de 1999) imediatamente anterior data de designao especificada; a declarao 2 no enuncia esse fato nem o implica. 630 - Vamos supor que hoje (o dia atual) seja o dia 25 de setembro de 2000. Ento, a declarao 2 enuncia claramente que Fi era um fornecedor contratado em todos os dias, de 1 de julho de 1999 a 25 de setembro de 2000, inclusive; a declarao 1 no enuncia esse fato, nem o implica. Desse modo, as declaraes 1 e 2 no so equivalentes, e nem uma delas implica a outra. Dito isto, as tuplas em bancos de dados snapshots frequentemente incluem algo como data de designao, e declaraes como a declarao 2 (ou 3) muitas vezes tm a interpretao pretendida. Se esse o caso aqui, ento a declarao 1 em sua forma atual no uma interpretao totalmente precisa da tupla em questo. Podemos torn-la mais precisa reformulando a frase deste modo: O fornecedor Fi foi designado mais recentemente em 12 de julho de 1999. Alm disso, se essa verso da declarao 1 realmente aquilo que nossa 2-tupla hipottica deve indicar, ento a declarao 2 em sua forma atual tambm no uma interpretao totalmente precisa ela precisa ser reformulada assim: O fornecedor Fi no era um fornecedor contratado em 30 de junho de 1999, mas sim desde 12 de julho de 1999. Observe agora que a declarao 1 expressa um tempo em que um certo evento ocorreu, enquanto as declaraes 2 e 3 expressam um intervalo no tempo durante o qual um certo estado persistiu. Escolhemos deliberadamente um exemplo em que um certo estado poderia ser deduzido a partir de informaes relativas a um certo evento. Como Fi foi mais recentemente designado em 12 de julho de 1999, esse fornecedor se manteve no estado sob contrato desde essa data at o dia atual. A tecnologia clssica de bancos de dados pode tratar instantes de tempo (momentos nos quais ocorrem eventos) razoavelmente bem; porm, ela no trata intervalos de tempo (perodos de tempo durante os quais os estados persistem) muito bem, como veremos na Seo 22.3. Observe em seguida que, embora as declaraes 2 e 3 sejam logicamente equivalentes, sua forma bem diferente. Para sermos especficos, a forma da declarao 2 no pode ser usada para registros histricos, enquanto a da declarao 3 pode desde que a frase o dia atual nessa declarao seja substituda por alguma data explcita, digamos 25 de setembro de 2000. (E claro que a declarao corresponderia ento a uma 3-tupla, e no a uma 2-tupla.) Conclumos que o conceito de durante muito importante para registros histricos, pelo menos para dados de estado, se no para dados de eventos.* Terminologia: o(s) tempo(s) em que um certo evento aconteceu ou o(s) intervalo(s) durante o(s) qual(is) um certo estado persistiu so s vezes chamados de tempo vlido. Mais precisamente, o tempo vlido de uma proposio p o conjunto de tempos em que se acredita que p verdadeira. Ele se distingue do tempo de transao, que o conjunto de tempos em que p era realmente representada no banco de dados como sendo verdadeira. Os tempos vlidos podem ser atualizados para refletir convices variveis, mas os tempos de transao no podem; isto , os tempos de transao so inteiramente mantidos pelo sistema, e nenhum usurio tem permisso para alter-los (em geral, claro, eles so registrados explcita ou implicitamente no log de transaes). Nota: as referncias no pargrafo anterior a intervalos e conjuntos de tempos introduzem tacitamente uma idia simples mas fundamental isto , que um intervalo com tempo de incio s e tempo de trmino e denota realmente o conjunto de todos os tempos t tais que s _ t _ e (onde <significa anterior a, claro). Embora bvia, essa noo simples tem consequncias de longo alcance, como veremos nas sees seguintes. Ora, grande parte da discusso precedente teve o objetivo deliberado de fazer surgirem certas perguntas em sua mente. Independentemente de termos sido bem-sucedidos nesse propsito, vamos agora levantar essas perguntas explicitamente e tentar respond-las. 1. A expresso todos os tempos t tais que s _ t _ e no levanta o espectro de conjuntos infinitos e as dificuldades conceituais e computacionais das quais esses conjuntos se ressentem? Resposta: bem, sim, ao que parece, mas ignoramos o espectro e contornamos as dificuldades, adotando a suposio de que a linha de tempo consiste em uma sequncia finita de quanta de tempo * Aqui um lugar to bom quanto qualquer outro para observarmos que, apesar de nosso uso repetido de termos como registros histricos, os bancos de dados temporais tambm podem muito bem conter informaes relativas ao futuro. Por exemplo, poderamos querer registrar o fato de que o fornecedor F 1 ser um fornecedor contratado durante o perodo de a at b, onde a e b so ambas datas no futuro. 631 discretos e indivisveis. O intervalo com tempo de incio s e tempo de trmino e envolve portanto um nmero finito de tais quanta. Nota: grande parte da literatura se refere a um quantum de tempo como um chronon. Porm, continua ento a definir um chronon como um intervalo (veja, por exemplo, o glossrio na referncia [22.2]), implicando que ele tem um ponto de incio e um ponto de trmino, e talvez pontos adicionais entre eles e, afinal, no indivisvel. (O que so exatamente aqueles pontos? O que mais eles poderiam ser se no chronons?) Encontramos aqui uma certa confuso, e assim optamos por evitar o termo. 2. As declaraes 1, 2 e 3 parecem pressupor que esses quanta de tempo so dias mas, seguramente, o sistema admite precises em medidas de tempo que chegam at fraes minsculas de um segundo. Se Fi era um fornecedor em 12 de julho de 1999, mas no em 30 de junho de 1999, o que podemos dizer sobre o perodo de tempo presumido desde o comeo em 12 de julho at o instante exato da designao, durante o qual Fi ainda no estava oficialmente sob contrato? Resposta: precisamos distinguir cuidadosamente entre quanta de tempo como tais, que so as menores unidades de tempo que o sistema pode representar, e as unidades de tempo que so teis para algum propsito particular, as quais podem ser anos, meses, dias ou semanas etc. Chamamos essas unidades de pontos de tempo (pontos, para abreviar), a fim de enfatizar o fato de que para o propsito em questo elas tambm so consideradas indivisveis. Agora, podemos dizer de modo informal que um ponto de tempo uma seo da linha de tempo isto , o conjunto de quanta de tempo - que se estende de um quantum limite at o seguinte (por exemplo, da meia-noite de um dia meia-noite do dia seguinte). Podemos ento dizer, mais uma vez informalmente, que os pontos de tempo tm uma durao um dia, em nosso exemplo. Porm, formalmente, os pontos de tempo so (repetimos) indivisveis, e o conceito de durao no se aplica de forma estrita. Nota: grande parte da literatura usa o termo grnulo para se referir a algo como um ponto de tempo da forma recm- definida. Contudo, como ocorre com o termo chronon, infelizmente ela continua a dizer que um grnulo um intervalo. Ento, optamos tambm por evitar o termo grnulo.* Porm, fazemos uso do termo (informal) granularidade, que definimos (mais uma vez de modo informal) como a durao do ponto de tempo aplicvel. Desse modo, podemos dizer em nosso exemplo que a granularidade de um dia, significando que estamos rejeitando nesse contexto nossa noo usual de que um dia formado por horas, as quais so formadas de minutos, etc. (essas noes s podem ser expressas recorrendo-se a nveis mais finos de granularidade). 3. Ento, considerando-se que a linha de tempo basicamente uma sequncia de pontos de tempo (de alguma granularidade), podemos nos referir de modo no ambgua ao tempo imediatamente seguinte (ou precedente) a qualquer ponto dado. Isso correto? Resposta: sim, at certo ponto o ponto em questo sendo, claro, o trmino do tempo! E tambm at certo ponto o incio do tempo. To quanto nos concerne, o incio do tempo um ponto de tempo que no tem nenhum predecessor (talvez ele corresponda melhor estimativa dos cosmlogos sobre o momento exato do suposto Big Bang); o trmino do tempo um ponto de tempo que no tem nenhum sucessor. 4. Se alguma relao inclui uma 3-tupla representando o fato de que o fornecedor F1 estava sob contrato desde 12 de julho de 1999 at 25 de setembro de 2000, a Hiptese de Mundo Fechado (consulte o Captulo 5) no demanda que a mesma relao tambm inclua, por exemplo, uma 3-tupla representando o fato de que Fi estava sob contrato desde 2 de julho de 1999 at 24 de setembro de 2000. E uma srie de outras 3-tuplas representando outras consequncias triviais da 3-tupla original? Parece que a confuso sobre o fato de chronons e grnulos serem ou no intervalos origina-se de uma confuso sobre intuio versus formalismo. Uma crena intuitiva sobre o modo como o mundo funciona uma coisa; um modelo formal algo bem diferente. Em particular, podemos acreditar que a linha de tempo contnua e infinita, mas a modelamos para os fins de computao em particular como discreta e finita. Nota: enquanto estamos nesse assunto, devemos dizer tambm que, embora o conceito de quantum de tempo (ou chronon) seja til como uma base para explicar o modelo formal em um nvel intuitivo, ele no 632 em si uma parte desse modelo e no tem nenhum papel a desempenhar nele. Resposta: boa pergunta! claro que precisamos de um predicado mais restritivo como nossa interpretao geral dessas 3-tuplas: O fornecedor Fx estava sob contrato em todos os dias desde a datas at a data e, mas no no dia imediatamente anterior a s, nem no dia imediatamente seguinte a e.* Essas interpretao mais restritiva em sua forma geral, fornece a motivao e a base para muitos operadores que descrevemos neste captulo, em particular nas Sees 22.8 e 22.10. 22.3 QUAL O PROBLEMA? Continuamos a usar fornecedores e peas como base para nossos exemplos no restante deste captulo, mas precisamos fazer algumas revises no banco de dados, de modo que ele possa servir adequadamente finalidade. Fazemos essas revises pea por pea. Em primeiro lugar, descartamos a varivel de relao de peas P, por simplicidade. Em segundo lugar, modificamos a varivel de relao de remessas FP, descartando o atributo QDE (deixando apenas F# e P#), e interpretamos essa varivel de relao revisada FP assim: O fornecedor F# atualmente capaz de fornecer pea P# (em outras palavras, em lugar de se referir a remessas reais de peas por fornecedores, agora a varivel de relao se refere apenas a remessas potenciais isto , capacidade de fornecedores para fornecerem peas). A Figura 22.1, uma verso revisada da Figura 3.8 do Captulo 3, apresenta um conjunto de valores de dados de amostra para esse banco de dados revisado. Observe cuidadosamente que o banco de dados ainda um banco de dados snapshot ele ainda no inclui aspectos temporais. FP F# P# Fi P1 Fi P2 Fi P3 F1 P4 Fi P5 F2 P5 Fi P6 F2 P1 F2 P2 F3 P2 F4 P2 F4 P4 F4 P5 F FIGURA 22.1 O banco de dados de fornecedores e remessas (amostra de valores) verso atual snapshots Agora, vamos proceder discusso sobre algumas restries e consultas simples para esse banco de dados. Mais tarde, consideraremos o que ocorre a essas restries e consultas quando o banco de dados estendido para incluir vrios recursos temporais. Restries (banco de dados atual snapshots): as nicas restries que desejamos considerar so as vrias restries de chaves. Apenas para lembr-lo, {F#} e (F#,P#} so as chaves primrias de F e FP, respectivamente, e {F#} uma chave estrangeira em FP que referencia a chave primria de F (ignoramos a chave estrangeira {P#}, claro). Consultas (banco de dados snapshots atual): consideramos apenas duas consultas, ambas muito simples: * Em todo este captulo, usamos o termo no qualificado predicado para fazer referncia ao que chamamos no Captulo 8 de predicado externo ou entendido pelo usurio, e no ao predicado interno ou entendido pelo sistema (esse ltimo , na verdade, o predicado de varivel de relao). Alm disso, ignoramos aspectos desses predicados externos que so bvios ou no-relevantes para o assunto em discusso. 633 F# FNOME STATUS CIDADE Fi Smith 20 Londres F2 Jones 10 Paris F3 Blake 30 Paris F4 Clark 20 Londres F5 Adams 30 Atenas - Consulta 1.1: Obter nmeros de fornecedores dos fornecedores que so atualmente capazes de fornecer alguma pea. FP { F# } - Consulta 1.2: Obter nmeros de fornecedores correspondentes a fornecedores que so atualmente incapazes de fornecer qualquer pea. F{F#}MINUSFP{F#} Observe que Consulta 1.1 envolve uma simples projeo e que Consulta 1.2 envolve a diferena entre duas dessas projees. Mais tarde, quando considerarmos anlogos temporais dessas duas consultas, descobriremos que elas envolvem anlogos temporais desses dois operadores (consulte a Seo 22.8). Nota: provvel que voc no se surpreenda ao aprender que os anlogos temporais de outros operadores relacionais tambm podem ser definidos (consulte o Exerccio 22.8). Semitemporalizao de fornecedores e remessas Para continuarmos de modo elegante, nosso prximo passo efetuar a semitemporalizao (por assim dizer) das variveis de relaes F e FP, acrescentando um atributo de timestamps DESDE a cada uma e renomeando-as de acordo. Consulte a Figura 22.2. FIGURA 22.2 O banco de dados de fornecedores e remessas (amostra de valores) verso semitemporal Por simplicidade, no mostramos timbres de hora reais na Figura 22.2; em vez disso, usamos smbolos da forma dOl, d02, etc., onde d pode representar convenientemente dia, uma conveno qual vamos aderir em todo este captulo. (Desse modo, todos os nossos exemplos fazem uso de pontos de tempo que so, especificamente, dias.) Vamos supor que o dia 1 preceda imediatamente o dia 2, que o dia 2 preceda imediatamente o dia 3, e assim por diante; alm disso, descartamos os zeros iniciais no significativos de expresses dia 1 (como voc pode observar). O predicado para F_DESDE O fornecedor F# foi denominado FNOME, tinha o status STATUS, estava localizado na cidade CIDADE e se encontrava sob contrato desde o dia DESDE. O predicado para FP_DESDE O fornecedor F# foi capaz de fornecer a pea P# desde o dia DESDE. Restries (banco de dados semitemporal): a chave primria e as chaves estrangeiras para esse banco de dados semitemporalizado so iguais s de antes. Porm, precisamos de uma restrio adicional 634 uma que possa ser imaginada como um aumento da restrio de chave estrangeira de FP_DESDE para FDESDE FP DESDE F# FNOME STATUS CIDADE DESDE Fi Smith 20 Londres d04 F2 Jones 10 Paris d07 F3 Blake 30 Paris d03 F4 Clark 20 Londres d04 F5 Adams 30 Atenas d02 F# P# DESDE F1 P1 d04 Fi P2 d05 F1 P3 d09 F1 P4 d05 Fi P5 d04 F1 P6 d06 F2 P1 d08 F2 P2 d09 F3 P2 d08 F4 P2 d06 F4 P4 d04 F4 P5 d05 F_DESDE a fim de expressar o fato de que nenhum fornecedor pode fornecer qualquer pea antes desse fornecedor ser colocado sob contrato. Em outras palavras, se a tupla fp em FP_DESDE referencia a tupla [em F_DESDE, o valor de DESDE em fp no deve ser menor que esse valor em CONSTRAINT AUGFPPARAFFK ISEMPTY ( ( ( FDESDE RENAME DESDE AS FD ) JOIN FPDESDE RENAME DESDE AS FPD WHERE FPD < FD ) ) ; Com esse exemplo, comeamos a ver o problema. Dado um banco de dados semitemporal como o da Figura 22.2, provavelmente teremos de enunciar muitas restries de chaves estrangeiras aumentadas como essa, e logo comearemos a desejar ter alguma abreviao conveniente para essa finalidade. Consultas (banco de dados semitemporal): agora, consideramos verses semitemporais das Consultas 1.1 e 1.2. - Consulta 2.1: Obter nmeros de fornecedores correspondentes a fornecedores que so capazes atualmente de fornecer alguma pea, mostrando em cada caso a data a partir da qual eles foram capazes de de faz-lo. Se o fornecedor Fx capaz atualmente de fornecer vrias peas, ento Fx foi capaz de fornecer alguma pea desde a data DESDE mais antiga mostrada para Fx em FP_DESDE (por exemplo, se Fx Fi, essa data DESDE mais antiga d04). Consequentemente: SUMMARIZE FP PER FP { F# } ADD MIN ( DESDE ) AS DESDE Resultado: F# DESDE Fi d04 F2 d08 F3 d08 F4 d04 - Consulta 2.2: Obter nmeros de fornecedores correspondentes a fornecedores que esto atualmente impossibilitados de fornecer qualquer pea, mostrando em cada caso a data a partir da qual eles foram impossibilitados faz-lo. Em nossos dados de amostra existe apenas um fornecedor que atualmente est impossibilitado de fornecer quaisquer peas, o fornecedor F5. Porm, no podemos deduzir a data a partir da qual o fornecedor F5 ficou sob contrato, mas foi incapaz de fornecer quaisquer peas, porque no existem informaes suficientes no banco de dados o banco de dados ainda est apenas semitemporalizado. Por exemplo, vamos supor que diO seja o dia atual. Ento, talvez F5 fosse capaz dc fornecer pelo menos um pea desde a data d02, quando F5 foi designado pela primeira vez, at a data d09; ou, indo ao outro extremo, talvez F5 nunca tivesse fornecido qualquer pea. Para ter qualquer esperana de responder Consulta 2.2, devemos completar o temporalizao do nosso banco de dados ou, pelo menos, da parte FP desse banco de dados. Para sermos mais precisos, devemos manter registros histricos no banco de dados, mostrando quais fornecedores tiveram a possibilidade de fornecer quais peas e quando isso ocorreu, como veremos na subseo imediatamente seguinte. Temporalizao completa de fornecedores e remessas A Figura 22.3 mostra uma verso completamente temporalizada de fornecedores e remessas. Observe que os atributos DESDE se tornaram atributos DE, e cada varivel de relao adquiriu um atributo adicional de timestamps chamado PARA. Os atributos DE e PARA expressam juntos a noo de um intervalo 635 de tempo durante o qual algo verdadeiro; por isso, substitumos DESDE por DE_PARA nos nomes das variveis de relaes. Tendo em vista que agora estamos mantendo registros histricos, existem mais tu- pias nesse banco de dados do que havia em qualquer um de seus predecessores, como podemos observar. Vamos supor para manter a preciso que a data atual diO, e assim diO se mostra como o valor PARA correspondente a cada tupla que pertence atual situao. Nota: voc deve estar imaginando que mecanismo poderia fazer todos esses valores dl O serem substitudos por dli meia-noite. Infelizmente, temos de deixar essa questo de lado por enquanto; voltaremos a ela na Seo 22.11. Observe que o banco de dados temporal da Figura 22.3 inclui todas as informaes do banco de dados semitemporal da Figura 22.2, juntamente com informaes histricas referentes a um perodo anterior (de d02 a d04) durante o qual o fornecedor F2 estava sob contrato. O predicado para F_DE_PARA O fornecedor F# foi denominado FNOME, tinha o status STATUS, estava localizado na cidade CIDADE e estava sob contrato, desde o dia DE (e no no dia imediatamente anterior a DE) at o dia PARA (e no no dia imediatamente aps PARA). O predicado para FP_DE PARA anlogo. FD E_PARA FI G URA 22.3 O banco de dados de fornecedores e remessas (amostra de valores) primeira verso temporal completa, usando timbres de hora Restries (primeiro banco de dados temporal): em primeiro lugar, precisamos nos resguardar contra a possibilidade absurda de aparecer um par DE em que o ponto de tempo PARA precede o ponto de tempo DE: CONSTRAINT F DE PARA 0K ISEMPTY ( F DE PARA WHERE PARA < DE CONSTRAINT FP DE PARA 0K ISEMPTY ( FP DE PARA WHERE PARA < DE Em seguida, observe pelo sublinhado duplo na Figura 22.3 que inclumos o atributo DE na chave 636 primria, tanto para F_DE_PARA quanto para FP_DE_PARA; por exemplo, a chave primria de FP DE PARA F# FNOME STATUS CIDADE DE PARA Fi Smith 20 Londres d04 diO F2 Jones 10 Paris d07 diO F2 Jones 10 Paris d02 d04 F3 Blake 30 Paris d03 diO F4 Clark 20 Londres d04 diO F5 Adams 30 Atenas d02 diO F# P# DE PARA Fi P1 d04 diO Fi P2 d05 diO Fi P3 d09 diO El P4 d05 diO Fi P5 d04 diO Fi P6 d06 diO F2 P1 d02 d04 F2 P2 d03 d03 F2 P1 d08 diO F2 P2 d09 diO F3 P2 d08 diO F4 P2 d06 d09 F4 P4 d04 d08 F4 P5 d05 diO FDEPARA evidentemente no pode ser apenas {F#}, pois no poderamos ter o mesmo fornecedor sob contrato por mais de um perodo contnuo. Uma observao semelhante se aplica a FP_DE_PARA. Nota: poderamos ter usado os atributos PARA em vez dos atributos DE; na verdade, F_DE PARA e FPDEPARA tm ambas duas chaves candidatas e so bons exemplos de variveis de relaes para as quais no existe nenhuma razo bvia para escolher uma dessas chaves como primrias [8.13]. Fazemos essas escolhas unicamente por razes de preciso. Porm, essas chaves primrias no capturam sozinhas todas as restries que gostaramos que elas capturassem. Considere, por exemplo, a varivel de relao FP_DE_PARA. Devia ficar claro que, se existe uma tupla para o fornecedor Fx nessa varivel de relao com valor DE [e valor PARA t, ento queremos que no exista uma tupla para o fornecedor Fx nessa varivel de relao indicando que Fx estava sob contrato no dia imediatamente anterior a f ou no dia imediatamente aps t. Por exemplo, considere o fornecedor Fi, para o qual temos apenas uma tupla FP_DE_PARA, com DE = d04 e PARA = dIO. O simples fato de {F#,DE} ser a chave primria para essa varivel de relao claramente insuficiente para evitar o aparecimento de uma tupla P1 adicional superposta com (digamos) DE = d02 e PARA = d06, indicando entre outras coisas que P1 estava sob contrato no dia imediatamente anterior a d04. E claro que gostaramos que essas duas tuplas P1 fossem fundidas em uma nica tupla com DE = d02 e PARA = dlO.* O fato {F#,DE} ser a chave primria para FP_DE_PARA tambm insuficiente para evitar o aparecimento de uma tupla Fi adjacente com (digamos) DE = d02 e PARA = d03, indicando novamente que Fi estava sob contrato no dia imediatamente anterior a d04. Como antes, gostaramos que as tuplas fossem fundidas em uma nica tupla. Aqui est ento uma restrio que probe tais tuplas superpostas e adjacentes: CONSTRAINT AUGFDEPARAPK ISEMPTY ( ( ( E_DE_PARA RENAME DE AS Ei, PARA AS Ti ) JOIN F_DE_PARA RENAME DE AS F2, PARA AS T2 WHERE ( Ti _ F2 AND T2 _ Fi ) ) OR ( F2Ti+iORFi T2+i ) ) Essa expresso bastante complicada! para no mencionarmos que tomamos a liberdade de escrever (por exemplo) Ti + 1 para designar o sucessor imediato do dia denotado por Ti, um ponto ao qual voltaremos na Seo 22.5. Nota: supondo que essa restrio seja de fato enunciada (e imposta, claro), alguns autores fariam referncia combinao de atributos {F#,DE,PARA} como uma chave candidata temporal (de fato, uma chave primria temporal). Porm, o termo no muito bom, porque a chave candidata temporal no de fato uma chave candidata em primeiro lugar! da varivel de relao que a contm. (Em contraste, na Seo 22.9, encontraremos chaves candidatas temporais que so genuinamente chaves candidatas no sentido clssico.) Em seguida, observe cuidadosamente que a combinao de atributos {F#,DE} na varivel de relao FP DE PARA no uma chave estrangeira de FP_DE_PARA para F_DE_PARA (embora envolva os mesmos atributos que a chave primria de F_DE_PARA). Porm, precisamos assegurar que se um certo fornecedor aparece em FPDE_PARA, ento esse mesmo fornecedor tambm aparece em F_DE_PARA: CONSTRAINT AUGFPPARAFFKNOVAMENTE1 FP_DE_PARA { F# } _ F_DE_PARA { F# } ; (usando _ para indicar um subconjunto de). Porm, a restrio AUG_FP_PARA_F_FKNOVAMENTEI no suficiente por si s; tambm precisamos assegurar que mesmo que toda a fuso de tuplas desejada tenha sido feita se FP_DE_PARA mostra algum fornecedor como sendo capaz de fornecer alguma pea durante algum intervalo de tempo, ento F_DE PARA mostra que o mesmo fornecedor est sob contrato durante esse mesmo intervalo de tempo. Poderamos tentar o seguinte: * Observe que no fundir (coalesce) tais tuplas seria quase to ruim quanto permitir duplicatas! Duplicatas equivalem a dizer a mesma coisa duas vezes, e essas duas tuplas para Fi com superposio de intervalos de tempo na verdade dizem a mesma coisa suas vezes; para sermos especficos, dizem que Fi estava sob contrato nos dias 4, 5 e 6. 637 CONSTRAINT AUG FP PARAFFKNOVAMENTE2 / Ateno incorreta! */ ISEMPTY ( ( F_DE_PARA RENAME DE AS SF, PARA AS ST ) JOIN FPDE PARA RENAME DE AS EPE, PARA AS FPT WHERE FPF < SF OR FPT > ST ) Contudo, como indica o comentrio, essa especificao de fato incorreta. Para ver por que, considere F_DE_PARA mostrada na Figura 22.3 e considere que FP_DE_PARA inclui uma tupla para o fomeced()r F2 com (digamos) DE = d03 e PARA = d04. Tal organizao claramente consistente, e ainda assim a restrio AUG_FP_PARA_F_FK_NOVAMENTE2 enunciada na realidade a probe. No tentaremos corrigir esse problema aqui, adiando-o para uma seo posterior (Seo 22.9). Porm, destacamos como uma questo de terminologia que, como observamos antes, se a combinao de atributos {F#,DE,PARA} na varivel de relao F_DE_PARA for considerada uma chave candidata temporal, ento a combinao de atributos {F#,DE,PARA} na varivel de relao FP DEPARA poderia ser considerada uma chave estrangeira temporal (embora ela no seja de fato uma chave estrangeira). Mais uma vez, consulte a Seo 22.9 para ver uma discusso adicional. Consultas (primeiro banco de dados temporal): agora aqui esto verses totalmente temporais das Consultas 1.1 e 1.2: - Consulta 3.1: Obter triplas F#-DE-PARA para fornecedores que foram capazes de fornecer alguma pea em algum momento, onde DE e PARA designam juntos um perodo mximo contnuo durante o qual o fornecedor F# foi de fato capaz de fornecer alguma pea. Nota: usamos o termo mximo aqui como uma abreviao conveniente para indicar (no caso em questo) que o fornecedor F# estava impossibilitado de fornecer qualquer pea no dia imediatamente anterior a DE ou aps PARA. - Consulta 3.2: Obter triplas F#-DE-PARA correspondentes a fornecedores que estavam impossibilitados de fornecer quaisquer peas em algum momento, onde DE e PARA juntos designam um perodo mximo contnuo durante o qual o fornecedor F# foi de fato incapaz de fornecer qualquer pea. Bem, talvez voc queira ocupar um pouco de tempo para se convencer de que, como ns, preferiria nem mesmo tentar essas consultas! Porm, se fizer a tentativa, o fato que elas podem ser expressas, embora de forma excessivamente laboriosa, ir emergir mais tarde, mas com certeza ser bvia a necessidade de algum tipo de abreviao. Portanto, em resumo, o problema de dados temporais que eles conduzem a restries e consultas que so exageradamente complexas para enunciar a menos que o sistema fornea algumas abreviaes bem projetadas, claro, o que os SGBDs comerciais de hoje (at onde conhecemos) no fazem. 22.4 INTERVALOS Agora, vamos iniciar nosso desenvolvimento desse conjunto apropriado de abreviaes. O primeiro e mais fundamental passo reconhecer a necessidade de lidar com intervalos propriamente ditos, em vez de ter de trat-los como pares de valores separados, como viemos fazendo at este ponto. O que exatamente um intervalo? De acordo com a Figura 22.3, o fornecedor F1 podia fornecer a pea P1 durante o intervalo do dia 4 at o dia 10. Porm, o que significa do dia 4 at o dia 10'? E claro que os dias 5, 6, 7, 8 e 9 esto includos mas o que dizer dos pontos inicial e final, os dias 4 e 10? Ocorre que, dado algum intervalo especfico, s vezes queremos considerar os pontos inicial e final especificados como includos no intervalo, e s vezes no. Se o intervalo do dia 4 ao dia 10 inclui o dia 4, dizemos que ele fechado com relao a esse ponto inicial; do contrrio dizemos que aberto com relao a esse ponto. Da mesma forma, se ele inclui o dia 10, dizemos que o intervalo fechado com relao a seu ponto final; caso contrrio, dizemos que ele aberto com relao a esse ponto. Ento, por conveno, denotamos um intervalo por seu ponto inicial e seu ponto final (nessa ordem), precedidos por um colchete de abertura ou um parntese de abertura, e seguidos por um colchete de fechamento ou um parntese de fechamento. Os colchetes so usados onde o intervalo fechado, e os parnteses onde ele aberto. Desse modo, por exemplo, existem quatro modos distintos de denotar o in638 tervalo especfico que vai do dia 4 ao dia 10 inclusive: [d04,dlO] [d04,dll) (d03,dlO] (d03 ,dli) Nota: voc pode achar estranho usar (por exemplo) um colchete de abertura com um parntese de fechamento; porm, o fato que existem boas razes para permitir todos os quatro estilos. Na verdade, o estilo chamado fechado-aberto (colchete de abertura, parntese de fechamento) o mais usado na prtica.* Porm, o estilo fechado-fechado (colchete de abertura, colchete de fechamento) seguramente o mais intuitivo e vamos preferir esse estilo no texto a seguir. Considerando-se que intervalos como {d04,dlOj so valores em si, faz sentido combinar os atributos DE e PARA de, digamos, FP DE PARA (ver Figura 22.3) em um nico atributo, DURANTE, cujos valores so retirados de algum tipo de intervalo (consulte a prxima seo). Uma vantagem imediata dessa idia que ela evita a necessidade de fazer a escolha arbitrria de qual das duas chaves candidatas {F#,DE} e {F#,PARA} deve ser a chave primria. Outra vantagem que ela evita a necessidade de decidir se os intervalos DE-PARA da Figura 22.3 devem ser interpretados como abertos ou fechados com relao a DE e PARA; na verdade, [d04,dlO], [d04,dl 1), (d03,dlO] e (d03,dl 1) agora se tornam quatro representaes possveis distintas do mesmo intervalo, e no temos nenhuma necessidade de saber qual (se h algum) a representao real. Outra vantagem que as restries dessa varivel de relao se resguardar contra o absurdo de um par DE-PARA no qual o ponto de tempo PARA precede o ponto de tempo DE (como mostramos na Seo 22.3) no so mais necessrias, porque a restrio DE _ PARA est implcita na prpria noo de um tipo de intervalo (em termos informais). Ainda outra vantagem que agora no existe necessidade de se falar em chaves temporais que no so realmente chaves no sentido clssico (consulte a Seo 22.9). Outras restries tambm poderiam ser simplificadas (mais uma vez, consulte a Seo 22.9). A Figura 22.4 mostra o que acontece em nosso exemplo de banco de dados se adotamos essa abordagem. E DURANTE FIGURA 22.4 O banco de dados de fornecedores e remessas (amostra de valores) verso final completamente temporal, usando intervalos * Para ver por que o estilo fechado-aberto pode ser vantajoso, considere a operao de dividir o intervalo dO4,d1O] imediatamente antes, digamos, do dia d07. O resultado formado pelos intervalos imediatamente adjacentes [d04,d07) e [d07,dlOl. 639 FP_DURANTE F# FNOME STATUS CIDADE DURANTE Fi Smith 20 Londres [d07,dlO] F2 Jones 10 Paris [d04,dlO] F2 Jones 10 Paris [d02,d04] F3 Blake 30 Paris [d03,dlO] F4 Clark 20 Londres [d04,dlO] F5 Adams 30 Atenas [d02,dlO] DURANTE P1 [d04,dlO] Fi P2 [d05,dlO] Fi P3 [d09,dlO] Fi P4 [d05,dlO] F1 P5 [d04,dlO] F1 P6 [d06,dlO] F2 P1 [d02,d04] F2 P2 [d03,d03] F2 P1 [d08,dlO] F2 P2 [d09,dlO] F3 P2 [d08,dlO] F4 P2 [d06,d09] F4 P4 [d04,d08] F4 P5 [d05,dlO] 22.5 TIPOS DE INTERVALOS Nossa discusso sobre intervalos na seo anterior era de natureza principalmente intuitiva; agora precisamos abordar a questo de maneira mais formal. Em primeiro lugar, observe que a granularidade do valor do intervalo [d04,dlOj dias. Mais precisamente, poderamos dizer que ela do tipo DATE, como designamos esse membro especfico da famlia usual de tipos de dados de data/hora cuja preciso dia (em oposio a, digamos, hora ou milissegundo ou ms). Essa observao nos permite deter- minar o tipo exato do valor do intervalo [d04,dlO], assim: - Em primeiro lugar, claro, ele algum tipo de intervalo; esse fato por si s suficiente para determinar os operadores aplicveis ao valor do intervalo em questo (da mesma forma que dizer, por exemplo, que um valor r de algum tipo de relao suficiente para determinar os operadores JOIN, etc. aplicveis a esse valor r). - Em segundo lugar, o valor de intervalo em questo , de forma muito especfica, um intervalo de uma data at outra, e esse fato suficiente para determinar o conjunto de valores de intervalos que constituem o tipo de intervalo em questo. O tipo especfico de [d04,dlOj portanto INTERVAL(DATE), onde: a. INTERVAL um gerador de tipo (como RELATION em Tutorial D consulte o Captulo 5 - ou array em linguagens de programao convencionais) que nos permite definir uma variedade de tipos de intervalos especficos (veja uma discusso adicional a seguir). b. DATE o tipo de ponto desse tipo de intervalo especfico. Observe cuidadosamente que, em geral, o tipo de ponto PT determina tanto o tipo quanto a preciso dos pontos inicial e final e de todos os pontos entre eles de valores do tipo INTERVAL(PT). (E claro que, no caso do tipo DATE, a preciso est implcita.) Nota: dissemos no Captulo 4 que a preciso no faz parte do tipo aplicvel, mas sim deve ser vista como uma restrio de integridade. Dadas as declaraes DECLARE X TIMESTAMP(3) e DECLARE Y TIMESTAMP(6), por exemplo, X e Y so do mesmo tipo, mas esto sujeitos a restries diferentes (X se restringe a conter valores de milissegundos, e Y se restringe a conter valores em microssegundos). Portanto, em termos estritos dizer que, por exemplo, TIMESTAMP(3) ou DATE um tipo de ponto vlido equivale a reunir dois conceitos que seria melhor manter separados. Em vez disso, seria prefervel definir dois tipos Ti e T2, ambos com uma representao possvel TTMESTAMP, mas com diferentes restries de preciso, e depois dizer que Ti e T2 (e no, por exemplo, TIMESTAMP(3) e TIMESTAMP(6)) so tipos de pontos vlidos. Porm, por simplicidade, seguimos o uso convencional neste captulo e consideramos (em sua maioria) que a preciso de fato parte do tipo. Que propriedades um tipo deve possuir se ele deve ser vlido como um tipo de ponto? Bem, vimos que um intervalo denotado por seus pontos inicial e final; vimos tambm que (pelo menos informalmente) um intervalo consiste em um conjunto de pontos. Se pudermos determinar o conjunto completo de pontos, dado apenas o ponto inicial s e o ponto final e, primeiro devemos ser capazes de determinar o ponto que segue imediatamente (em alguma ordem consensual) o ponto s. Chamamos esse ponto imediatamente seguinte de sucessor de 5; por simplicidade, vamos concordar em fazer referncia a ele como s+ i. Ento, a funo pela qual s+1 determinado a partirdes a funo de sucessor para o tipo de ponto (e preciso) em questo. Essa funo de sucessor deve ser definida para todo valor do tipo de ponto, exceto aquele designado como ltimo. (Tambm haver um nico ponto designado como primeiro, que no sucessor de nada.) Tendo determinado que s+1 o sucessor de s, devemos determinar em seguida se 5+ i vem ou no aps e, de acordo com a mesma ordenao consensual para o tipo de ponto em questo. Se no, ento s+ i de fato um ponto em [s,ej, e devemos agora considerar o prximo ponto, s+2. Continuando esse processo at chegarmos ao primeiro ponto s+n que vem aps e, descobriremos todos os pontos de [s,ej. Observando que s+n de fato o sucessor de e (isto , que ele vem realmente logo depois de e), pode640 mos agora dizer com segurana que a nica propriedade que um tipo PT deve ter para ser vlido como um tipo de ponto que uma funo de sucessor deve ser definida para ele. Em suma, deve haver uma ordenao total para os valores em PT (e podemos assim supor os operadores de comparao habituais <,_, etc. esto disponveis e definidos para todos os pares de valores de P'l). A propsito, voc certamente deve ter notado que no estamos mais falando sobre dados temporais especificamente. Na verdade, a maior parte do restante deste captulo sobre intervalos em geral, em vez de intervalos de tempo em particular, embora consideremos certas questes especificamente temporais na Seo 22.11. Ento, aqui est (afinal) uma definio precisa: - Seja PT um tipo de ponto. Ento, um intervalo (ou valor de intervalo) i do tipo INTERVAL(P'T) um valor escalar para o qual so definidos dois operadores escalares mondicos (START e END) e um operador didico (IN), tais que: a. START(i) e END(i) retornam um valor do tipo PT cada um. b. START(i) _ END(i). c. Seja p um valor do tipo PT. Ento, p IN i verdadeira se e somente se START(i) _ p e p _ END(i) so ambas verdadeiras. Observe o apelo nessa definio para a funo de sucessor definida para o tipo PT. Observe tambm que os pontos inicial e final constituem uma representao possvel no sentido do (por exemplo) Captulo 5 para valores do tipo INTERVAL(PT) (e portanto que, em Tutorial D provavelmente faramos referncia a START e END como THE_START e THE_END, respectivamente). Finalmente observe que, por definio, intervalos so sempre no vazios (isto , sempre existe pelo menos um ponto IN qualquer intervalo dado). Note bem que um valor do tipo INTERVAL(PT) um valor escalar ou seja, no tem nenhum componente visvel para o usurio. E verdade que ele tem uma representao possvel de fato, vrias representaes possveis, como vimos na seo anterior e essas representaes possveis por sua vez tm componentes visveis para o usurio, mas o valor de intervalo em si no as possui. Outro modo de dizer a mesma coisa afirmar que intervalos so encapsulados. 22.6 OPERADORES ESCALARES SOBRE INTERVALOS Nesta seo, definimos alguns operadores escalares teis (a maioria deles mais ou menos auto-explicativa) que se aplicam a valores de intervalos. Considere o tipo de intervalo INTERVAL(PT). Seja p um valor do tipo PT. Continuaremos a usar a notao p+ 1, p+2. etc., para denotar o sucessor de o sucessor de p+1, e assim por diante (uma linguagem real poderia fornecer algum tipo de operador NEXT). De modo semelhante, usaremos a notao p-i, p-2, etc. para denotar o valor cujo sucessor p, o valor cujo sucessor p-i, e assim por diante (uma linguagem real poderia fornecer algum tipo de operador PRIOR). Sejam p1 e p2 valores em PT. Ento, definimos MAX(pl,p2) para retornar p2 se p1 <p verdadeira e p1 em caso contrrio, e ainda MIN(pl,p2) para retornar p1 se p1 < p2 verdadeira e p2 em caso contrrio. A notao que j usamos servir para seletores de intervalos (pelo menos em contextos informais). Por exemplo, as invocaes de seletores [3,5] e [3,6) produzem ambas esse valor do tipo INTERVAL(INTEGER) cujos pontos contidos so 3, 4 e 5. (Uma linguagem real provavelmente exigiria alguma sintaxe mais explcita como em, por exemplo, INTERVAL([3,5]).) Seja ii o intervalo [sl,el] do tipo INTERVAL(P'T). Como j vimos, START(il) retorna si e END(ii) retorna ei; alm disso, definimos STOP(il), que retorna el+1. seja tambm i2 o intervalo [s2,e2j do tipo INTERVAL(P7). Ento, definimos os seguintes operadores de comparao de intervalos mais ou menos auto-explicativos. Nota: esses operadores frequentemente so conhecidos como operadores deAllen, tendo sido propostos primeiro por Allen na referncia [22.1]. Como exerccio, voc po deri tentar traar algumas figuras simples para ilustr-los. 641 - ii = i2 verdadeira se e somente se si = s2 e ei = e2 so ambas verdadeiras. - ii BEFORE i2 verdadeira se e somente se ei <s2 verdadeira. - ii MEETS i2 verdadeira se e somente se s2 = e 1+1 verdadeira ou si = e2 +1 verdadeira. - ii OVERLAPS i2 verdadeira se e somente se si _ e2 e s2 _ ei so ambas verdadeiras. - ii DURING i2 verdadeira se e somente se s2 _ si e e2 _ ei so ambas verdadeiras.* - ii STARTS i2 verdadeira se e somente se si = s2 e ei _ e2 so ambas verdadeiras. - ii FINISHES i2 verdadeira se e somente se ei = e2 e si _ s2 so ambas verdadeiras. Nota: as definies desses operadores tambm podem ser dadas em termos de pontos (do tipo de ponto aplicvel). Por exemplo, poderamos dizer que ii OVERLAPS i2 verdadeira se e somente se existe um valor p do tipo PT tal que p IN ii e p IN i2 so ambas verdadeiras. Seguindo a referncia [22.3], tambm podemos definir estas incluses teis nos operadores de AlIen: - ii MERGES i2 verdadeira se e somente se ii MEETS i2 verdadeira ou ji OVERLAPS i2 verdadeira. - ii CONTAINS i2 verdadeira se e somente se i2 DURING ii verdadeira.** Para obter o comprimento, por assim dizer, de um intervalo, temos DURATION(i), que retorna o nmero de pontos em i. Por exemplo, DURATION([d03,d07]) 5. Finalmente, definimos alguns operadores didicos teis sobre intervalos que retornam intervalos: - ii UNION i2 produz [MIN(si,s2)MAX(el,e2)] se ii MERGES i2 verdadeira e, caso contrrio, indefinida. - ii INTERSECT i2 produz [MAX(sl,s2)MIN(el,e2)] se ii OVERLAPS i2 verdadeira e, caso contrrio, indefinida. Nota: UNION e INTERSECT so aqui os operadores gerais de conjuntos, no suas contrapartes relacionais especiais. A referncia [22.3] os chama MERGE e INTERVSECT, respectvamente. 22.7 OPERADORES DE AGREGADOS SOBRE INTERVALOS Nesta seo, introduzimos dois operadores extremamente importantes, UNFOLD e COALESCE. Cada um desses operadores usa um conjunto de intervalos todo do mesmo tipo como seu nico operando e retorna outro conjunto desse tipo, O resultar em ambos os casos pode ser considerado uma forma cannica particular do conjunto original (consulte o Captulo 17, Seo 17.3, se precisar relembrar o termo forma cannica). A discusso a seguir motivada por observaes como estas. Sejam X1 e X2 os conjuntos: [dOl,dOlj, [d03,d05], [d04,d06] e { (dOl,dOl], [d03,d04], [d05,d05], [d05,d06] (respectivamente). fcil ver que Xi no o mesmo conjunto queX2. quase to fcil ver que (a) o conjunto de todos os pontos p tais que p est contido em algum intervalo em Xi igual a (b) o conjunto de todos os pontos p tais que p est contido em algum intervalo em X2 (os pontos em questo so dui, d03, d94, DOS e d06). Porm, por razes que logo se tornaro claras, no estamos muito interessados nesse conjunto de pontos propriamente, mas sim no conjunto correspondente de intervalos unitrios (vamos cham-lo X3): { [dOl,dOl], [d03,d03], [d04,d04], [d05,d05], [d06,d06] Observe que aqui (pelo menos uma vez), DURING no significa ao longo de todo o intervalo em questo. INCLUDES poderia ser uma palavra-chave melhor que CONTAINS aqui; ento, poderamos usar CONTAINS como o in642 verso de IN, definindo i CONTAINS p como equivalente a p IN i. Dizemos que X3 a forma desdobrada de Xl (e X2). Em geral, se X um conjunto de intervalos todos do mesmo tipo, ento a forma desdobrada (unfolded) de X o conjunto de todos os intervalos da forma [p,p], onde p um ponto em algum intervalo em X. Observe que Xl, X2 e X3 diferem pela cardinalidade. Agora, ocorre em nosso exemplo que X3 (a forma desdobrada) aquela cuja cardinalidade a maior, mas fcil encontrar um conjunto X4 que tenha a mesma forma desdobrada que Xl e tenha cardinalidade maior que a de X3 (exerccio para o leitor). Tambm fcil encontrar o conjunto muito mais interessante e necessariamente exclusivo XS que tem a mesma forma desdobrada e a cardinalidade mnima possvel: [dOl,dOl], [d03,d06] Dizemos que X5 a forma fundida (coalesced) de Xl (e tambm de X2, X3 e X4). Em geral, se X um conjunto de intervalos todos do mesmo tipo, ento a forma fundida de x o conjunto Y de intervalos do mesmo tipo tais que (a) X e Y tm a mesma forma desdobrada e (b) no h dois membros distintos ii e i2 de Ytais que ii MERGES i2 seja verdadeira. Observe que (como j vimos) muitos conjuntos distintos podem ter a mesma forma fundida. Observe tambm que a definio de forma fundida se baseia o que no ocorre com a definio de forma desdobrada na definio da funo de sucessor para o tipo de ponto subjacente. Agora, podemos definir os operadores UNFOLD e COALESCE. SejaXum conjunto de intervalos do tipo INTERVAL(PT). Ento, UNFOLD(X) retorna a forma desdobrada de X, enquanto COALESCE(X) retorna a forma fundida de X. Nota: devemos dizer que forma desdobrada e forma fundida no so termos padro; de fato, no parece existir nenhum termo padro para esses conceitos, embora os conceitos sejam certamente discutidos na literatura. Essas duas formas cannicas tm ambas um papel importante a desempenhar nas solues que finalmente estamos comeando a abordar para os problemas discutidos na Seo 22.3. Porm, os operadores UNFOLD e COALESCE ainda no so exatamente o que precisamos (eles ainda so apenas um passo nesse caminho); em vez disso, necessitamos de certos equivalentes relacionais desses operadores, e definiremos esses equivalentes na seo .imediatamente seguinte. 22.8 OPERADORES RELACIONAIS ENVOLVENDO INTERVALOS Os operadores escalares sobre intervalos descritos na Seo 22.6 esto naturalmente disponveis para uso em expresses escalares nos lugares habituais dentro de expresses relacionais. Por exemplo, em Tutorial D, esses lugares so basicamente clusulas WHERE sobre restries e clusulas ADD sobre EXTEND e SUMMARIZE. Ento, usando o banco de dados da Figura 22.4, a consulta Obter nmeros de fornecedores correspondentes a fornecedores que eram capazes de fornecer a pea P2 no dia 8 poderia ser expressa desta forma: FPDURANTE WHERE P# = P# (P2') AND d08 IN DURANTE ) { F# Nota: na prtica, a expresso d08 aqui teria de ser substituda por um literal apropriado do tipo DIA. Como outro exemplo, a expresso a seguir gera uma relao mostrando quais pares de fornecedores estavam localizados na mesma cidade ao mesmo tempo, juntamente com as cidades e os tempos em questo: EXTEND ( ( ( ( F_DURANTE RENAME F# AS XF#, DURANTE AS XD ) { XF#, CIDADE, XD JO 1 N ( E DURANTE RENAME F# AS YF#, DURANTE AS YD ) { YF#, CIDADE, YD WHERE XD OVERLAPS YD ) ADD ( XD INTERSECT YD ) AS DURANTE ) { XF#, YF#, CIDADE, DURANTE 043 Explicao: JOIN encontra pares de fornecedores localizados na mesma cidade. WHERE restringe o resultado a pares que estavam na mesma cidade ao mesmo tempo. EXTEND ... ADD calcula os intervalos relevantes. A projeo final d o resultado desejado. Agora, vamos retornar s Consultas 3.1 e 3.2 do final da Seo 22.3. Primeiro, vamos nos concentrar na Consulta 3.1. A Consulta 4.1 uma reformulao dessa consulta em termos do banco de dados da Figura 22.4: - Consulta 4.1: Obter pares F#-DURANTE para fornecedores que foram capazes de fornecer alguma pea em algum momento, onde DURANTE designa um perodo mximo contnuo durante o qual o fornecedor F# foi de fato capaz dc fornecer alguma pea. Voc deve lembrar que uma verso anterior dessa consulta, a Consulta 2.1, exigia o uso de agrupamento e agregao (mais especificamente, envolvia uma operao SUMMARIZE). Provavelmente voc no ficar surpreso ao aprender, portanto, que a Consulta 4.1 tambm vai exigir certas operaes de agrupamento e agregao. Contudo, vamos formular a consulta em um pequeno passo de cada vez, O primeiro passo : WITH FPDURANTE { F#, DURANTE } AS Ti (haver mais nessa expresso, como sugere o sinal de dois- pontos). Esse passo descarta somente nmeros de peas. Assim, Ti semelhante a: Observe que essa relao contm informaes redundantes; por exemplo, somos informados no menos de trs vezes que o fornecedor Fi foi capaz de fornecer algo no dia 6. O resultado desejado, eliminando-se toda essa redundncia, claramente o seguinte (vamos cham-lo RESULTADO): chamamos esse resultado de forma fundida de Ti sobre DURANTE. Observe que um valor de DURANTE para um dado fornecedor nessa forma fundida no existe necessariamente como um valor explcito de DURANTE para esse fornecedor na relao Ti da qual a forma fundida derivada; em nosso exemplo, esse comentrio se aplica ao fornecedor F4 em particular. Agora, eventualmente alcanaremos um ponto em que poderemos obter essa forma fundida por meio de uma expresso simples da forma: Ti COALESCE DURANTE 644 Porm, precisamos chegar at esse ponto gradualmente. F# DURANTE Fi [d04,dlO] Fi [d05,dlO] Fi [d09,dlO] Fi [d06,dlO] F2 [d02,d04] F2 [d03,d03] F2 [d08,dlO] F2 [d09,dlO] F3 [d08,dlO] F4 [d06,d09] F4 [d04,d08] F4 [d05,dlO] F# DURANTE Fi F2 F2 F3 [d04,dlO] [d02,d04] [d08,dlOJ [d08,dlO] F4 [d04,dlOJ Observe em primeiro lugar que estivemos usando o termo forma fundida nos dois pargrafos anteriores em um sentido um pouco diferente daquele que usamos na Seo 22.7. O operador COALESCE definido na Seo 22.7 tomou um conjunto de intervalos como entrada e produziu um conjunto de intervalos como sada. Aqui, porm, estamos falando sobre uma verso diferente de fato, uma sobrecarga (veja o Captulo 19) desse operador, que toma uma relao un ria como entrada e produz outra relao desse tipo (com o mesmo cabealho) como sada, e so as tuplas nessas relaes que contm os intervalos reais. Ento, aqui esto os passos para nos levar de Ti a RESULTADO: WITH ( Ti GROUP ( DURANTE ) AS X ) AS T2 (consulte o Captulo 6 se precisar rever informaes relativas ao operador GROUP). T2 semelhante a: x Fi DURANTE [d04,d 10] [dos, d 10] [d09 , dlO] [d06,d 10] F2 DURANTE [d02, d04] [d03,d03] [d08, diO] [d09,dlO] F3 DURANTE [d08,d 10] F4 DURANTE [d06,d09] [d04,d08] - [d05,dlOJ Agora, aplicamos a nova verso de COALESCE s relaes que so valores do atributo com valor de relao X: WITH ( EXTEND T2 ADU COALESCE ( X ) AS Y ) ( ALL BUT X } AS T3 T3 semelhante a: 645 F# Y Fi DURANTE [d04,dlO] F2 DURANTE [d02 ,d04] [dOS ,d 10] F3 DURANTE [dOS,dIO] 1 F4 DURANTE [d04,dlO] Finalmente, desagrupamos (mais uma vez, consulte o Captulo 6 se necessrio): T3 UNGROUP Y Essa expresso produz a relao que chamamos antes de RESULTADO. Em outras palavras, mostrando agora todos os passos juntos (e simplificando um pouco), RESULTADO o resultado da avalia- o da seguinte expresso global: WITH FPDURANTE { F#, DURANTE } AS Ti, ( Ti GROUP ( DURANTE ) AS X ) AS T2, ( EXTEND T2 ADD COALESCE ( X ) AS Y ) { ALL BUT X } AS T3 T3 UNGROUP Y bvio que seria desejvel poder chegar de Ti a RESULTADO em uma nica operao. Para esse fim, criamos um novo operador de fuso de relaes com a seguinte sintaxe: R COALESCE A (onde R uma expresso e relacional e A um atributo de algum tipo de intervalo da relao denotada por essa expresso).' A semntica desse operador definida por generalizao bvia das operaes de agrupamento, extenso, projeo e desagrupamento pelas quais obtivemos RESULTADO a partir de Ti. Nota: talvez ajude observar que a fuso de RemA envolve o agrupamento deR por todos os atributos de R separadamente de A (vimos no Captulo 6 que, por exemplo, a expresso Ti GROUP (DURANTE) . pode ser lida como agrupar Ti por F#, sendo F# o nico atributo de Ti no mencionado na clusula GROUP). Juntando tudo o que vimos antes, podemos agora oferecer a expresso a seguir como uma formulao razoavelmente direta de Consulta 4.1: FPDURANTE { F#, DURANTE } COALESCE DURANTE A operao global denotada por essa expresso um exemplo do que alguns autores chamam projeo temporal. Para ser mais especfico, uma projeo temporal de FP DURANTE sobre F# e DURANTE. (Lembre-se de que a verso original dessa consulta, a Consulta 1.1, envolvia a projeo comum de FP sobre F#.) Observe que a projeo temporal no exatamente uma projeo, mas sim um anlogo temporal de uma projeo comum. Agora, passamos para a consulta 3.2. A Consulta 4.2 uma reformulao dessa consulta em termos do banco de dados da Figura 22.4: - Consulta 4.2: Obter pares F#-DURANTE para fornecedores que esto impossibilitados de fornecer quaisquer peas em algum momento, onde DURANTE designa um perodo mximo contnuo durante o qual o fornecedor F# esteve de fato impossibilitado de fornecer qualquer pea. Lembre-se de que a verso original dessa consulta, a Consulta 1.2, envolvia uma operao de diferena relacional. Desse modo, se est esperando ver algo que possa ser chamado diferena temporal, ento claro que voc est certo. Como tambm seria de esperar, enquanto a projeo temporal exige fuso de relaes, a diferena temporal exige o desdobramento de relao. A diferena temporal (como a operao de diferena comum) envolve dois operandos de relaes. Primeiro, vamos nos concentrar no operando da esquerda. Se desdobrarmos o resultado da projeo (comum) F DURANTE {F#,DURANTE} sobre DURANTE, obteremos uma relao vamos cham-la Ti semelhante a esta: * O operando A poderia ser estendido para permitir uma lista_com_vrgulas de nomes de atributos, se desejado. Uma observao anloga se aplica tambm ao operador de desdobramento de relao (ver adiante). Para a semntica, veja o 646 Exerccio 22.8. Considerando-se a amostra de dados da Figura 22.4, Ti contm na realidade um total de 23 tuplas. (Exerccio: verifique essa afirmao.) Se definirmos uma verso de relao unria de UNFOLD (anloga verso de relao unria de COALESCE), ento poderemos obter Ti assim: EXTEND ( FDURANTE { F#, DURANTE } GROUP ( DURANTE ) AS X ADD UNFOLD ( X ) AS Y ) { ALL BUT X } UNGROUP Y Porm, como j sugerimos, podemos simplificar as consultas criando um operador de relao desdobrada com a seguinte sintaxe (e semntica direta): R UNFOLD A Agora, podemos escrever: WITH ( FDURANTE { F#, DURANTE } UNFOLD DURANTE ) AS Ti Tratamos o operando da direita na diferena temporal de modo semelhante: WITH ( FPDURANTE { F#, DURANTE } UNFOLD DURANTE ) AS T2 Agora podemos aplicar a diferena de relaes (comum): WITH ( Ti MINUS T2 ) AS T3 T3 semelhante a: F# DURANTE F2 [dOl,d071 F3 [d03,d03] F3 [d04,d04] F3 [d05,d05] F3 [d06,d06] F3 [d07,d07] F5 [d02,d02] F5 [d03,d03] F5 [d04,d04] F5 [d05,d05] F5 [d06,d06j F5 [d07,d07] F5 [d08,d08] F5 [d09,d09] F5 [dlO,dlo] 647 F# DURANTE FI [d04,d04] Fi [d05,d05] Fi [d06,d06] Fi [dOl,d07] Fi [d05,d08] Fi [d09,d09] Fi [dlO,dlO] F2 [d07,d07J F2 [d08,d08] F2 [d09,d09] F2 [dlO,dlO] F2 [d02,d02] F2 [d03,d03] F2 [d04,d04] F3 [d03,d03] Finalmente, fundimos T3 em DURANTE para obter o resultado desejado: T3 COALESCE DURANTE O resultado semelhante a: Aqui est ento uma formulao de Consulta 42 como uma nica expresso aninhada: ( ( F DURANTE { F#, DURANTE 1 UNFOLD DURANTE ) MINUS ( FPDURANTE { F#, DURANTE } UNFOLD DURANTE ) COALESCE DURANTE Como j indicamos, a operao global denotada por essa expresso um exemplo do que alguns au- tores chamam de diferena temporal. Mais precisamente, uma diferena temporal entre as projees de FDURANTE e FPDURANTE (nessa ordem) sobre F# e DURANTE. Nota: como a projeo tem- poral, a diferena temporal no exatamente uma diferena, mas sim um anlogo temporal de uma di- ferena comum. Porm, ainda no terminamos. As expresses de diferena temporal como a que mostramos no exemplo so exigidas to frequentemente na prtica que vale a pena definir uma abreviao adicional para elas.* Para sermos especficos, vale a pena capturar como uma nica operao a sequncia (a) desdobrar ambos os operandos, (b) tomar a diferena e ento (c) fundir. Alm disso, como uma bonificao, essa abreviao oferece a oportunidade de melhor desempenho. Quando longos intervalos de granularidade fina esto envolvidos, o resultado de um desdobramento de uma relao pode ser muito grande em comparao com seu operando; se o sistema realmente materializou ambos os desdobramentos, calculou a diferena, e depois fundiu o resultado, tais consultas poderiam ser executadas para sempre ou esgotar o espao em disco. Expressar a diferena temporal como uma nica operao pode ajudar o otimizador a reconhecer o que estava acontecendo, e talvez evitar fazer qualquer desdobramento. Aqui est ento nossa proposta de abreviao adicional: RI IMINUS R2 ON A Aqui Ri e R2 so expresses relacionais que denotam relaes ri e r2 do mesmo tipo, eA um atributo de algum tipo de intervalo que comum a essas duas relaes (e o prefixo I_ significa intervalo, claro). Como j vimos, essa expresso definida como semanticamente equivalente a: ( ( Ri UNFOLD A ) MINUS ( R2 UNFOLD A ) ) COALESCE A Consulte o Exerccio 22.2 para ver uma discusso adicional sobre operadores i_ como IMINUS. 22.9 RESTRIES ENVOLVENDO INTERVALOS claro que a combinao de atributos {F#,DURANTE} uma chave candidata para a varivel de relao F DURANTE; de fato, na Figura 22.4, usamos nossa conveno de sublinhado duplo para mostr-la especificamente como a chave primria. (Observe que {F#} sozinha no uma chave candidata, porque 648 Observe que (em contraste), no definimos uma abreviao explcita para a projeo temporal. F# DURANTE F2 [d07,d07] F3 [d03,d07] F5 [d02,dlOJ possvel que o contrato de um fornecedor seja encerrado e depois reabilitado em uma data posterior por exemplo, veja o fornecedor F2 na Figura 22.4.) A varivel de relao F_DURANTE poderia assim ser definida como: VAR FDURANTE BASE RELATION F# F#, FNOME NOME, STATUS INTEGER, CIDADE CHAR, DURANTE INTERVAL ( DATE KEY { F#, DURANTE } ; / Ateno inadequada! */ Porm, a especificao KEY mostrada aqui (embora esteja logicamente correta) de certo modo tambm inadequada, pois deixa de evitar que a varivel de relao F DURANTE contenha, por exemplo, as duas tuplas a seguir: Como podemos ver, essas duas tuplas exibem uma certa redundncia, pois as informaes pertinentes ao fornecedor F2 nos dias 7 e 8 esto registradas duas vezes. A especificao KEY tambm inadequada por outra razo. Para sermos especficos, ela deixa de evitar que a varivel de relao que F_DURANTE contenha, por exemplo, as duas tuplas a seguir: Aqui no existe nenhuma redundncia, mas existe um certo circunlquio, considerando-se que estamos usando duas tuplas para dizer o que poderia ser dito de uma forma melhor apenas com uma: 1 F2 Jones 10 Paris {d02,dlOJ A fim de prevenir essas redundncias e circunlquios, deve ficar claro que precisamos impor uma restrio de varivel de relao vamos cham-la restrio Cl de acordo com as linhas seguintes: Se duas tuplas distintas de F_DURANTE so idnticas exceto por seus valores ii e i2 de DURANTE, ento ii MERGES i2 deve ser falsa. (Lembre-se de que MERGES o OR de OVERLAPS e MEETS, em termos informais; a substituio de MERGES por OVERLAPS na restrio Cl fornece a restrio que precisamos impor para evitar a redundncia, e a substituio por MEETS fornece a restrio que precisamos impor para impedir o circunlquio.) Tambm deve ficar claro que existe um modo muito simples de impor a restrio Cl: ou seja, mantendo a varivel de relao F_DURANTE fundida o tempo todo no atributo DURANTE. Assim, vamos definir uma nova clusula COALESCED que opcionalmente pode aparecer em uma definio de varivel de relao, desta forma: VAR F_DURANTE BASE RELATION F# F#, FNOME NOME, STATUS INTEGER, CIDADE CHAR, DURANTE INTERVAL ( DATE KEY { F#, DURANTE } 1* Ateno ainda inadequada) */ COALESCED DURANTE A especificao COALESCED DURANTE significa aqui que a varivel de relao FDURANTE deve ser o tempo todo idntica ao resultado da expresso F_DURANTE COALESCE DURANTE (implicando que a fuso de F DURANTE em DURANTE nunca tem qualquer efeito). Assim, essa sintaxe especial suficiente para resolver os problemas de redundncia e circunlocuo.* Nota: supomos por en Observamos que poderia ser criado um argumento para fornecer uma sintaxe de caso particular semelhante, a fim de evitar apenas o problema da redundncia, e no o de circunlocuo. 649 F2 Jones 10 Paris [d02,d06] F2 Jones 10 Paris [d07,dlO] F2 Jones 10 Paris [d02,d06] F2 Jones 10 Paris [d07,dlO] quanto que qualquer tentativa de atualizar F_DURANTE de modo a deix-la fundida de forma incompleta em DURANTE simplesmente ser rejeitada. Porm, consulte a Seo 22.10 para ver uma descrio mais completa desse ponto. Infelizmente, as especificaes de KEY e COALESCED juntas ainda no so adequadas, pois elas deixam de evitar que a varivel de relao F DURANTE contenha, por exemplo, as duas tuplas a seguir: Aqui, o fornecedor F2 mostrado como tendo um status 10 e 20 nos dias 7 e 8 claramente uma si- tuao impossvel. Em outras palavras, temos uma contradio em nossas mos. Deve ficar claro que, para prevenir tais contradies, precisamos impor uma restrio de varivel de relao vamos cham-la restrio C2 de acordo com as seguintes linhas: Se duas tuplas distintas de F_DURANTE com o mesmo F# valor de F# tem valores ii e i2 em DURANTE, e se ii OVERLAPS i2 verdadeira, ento essas duas tuplas devem ser idnticas, exceto talvez por seus valores de DURANTE. Observe bem que a restrio C2 no imposta mantendo-se F_DURANTE fundida em DURANTE (e evidentemente ela no imposta pelo fato de que {F#,DURANTE} uma chave candidata). Porm, vamos supor que a varivel de relao F_DURANTE fosse mantido desdobrada o tempo todo sobre o atributo DURANTE. Ento: . A chave candidata exclusiva para essa forma desdobrada FDURANTE UNFOLD DURANTE seria novamente a combinao dos atributo {F#,DURANTE} (porque, em qualquer instante dado, qualquer fornecedor dado atualmente sob contrato tem apenas um nome, um status e uma cidade). . Consequentemente, duas tuplas distintas no poderias ter o mesmo valor de F# e valores de DURANTE superpostos (porque todos os valores de DURANTE so intervalos unitrios em F_DURANTE UNFOLD DURANTE, e duas tuplas com o mesmo valor de F__ e valores DURANTE superpostos seriam assim duplicatas uma da outra na verdade, elas seriam a mesma tupla). Segue-se que, se impusermos a restrio de que {F#,DURANTE} uma chave candidata para FDURANTE UNFOLD DURANTE, a restrio C2 ser imposta automaticamente. Desse modo, vamos definir uma nova clusula IKEY (1 significa intervalo) que pode aparecer opcionalmente em lugar da clusula KEY habitual na definio de uma varivel de relao, como esta: VAR FDURANTE BASE RELATION F# F#, FNOME NOME, STATUS INTEGER, CIDADE CHAR, DURANTE INTERVAL ( DATE IKEY { F#, DURANTE UNFOLDED COALESCED DURANTE (Significando exatamente que {F#,DURANTE} uma chave candidata para F_DURANTE UNFOLD DURANTE).* Assim, essa sintaxe especial suficiente para resolver o problema de contradio. Observe que, se {F#,DURANTE} uma chave candidata para F_DURANTE UNFOLD DURANTE, ela certamente uma chave candidata para F_DURANTE; esse fato nos permite descartar a especificao original de KEY para F_DURANTE em favor da especificao de I_KEY. Alm disso, observe que {F#,DURANTE} pode ser considerada uma chave candidata temporal no sentido da Seo 22.3. Mais ainda, como vimos, essa chave candidata temporal de fato uma chave candidata ver Alguns autores definem a semntica de IKEY de modo a cuidar tambm do problema da redundncia. Consideramos essa abordagem uma bobagem sem lgica e no a adotamos (em todo caso ela desnecessria, pois COALESCED claramente sufici650 ente para lidar com o problema da redundncia). F2 Jones 10 Paris [d02,d08] J F2 Jones 10 Paris [d07,dlO] dadeira para a varivel de relao que a contm (diferente das chaves candidatas temporais discuti- das na Seo 22.3). E claro que, se essa sintaxe de IKEY admitida para chaves candidatas, podemos esperar que ela seja aceita tambm para chaves estrangeiras. Assim, por exemplo, a definio de FPDURANTE poderia incluir: FOREIGN IKEY { F#, DURANTE UNFOLDED } REFERENCES FDURANTE ... A inteno nesse caso que, se FP_DURANTE mostrar que o fornecedor Fx foi capaz de fornecer alguma pea durante a intervalo i, ento F_DURANTE deve mostrar que Fx estava sob contrato ao longo do intervalo i. Se essa restrio for satisfeita, ento a combinao de atributos {F#,DURANTE} na varivel de relao FP_DURANTE poder ser considerada uma chave estrangeira temporal no sentido da Se- o 22.3. (Porm, ela ainda no ser uma chave estrangeira verdadeira no sentido clssico.) Ainda existe um ponto a ser examinado sobre a varivel de relao F_DURANTE. Vamos supor que dc fato mantemos essa varivel de relao fundida em DURANTE o tempo todo. Suponha tambm que, de vez em quando, executamos um procedimento que calcula de novo o status de fornecedores atual- mente sob contrato. E claro que o procedimento tem o cuidado de registrar valores de status anteriores de FDURANTE. Agora, s vezes o novo clculo no resulta em nenhuma mudana de status. Nesse caso, se o procedimento tentar inserir teimosamente um registro do status anterior em F_DURANTE, ele violar a restrio de COALESCED! Para evitar tais violaes, o procedimento ter de fazer um teste es- pecial de nenhuma mudana no status e executar uma operao UPDATE apropriada em lugar da INSERT que executada quando o status se altera de fato (consulte o Exerccio 22.3 no final do captulo). E claro que, como outra alternativa, poderamos decidir no manter F_DURANTE fundida em DURANTE uma soluo que provavelmente no seria apropriada nesse caso particular, mas poderia ser boa em outros casos. 22.10 OPERADORES DE ATUALIZAO ENVOLVENDO INTERVALOS Nesta seo, vamos considerar alguns problemas que surgem com o uso dos operadores de atualizao habituais INSERT, UPDATE e DELETE sobre uma varivel de relao temporal. Considere mais uma vez FDURANTE; suponha que a definio dessa varivel de relao inclua as especificaes de I_KEY e COALESCED sugeridas na seo anterior. Suponha ainda (como sempre) que o valor atual de F_DURANTE seja mostrado na Figura 22.4. Agora, considere os seguintes cenrios: - INSERT: vamos supor que descobrimos que o fornecedor F2 estava adicionalmente sob contrato durante o perodo do dia 5 ao dia 6 (mas ainda era denominado Jones, tinha o status 10 e estava localizado em Paris durante todo esse tempo). No podemos simplesmente inserir uma tupla para esse fim, pois se o fizssemos, o resultado violaria a restrio de COALESCED (duas vezes!). De fato, o que temos de fazer eliminar uma das tuplas F2 existentes e atualizar a outra para definir o valor de DURANTE como [d02,dlOj. - UPDATE:vamos supor que descobrimos que o status de F2 aumentou temporariamente no dia 9 para 20. E bastante difcil realizar a mudana exigida, embora ela seja muito semelhante a uma simples UPDATE. Basicamente, temos de desmembrar a tupla [d07,dlOj de F2 em trs outras, com os valores de DURANTE [d07,dO8j, [d09,d091 e [dlO,dlOj, respectivamente, e com outros valores inalterados, e depois substituir o valor de STATUS na tupla [d09,dO9j pelo valor 20. - DELETE: vamos supor que descobrimos que o contrato do fornecedor F3 se encerrou no dia 6, mas foi reabilitado no dia 9. Novamente, a atualizao necessria no trivial, exigindo que a nica tupla para F3 seja dividida em duas, com valores de DURANTE iguais a [d03,dOSl e [d09,dl O], respectivamente. Observe agora que as solues que acabamos de esboar para esses trs problemas so especficas para o valor atual da varivel de relao F DURANTE (como tambm para as atualizaes particulares 651 desejadas)! Por exemplo, vamos examinar o problema da insero; em geral, uma tupla considerada para insero poderia apenas ser inserida como est, ou talvez precisasse ser fundida com uma tupla prece- dente, uma tupla seguinte, ou ainda (como em nosso exemplo) ambos. De modo anlogo, atualiza- es e eliminaes em geral podem exigir ou no o desmembramento de tuplas existentes. E claro que a vida ficar insuportavelmente complicada para os usurios se eles se limitarem s operaes INSERT, UPDATE e DELETE convencionais; algumas extenses so claramente desejveis. Ento, aqui esto algumas possibilidades: . INSERT: na realidade, o problema de INSERT pode ser resolvido simplesmente estendendo-se a semntica da especificao de COALESCED na definio da varivel de relao de maneira apropriada. Para sermos especficos, podemos permitir que INSERT seja feita do modo normal, e depois exigir que o sistema (re)faa qualquer fuso necessria seguindo essa operao INSERT. Em outras palavras, a especificao de COALESCED agora no define mais somente uma restrio; ela tambm especifica certas aes de compensao implcitas (de certo modo anlogas a aes referenciais sobre especificaes de chaves estrangeiras). Porm, infelizmente, apenas estender a semntica de COALESCED dessa maneira no suficiente para resolver os problemas de UPDATE e DELETE (por que no?). . UPDATE: o problema de UPDATE pode ser abordado estendendo- se o operador UPDATE da maneira sugerida pelo seguinte exemplo: UPDATE FDURANTE WHERE F# = F# (F2') DURANTE INTERVAL ( [d09,d09] STATUS := 20 A terceira linha cuja sintaxe basicamente <nome de atributo> <expresso de intervalo> especifica o atributo de intervalo ao qual se aplica a especificao de COALESCED (DURANTE no exemplo) e o valor do intervalo relevante ([d09,d09] no exemplo). A operao UPDATE global pode ser entendi- da como: a. Primeiro, identifique tuplas para o fornecedor F2. b. Em seguida, dessas tuplas, identifique aquelas em que o valor de DURANTE inclui o intervalo [ d09,d09] ( claro, deve haver no mximo uma dessas tuplas). c. Se nenhuma tupla for identificada, nenhuma atualizao ser feita; caso contrrio, o sistema desmembrar a tupla conforme necessrio e executar a atualizao exigida. . DELETE: o problema de DELETE pode ser resolvido estendendo- se o operador DELETE de modo anlogo. Nosso exemplo se torna: DELETE FDURANTE WHERE F# = F# (F3') DURANTE INTERVAL ( [d06,d08] 22.11 CONSIDERAES SOBRE PROJETO DE BANCOS DE DADOS Nossos exemplos de variveis de relaes F_DURANTE e FP_DURANTE nos serviram muito bem at agora, ilustrando claramente a necessidade de tipos de intervalos e o desejo de definir operadores especiais para lidar com dados de intervalo. Agora, essas duas variveis de relaes foram originalmente projetadas pela simples incluso de atributos de intervalos em suas contrapartes snapshots. Nesta seo, questionamos se essa abordagem para projeto realmente boa. De modo mais especfico, sugerimos ai652 Nossa sintaxe similar, mas no idntica sintaxe proposta na referncia [22.3]. guma decomposio avanada de certas variveis de relaes temporais (onde por decomposio avanada queremos dizer a decomposio alm do que a normalizao clssica exigiria). De fato, sugerimos a decomposio horizontal e a decomposio vertical, em circunstncias apropriadas. Decomposio horizontal Nosso exemplo funcional supe, de modo bastante razovel, que o banco de dados contm informaes histricas at e inclusive o momento atual; porm, ele tambm supe que o momento atual est registra- do como alguma data especfica (ou seja, dia 10), e essa suposio no de modo algum razovel. Em particular, essa abordagem sugere que, sempre que o tempo passar, o banco de dados ser atualizado de algum modo (em nosso exemplo, ela sugere que o aparecimento de diO de algum modo substitudo por dl 1 meia-noite do dia 10). Um exemplo diferente, envolvendo intervalos de granularidade mais fina, poderia exigir que as atualizaes ocorressem com uma frequncia de, digamos, cada milissegundo! Algumas autoridades defenderam a idia de que o uso de um marcador especial que chamaremos agora seja permitido onde quer que um valor de ponto tambm seja permitido. Sob essa proposta, o intervalo [d04,dlOl, por exemplo, ilustrado na Figura 22.4 como o valor de DURANTE para o fornecedor Fi em FDURANTE, se tornaria [d04,agora]. O valor real desse intervalo depende, claro, de quando voc o observa; assim, no dia 14, ele seria [d04,d14]. Outras autoridades consideram a introduo de agora um afastamento descuidado dos conceitos em que se baseiam os sistemas relacionais. Observe que agora realmente uma varivel; assim, a proposta leva estranha diramos at logicamente indefensvel noo de valores contendo variveis. Aqui esto alguns exemplos de perguntas que surgem dessa noo e sobre as quais voc poderia ponderar: . O que acontece ao intervalo [agora,d141 meia-noite do dia 14? . Qual o valor de END([d04,agora]) no dia 14? Ele d14 ou agora? Acreditamos que difcil dar respostas coerentes a perguntas dessa natureza. Por essa razo, preferi- mos procurar uma abordagem que se limite a conceitos extensamente compreendidos. As vezes um atributo DURANTE ser agora usado para registrar informaes relativas ao futuro como tambm (ou em vez de) relativas ao passado. Por exemplo, podemos querer registrar a data no futuro em que o contrato de um fornecedor deve ser encerrado ou considerado para renovao. Se for esse o caso, ento o projeto de F_DURANTE da Figura 22.4 poder ser usado. Porm, evidente que essa abordagem nem sempre ser aceitvel. Em particular, ela no ser aceitvel se DURANTE tiver a inter- pretao de tempo de transao (consulte a Seo 22.2) tempos de transaes no podem se referir ao futuro! O problema geral que existe uma diferena importante entre (a) informaes histricas e (b) informaes relativas situao atual. A diferena esta: no caso de informaes histricas, os tempos inicial e final so ambos conhecidos; em contraste, no caso de informaes atuais, o tempo inicial conhecido, mas no o tempo final (normalmente). Essa diferena sugere fortemente que devem existir duas variveis de relaes diferentes, uma para a situao atual e uma para o histrico (afinal, certamente haver dois predicados diferentes). No caso de fornecedores, a varivel de relao atual F_DESDE, como mostra a Figura 22.2, enquanto a varivel de relao histrica F DURANTE, como mostra a Figura 22.4 (exceto pelo fato de que as tuplas cujos valores de DURANTE tm tempos finais iguais a diO so omitidas, sendo as informaes relevantes registradas em F_DESDE). Esse exemplo ilustra assim a decomposio horizontal sugerida: uma varivel de relao com um atributo desde com valor de ponto para a situao atual, e uma varivel de relao com um atributo durante com valor de intervalo para o histrico. Observamos de passagem que poderiam ser usados procedimentos trigger para preencher a varivel de relao histrica; por exemplo, a eliminao de uma tupla de F_DESDE poderia ativar automaticamente a insero de uma tupla em F_DURANTE. O operador relacional UNION pode ser usado para combinar dados histricos e atuais em uma nica relao por exemplo: 653 F DURANTE UNION ( EXTEND FDESDE ADD INTERVAL [ DESDE, TODAY() 3 AS DURANTE ) { ALL BUT DESDE Uma possvel desvantagem da decomposio horizontal surge se DURANTE tem a interpretao de tempo vlido em lugar de tempo de transao. Nesse caso, o histrico atualizvel! Os operadores de atualizao descritos na Seo 20. 1 O seriam teis aqui, mas haver algumas ocasies em que uma reviso desejada ter de afetar ambas as variveis de relaes. Por exemplo, suponha que tenha sido descoberto que a alterao mais recente no status de algum fornecedor foi um equvoco. Ento, poderamos precisar no apenas de eliminar uma tupla de F_DURANTE, mas tambm atualizar uma tupla em F_DESDE. Como outro exemplo, se essa mudana mais recente no status fosse correta mas tivesse sido feita no dia errado, de novo a reviso necessria envolveria atualizaes nas duas variveis de relaes. Se FPDURANTE for decomposta de modo semelhante em FPDESDE e FPDURANTE, precisa- remos examinar de novo as restries de chaves estrangeiras. No caso de FPDURANTE, j vimos (na Seo 22.9) que a definio da varivel de relao poderia incluir o seguinte: FOREIGN IKEY { F#, DURANTE UNFOLDED } REFERENCES FDURANTE ... Como dissemos na Seo 22.9, o objetivo dessa especificao que, se o fornecedor Fx se mostrar capaz de fornecer alguma pea durante o intervalo i, ento F_DURANTE dever mostrar que Fx estava sob contrato em todo o intervalo i. Alm disso, dissemos que {F#,DURANTE} na varivel de relao FPDURANTE poderia agora ser considerada uma chave estrangeira temporal. Porm, no caso de FPDESDE, a chave estrangeira correspondente apenas semitemporal; desse modo, ainda estamos diante do problema de ter de lidar com a incmoda restrio que mostramos na Se- o 22.3: CONSTRAINT AUGFPPARAFFK ISEMPTY ( ( ( FDESDE RENAME DESDE AS FD ) JOIN ( FPDESDE RENAME DESDE AS FPD ) WHERE FPD < FD ) ; Assim, a decomposio horizontal leva sem dvida a certos problemas o problema de restries incmodas e o problema de atualizar variveis de relaes atuais e de histrico simultaneamente. No momento em que escrevemos, no vemos nenhuma proposta especfica para abreviaes que ajudem a resolver qualquer desses problemas. Talvez seja necessria uma pesquisa avanada. Observamos que os problemas em questo no surgem se permitimos que a varivel de relao DURANTE inclua tambm informaes sobre o futuro, bem como sobre o passado e o presente (porque a varivel de relao DESDE pode ento ser descartada); contudo, essa abordagem exige que faamos uma previso sobre tempos finais futuro. Os problemas em questo tambm no se manifestam na abordagem proposta na referncia [22.41. Decomposio vertical Mesmo antes do estudo de dados temporais e at antes da criao da SQL alguns autores defendiam a decomposio de variveis de relaes tanto quanto possvel, em vez de apenas at o ponto que a normalizao clssica exigiria. Alguns desses autores infelizmente prejudicaram sua causa propondo projetos de bancos de dados que consistiam inteiramente em variveis de relaes binrias. Uma crtica dessa idia era que s vezes havia necessidade de variveis de relaes unrias. Outra era que algumas variveis de relaes de grau trs ou mais realmente no podiam ser decompostas (por exemplo, considere a varivel de relao FPJ do banco de dados de fornecedores, peas e projetos). Por outro lado, nossa varivel de relao F (no temporal) habitual certamente pode sofrer uma de654 composio avanada. Considerando-se verdadeiras as sentenas O nome de Fi Smith, O status de Fi 20 e Fi est localizado em Londres, podemos concluir com segurana que verdade a declarao implicada pelo primeira tupla mostrada para F na Figura 22.1. Ento, podemos decompor F em trs variveis de relaes binrias, cada uma tendo F# como chave primria. A idia de decomposio total motivada pelo desejo de reduo aos termos mais simples possveis. Agora, a justificativa para tal decomposio talvez no seja muito forte no caso da varivel de relao F; porm, ela significativamente mais forte no caso da varivel de relao FDURANTE. O nome, o status e cidade de um fornecedor variam independentemente com o passar do tempo. Alm disso, provvel que elas tambm variem com frequncia diferente. Por exemplo, pode ser que o nome de um fornecedor dificilmente mude, enquanto a localizao desse mesmo fornecedor se modifica de vez em quando e o status correspondente se altera com bastante frequncia e pode ser incmodo ter de repetir o nome e a localizao toda vez que o status se altera. Alm disso, o histrico de nomes, o histrico de status e o histrico da cidades de um fornecedor provavelmente so conceitos mais interessantes e digerveis que o conceito de um histrico combinado de nome-status-cidade. Por essa razo, propomos a decomposio de FDURANTE em trs variveis de relaes histricas semelhantes a esta (em esboo): FNOMED[JRANTE { F#, FNOME, DURANTE FSTATUSDURANTE { F#, STATUS, DURANTE FCIDADEDURANTE { F#, CIDADE, DURANTE As especificaes IKEY {F#, DURANTE DESDOBRADA} e COALESCED DURANTE se aplica- riam a cada uma dessas trs variveis de relaes. Nota: provavelmente tambm gostaramos de incluir a seguinte varivel de relao mestre de fornecedores: F#DURANTE { F#, DURANTE Essa varivel de relao indicaria quais fornecedores estavam sob contrato e quando. Novamente, as especificaes I_KEY {F#, DURANTE DESDOBRADA} e COALESCED DURANTE se aplicariam. Alm disso, a combinao {F#,DURANTE} serviria como uma chave estrangeira temporal em F_NOMEDURANTE, FSTATUSDURANTE e F_CTDADE_DURANTE (e tambm em FP_DURANTE), correspondendo chave candidata temporal {F#,DURANTE} na varivel de relao FDURANTE. Tambm h outro ponto a enfatizar aqui. Com F_DURANTE na forma definida originalmente, te- mos de usar uma expresso no trivial para obter o histrico de status: FDURANTE { F#, STATUS, DURANTE } COALESCE DURANTE Ao mesmo tempo, a expresso para dar o histrico combinado muito menos interessante apenas uma referncia simples varivel de relao! Ento, de certo modo, a decomposio sugerida limpa a rea de jogo para consultas ou melhor, torna mais fcil expressar as consultas mais interessantes e mais difcil expressar as menos interessantes. A necessidade para decompor F_DESDE no to forte. Observe em particular que, embora (mais uma vez) procedimentos trigger possam ser usados para preencher as trs variveis de relaes histricas por exemplo, a eliminao de uma tupla de F_DESDE poderia ativar automaticamente atualizaes em F#_DURANTE, F_NOME DURANTE, F_STATUS_DURANTE e F CIDADE DURANTE - no h necessidade de decompor F_DESDE para obter tais efeitos. 22.12 RESUMO Comeamos este captulo fazendo referncia necessidade crescente de bancos de dados que contenliani dados histricos, bem como dados atuais. Mostramos que a representao de dados histricos usando apenas timestamp conduz a dificuldades severas em particular, torna certas restries e certas consultas muito difceis de se manipular e discutimos o uso de intervalos escalares (encapsulados) como uma abordagem melhor. Para sermos especficos, discutimos um gerador dc tipo INTERVAL juntamente com 655 vrios operadores novos que lidam com dados de intervalos (embora tenhamos lembrado que quase dos esses operadores so na realidade simples abreviaes). Os intervalos e seus operadores relacion tm outras utilidades alm de dados temporais em si apesar do fato de que nosso exemplo funcional baseava especificamente no tipo INTERVAL(DATE). Apresentamos exemplos de relaes temporais discutimos variveis de relaes temporais) com atributos desse tipo particular. Um tipo de intervalo deve ser definido sobre um tipo de ponto subjacente, e uma preciso associ deve ser especificada (de algum modo) para esse tipo de ponto. Uma funo de sucessor deve ser defin para esse tipo de ponto e essa preciso. Os operadores que descrevemos incluem operadores sobre intervalos propriamente ditos, operado res sobre conjuntos de intervalos e operadores sobre relaes temporais. Os operadores sobre interval em si incluem STAR, END e os operadores de Alien. Os operadores sobre conjuntos de intervalos incluem UNFOLD e COALESCE (veja o prximo pargrafo). Operadores sobre relaes temporais incluem verses relacionais de UNFOLD e COALESCE (veja novamente o prximo pargrafo). Tambm discuti- mos certos operadores de atualizao especializados e certas restries especializadas para variveis de relaes temporais (chaves temporais). Mostramos que a maioria desses novos operadores e dessas restries poderia ser efetivamente considerada como uma srie de contrapartes temporais de construes familiares. Discutimos duas importantes formas cannicas para conjuntos de intervalos do mesmo tipo, a for- ma desdobrada e a forma fundida. Um conjunto de intervalos do tipo INTERVAL(PT) uma forma desdobrada se cada intervalo no conjunto um intervalo unitrio isto , um intervalo contendo apenas um ponto, onde um ponto um valor do tipo de ponto subjacente PT. Um conjunto de intervalos do tipo INTERVAL(PT) est em forma fundida se dois intervalos distintos no conjunto no se superpem ou se encontram. As duas formas cannicas tm a vantagem de evitar certos tipos de redundncia; a forma fundida maximiza a conciso e tem vantagens psicolgicas importantes, enquanto a forma desdobrada a mais fcil de operar (evidenciando a necessidade de restries especiais e operadores de atualizao discutidos nas Sees 22.9 e 22. 10). Mostramos como o conceito dessas formas cannicas se estende a relaes com atributos de intervalos, levando aos novos e importantes operadores relacionais UNFOLD e COALESCE. Utilizamos esses operadores para definir anlogos temporais dos familiares operadores relacionais de projeo e diferena. Finalmente, chamamos a ateno para certas questes de projeto de bancos dc dados, relacionadas com a decomposio horizontal e a decomposio vertical de determinadas variveis de relaes temporais. EXERCICIOS 22.1 a. O tipo de dados de SQL VARCHAR(3) consiste em todos os strings de at trs caracteres do conjunto de caracteres padro, que vamos supor ser o ASCII. Voc acha que INTERVAL(VARCHAR(3)) seria um tipo de intervalo aceitvel? b. Se sua resposta ai item a. for sim, expresse o intervalo fechado-aberto [`p','q') desse tipo em notao de intervalo fechado-fechado. 22.2 Na Seo 22.8, definimos o operador de diferena temporal 1_MINUS. Os operadores de unio temporal (IUNION) e interseo temporal (I_INTERSECT) podem ser definidos de modo anlogo. Fornea defini- es apropriadas. 22.3 Suponha que a varivel de relao F_DURANTE se limite a ser fundida em DURANTE, e suponha que ela precise ser atualizada para refletir o fato de que o fornecedor Fi teve o status 20 do dia 1 1 ao dia 15. fornea uma declarao que ter o efeito desejado. No suponha que os operadores de atualizao sejam estendidos como sugerimos na Seo 22.10. Porm, suponha que F_DURANTE contm informaes sobre o fornecedor F1 no dia 10, e no aps o dia 10. No faa qualquer suposio como a de qual poderia ser o status registrado do fornecedor Fi no dia 10. 22.4 Neste captulo, mostramos como certos operadores que se aplicam a intervalos em geral podem ser especialmente teis para intervalos de tempo em particular. Sugira algumas outras aplicaes possveis desses operadores, envolvendo intervalos que no sejam intervalos no tempo. 656 22.5 Sugira alguns exemplos realistas de relaes com mais de um atributo de intervalo, temporal ou no. 22.6 Considere mais uma vez a varivel de relao F_DURANTE. Em qualquer momento dado, se houver quais- quer fornecedores nesse momento, ento haver algum status fmax tal que nenhum fornecedor tenha no mesmo momento um status maior que fmax. Utilize os operadores discutidos neste captulo para obter a relao fundida na qual cada valor de status que j foi um valor fmax forme pares com o(s) intervalo(s) durante o(s) qual(is) ele foi esse valor fmax. 22.7 AP uma relao com atributos NOME, ALTURA e PESO, fornecendo a altura e o peso de certas pessoas. Escreva uma consulta que mostre para cada peso registrado, cada intervalo de alturas tal que, para cada altura nesse intervalo, exista pelo menos uma pessoa com essa altura e esse peso. 22.8 Considere uma relao R com dois atributos de intervalos distintos Ii e 12. Prove ou conteste as seguintes afirmaes: a. (R IJNFOLD Ii) JNFOLD 12 (R UNFOLD 12) UNFOLD Ii. b. (R COALESCE 11) COALESCE 12 (R COALESCE 12) COALESCE Ii. 22.9 Voc consegue imaginar um exemplo de uma varivel de relao com um atributo de intervalo que no seria desejvel manter em forma fundida? 2.10 Investigue a possibilidade de estender o conceito de chave estrangeira temporal para incluir aes referenciais como a eliminao em cascata. REFERNCIAS E BIBLIOGRAFIA Em lugar de fornecer aqui o que poderia facilmente se tornar uma lista excessivamente longa de referncias, apenas chamamos sua ateno para a bibliografia completa existente na referncia [22.2]. 22.1 J. F. Allen: Maintaining Knowledge about Temporal Intervals, CACM 16, Nmero 1 1 (novembro de 1983). 22.2 Opher Etzion, Sushil Jajodia e Suryanaryan Sripada (editores): Temporal Databases: Research and Practice. Nova York, N.Y.: Springer Verlag (1998). Uma antologia que apresenta o estado da arte a partir de 1997, e uma excelente referncia bsica para es- tudo avanado. A Part 4: General Reference inclui uma bibliografia completa e a verso de fevereiro de 1 998 de The Consensus Glossaiy ofTemporal Database Concepts. Part 2 : Temporal Query Languages inclui um artigo intitulado Valid Time and Transaction Time Proposals: Language Design Aspects, em que o autor original deste captulo (Hugh Darwen) contesta a abordagem utilizada em TSQL2 e afirma ter encontrado falhas significativas na especificao de TSQL2 [22.4]. Inclui tambm um artigo de David Toman intitulado Point-Based Temporal Extensions of SQL and Their Efficient Implementation, que prope uma extenso para SQL baseada em pontos, em vez de intervalos. Essa idia gera algumas questes interessantes relacionadas com a implementao. As respostas a essas questes tambm poderiam ser relevantes para linguagens baseadas em intervalos, porque os intervalos unitrios resultantes de UNFOLD so quase pontos (na realidade, eles so pontos em IXSQL consulte a anotao referncia [22.3]). 22.3 Nikos A. Lorentzos e Yannis G. Mitsopoulos: SQL Extension for Interval Data, IEEE Transactions on Knowledge and Data Engineering 9, Nmero 3 (maio/junho de 1997). Muitas das idias discutidas neste captulo so baseadas no trabalho relatado nesse artigo. Como a referncia [22.2], o artigo inclui tambm muitas referncias adicionais teis. Antes de apresentar sua proposta para extenso de SQL, os autores definem umalgebra Relacional Estendida a Intervalos. A extenso de SQL proposta chamada IXSQL (s vezes pronunciada nine SQL) e no especificamente destinada a intervalos de tempo. Tendo em vista que as pala- vras-chave INTERVAL e COALESCE j so usadas em SQL para outros fins, os autores propem PERIOD (mesmo para intervalos no temporais) e NORMALISE (note a grafia) em seu lugar. Como observamos na anotao referncia [22.2], UNFOLD de IXSQL difere do nosso pelo fato de produzir pontos em lugar de intervalos unitrios. Como consequncia, Lorentzos e Mitsopoulos propem um operador inverso, FOLD, que converte pontos em intervalos unitrios, e depois efetua a fuso. UNFOLD, FOLD e NORMALISE so propostos sob a forma de clusulas adicionais na constru- 657 o SELECT-FROM-WHERE familiar. interessante observar que a clusula NORMALISE ON proposta no somente escrita por ltimo, mas no que ela difere de SQL (consulte o Apndice B) tambm executada por ltimo; isto , a sada da clusula SELECT a entrada para a clusula NORMALISE ON (por boas razes). 22.4 Richard T. Snodgrass (editor): The Temporal Query Language TSQL2. Dordrecht, Pases Baixos: Kluwer Academic Pub. (1995). A TSQL2 um conjunto de extenses temporais propostas para SQL. At uma extenso significativa, o comit da TSQL2 rejeitou a abordagem geral de operadores escalares e relacionais sobre intervalos em favor de algo mais conveniente em certos casos especiais. Ento, em vez de simplesmente admitir um gerador de tipo de intervalo e operadores associados, eles propem vrios tipos especiais de tabelas: tabelas snapshots, tabelas de estados de tempo vlidos, tabelas de eventos de tempo vlidos, tabelas de tempos de transaes, tabelas de estados bitemporais e tabelas de eventos bitemporais. . Uma tabela snapshots uma tabela de SQL no estilo antigo, possivelmente incluindo colunas do tipo de dados PERIOD (como em IXSQL [22.3], essa palavra-chave empregada em lugar de INTERVAL por- que a SQL j usa INTERVAL para outro propsito). . Dizemos que todos os outros tipos de tabelas tm suporte temporal; o suporte temporal implica a existncia, ao longo de cada linha, de um ou dois elementos temporais. Um elemento temporal um conjunto de timbre de hora, onde um timestamps um valor de PERIOD ou um valor de algum tipo de dados de data/hora. (Ento, observe que o termo timestamp no est sendo usado aqui em seu senti- do convencional em SQL/92.) os elementos temporais que consistem em valores de PERIOD so especificados para serem fundidos.* Os elementos temporais no aparecem como colunas regulares, mas em vez disso se tem acesso a eles por meio de operadores de uso especial. Aqui est uma pesquisa rpida dos vrios tipos de tabelas com suporte temporal: . Em tabelas de estado de tempo vlidos e tabelas de tempos de transaes, cada timestamps um valor de PERIOD. . Em tabelas de eventos de tempo vlidos, cada timestamps um valor de algum tipo de dados de data/hora. . Uma tabela bitemporal uma tabela que (a) uma tabela de tempos de transaes e (b) uma tabela de estados de tempo vlidos ou uma tabela de eventos de tempo vlidos. Cada linha em uma tabela bitemporal tem dois elementos temporais, um para o tempo de transao e um para o tempo vlido. Uma tabela bitemporal pode ento ser operada como uma tabela de tempos de transaes ou como uma tabela de tempos vlidos. A TSQL2 fortemente motivada por uma noo que ela chama de compatibilidade temporal progressiva. A idia ser capaz de acrescentar suporte temporal a uma tabela bsica existente, convertendo assim essa tabela b- sica de uma tabela snapshots em algum tipo de tabela temporal. A partir de ento, todas as operaes de SQL regulares sobre essa tabela bsica so interpretadas como operaes sobre a verso atual snapshots dessa tabela,* mas agora elas poderiam ter novos efeitos colaterais. Em particular, atualizaes e eliminaes sobre a verso atual snapshots resultam em reteno das verses antigas dessas linhas como linhas com elementos temporais. A grande vantagem da abordagem de TSQL2 se mostra em conexo com aquilo que chamamos operaes em sequncia. Uma operao em sequncia expressa como uma operao sobre um instantneo do banco de dados, em geral o instantneo atual, mas executada realmente sobre todos os instantneos. O resultado de uma consulta em sequncia sobre tabelas de tempos vlidos , por exemplo, uma tabela de tempos vlidos. A consulta em si ex- pressa como se fosse uma consulta sobre um banco de dados snapshots atuais, com a incluso de uma nica pala- vra-chave para indicar que ela uma consulta em sequncia. O programa de aplicao que fornece essa consulta deve tomar providncias especiais para obter acesso aos timestamp das linhas do resultado. * A verso de TSQL2 proposta ISO (mas no aceita) em 1996 para incluso no padro SQL era diferente da verso descrita na referncia [22.4], pelo fato de tabelas com suporte temporal estarem sempre no aninhadas (significado que cada elemento temporal tinha um nico timestamps, no um conjunto de timestamp). No foi especificado se a fuso tambm ocorria. * * Na realidade, existe outra diferena entre a TSQL2 definida na referncia [22.4] e a verso proposta ISO. A referncia [22.4] exige a palavra-chave SNAPSHOT aps SELECT para indicar que a consulta feita sobre o estado atual de cada uma das 658 tabelas as quais ela faz referncia; a verso proposta ISO no exige essa palavra-chave. As operaes que no podem ser expressas como operaes em sequncia s vezes exigem o uso de sintaxe bastante enigmtica. Como uma consequncia da falha da SQL em fornecer suporte a tabelas sem colunas, a TSQL2 apresenta a restrio de que uma tabela com suporte temporal deve ter pelo menos uma coluna regular, alm de seu(s) elemento(s) temporal(is). Desse modo, consultas como a que mostra perodos durante os quais pelo menos um fornecedor em Paris estava sob contrato no podem ser expressas em forma de sequncias. RESPOSTAS A EXERCICIOS SELECIONADOS 22.1 a. Provavelmente no (embora pudesse ser). b. O string de caracteres imediatamente anterior a `q' depende do caractere particular que vem por ltimo na sequncia de intercalao em uso (consulte a referncia [4.191 para obter uma explicao sobre as sequncias de intercalao de SQL). Se esse ltimo caractere for `Z', ento a resposta ser [`p', `pZZ']. Nota: lembramos que, em termos estritos, o (3) em VARCHAR(3) deve ser considerado no como parte do tipo, mas sim como uma restrio de integridade. 22.2 Primeiro, Ri IUNION R2 ON A equivalente a: ( Ri UNION R2 ) COALESCE A Observe que no h necessidade de desdobrar Ri e R2 emA antes de formar a unio (por que no?). Segundo, Ri IINTERSECT R2 ON A equivalente a: ( ( EXTEND ( ( Ri RENAME A AS Ai ) JOIN ( R2 RENAME A AS A2 ) WHERE Ai OVERLAPS A2 ADD ( Ai INTERSECT A2 ) AS A ) { ALL BUT Ai, A2 } ) COALESCE A Novamente, no h necessidade de desdobrar Ri e R2 em A. Alm disso, se Ri e R2 esto de fato fundidos em A, tambm no h necessidade do passo final de fuso (por que no?). Verses temporais de outros operadores relacionais (por exemplo, IJOIN) podem ser definidas de modo anlogo. Em particular, as verses especiais de UPDATE e DELETE descritas na Seo 22.10 fazem uso tcito de ver- so temporal de restrio. Nota: talvez devssemos explicar por que enfatizamos especificamente a abreviao IMINUS no texto do captulo. O ponto que 1_MINUS envolve desdobramento, enquanto (como j vimos) os ou- tros operadores relacionais temporais em geral no o fazem,* e desejvel ser capaz de evitar a necessidade de solicitar ou executar tais desdobramentos onde for possvel. 22.3 Aqui est uma soluo possvel: IF ISEMPTY ( FLNJRANTE WHERE F# = F# (Fi') AND STATUS = 20 AND END ( DURANTE ) = diO THEN INSERT INTO FDURANTE ( EXTEND ( FDURANTE WHERE F# = F# (Fi) AND END ( DURANTE ) = diO { ALL BUT DURANTE ADD INTERVAL ( { dii, di5 ] ) AS DURANTE ELSE UPDATE FDURANTE WHERE F# = F# (Fi) AND END ( DURANTE ) = diu DURANTE : INTERVAL ( [ START ( DURANTE ), di5 1 ) 22.4 Os animais variam de acordo com o intervalo de frequncias de ondas de luz e som s quais seus olhos e ouvi- dos so receptivos. Ocorrem diversos fenmenos naturais que podem ser medidos em intervalos nas profundezas do solo ou do mar, ou ento a uma altura acima do nvel do mar. O fato de se tomar ch entre 16 e 17 horas uma observao temporal, mas uma observao significativamente diferente em espcie dos exemplos no texto do captulo (exatamente como?). Sem dvida voc foi capaz de imaginar muitos exemplos se- melhantes nos quais poderiam se basear aplicaes de bancos de dados interessantes. 22.5 Os animais variam de acordo com o intervalo de frequncias de ondas de luz e som s quais seus olhos e ou- vidos so receptivos! Alm disso, logo que unimos duas relaes temporais Ri{A,B} e R2{A,C}, onde B e C . SUMMARIZE uma exceo. Veja a resposta ao Exerccio 22.6. 659 so atributos de intervalos, obtemos um resultado, embora seja apenas um intervalo intermedirio, que tem mais de um atributo de intervalo. 22.6 WITH FPDURANTE UNFOLO DURANTE AS FPDESDOBRADO ( SUMMARIZE FPDESDOBRADO PER FPDESDOBRADO { DURANTE ADD MAX ( STATUS ) AS FMAX ) COALESCE DURANTE 22.7 ( ( EXTEND AP { ALTURA, PESO ADD INTERVAL ( [ ALTURA, ALTURA ] ) AS HR { PESO, HR } ) COALESCE HR 22.8 Observamos facilmente que a assertiva a. vlida. Porm, o mesmo no ocorre com a assertiva b., como mostramos agora. Seja R dada a seguir: Ento, o resultado U de (R UNFOLD Ii) UNFOLD 12 e (R UNFOLD 12) UNFOLD Ii : Porm, o resultado de (U COALESCE Ii) COALESCE 12 : Enquanto o resultado de (U COALESCE 12) COALESCE Ii : Sugerimos que voc confira esses resultados, anotando os resultados de U COALESCE Ii e U COALESCE 12, depois fundindo esses resultados intermedirios em 12 e 12, respectivamente. Sugerimos tambm as seguintes abre- viaes: . R UNFOLD 11,12 (R UNFOLD Ii) UNFOLD 12 . R COALESCE 11,12 (R COALESCE Ii) COALESCE 12 660 Ii 12 [dol , dol] [dol , d02] [d03, d04J [d04, d04] [dQ8, d09] [d08, d09] [d08, d08] [d08, d08] Ii 12 [dol , dOl] [d08, d08] [dol , dou [d09, d09] [d02, d02] [d08, d08] [d02, d02] {d09, d09] [d03, d03] [d08, d08] [d04, d04) [d08, d08] Ii 12 [dol , d02] {d03, d04] [d09, d09] [d08, d08] Ii 12 [dai , d02] [d03, d04] [d08, d09] [dos, d08]