Você está na página 1de 55

CAPITULO 22

Bancos de dados temporais


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]