banco_de_dados
banco_de_dados
banco_de_dados
O Modelo Relacional
1
2 CAPÍTULO 1. O MODELO RELACIONAL
havia crescido. Mas De Morgan era antes de tudo um matemático e lógico já
reconhecido. E ele tinha ideias novas prestes a serem publicadas de como levar
o progresso para o campo da lógica.
Aristóteles dizia que se todo homem é mortal e Sócrates é um homem, po-
demos então deduzir que Sócrates é mortal. À partir de dois conhecimentos,
pudemos derivar um terceiro. Sabe-se que o mesmo raciocı́nio pode ser aplicado
em outros campos: Frida é uma gata e todo gato é um felino. Logo, Frida é
um felino. Ou, de maneira mais geral, A ← B e B ← C. Logo: A ← C. Não
importa o que é A, B ou C.
Mas Augustus De Morgan tinha uma insatisfação: segundo ele, nem toda
a lógica aristotélica era capaz de permitir que alguém percebesse que se uma
cabeça é parte de um cavalo e o cavalo é um animal, então a cabeça pertence
a um animal. Existia algo que faltava na lógica aristotélica, e isso era o que
ele chamava de relações. A relação “ser parte” é diferente da relação “ser
um”. Não é possı́vel conduzir muito além a lógica formal se a diferença entre
as relações não fosse compreendida. Do contrário, apenas seguindo silogismos,
alguém poderia dizer “Este cachorro é um poodle. Ele é meu cachorro. Logo,
ele é meu poodle.” e seguindo o mesmo raciocı́nio: “Este cachorro é um pai.
Ele é meu cachorro. Logo, ele é meu pai”.
Existem então relações que podemos chamar de “ser parte de”, “ser um”,
“pertencer a” e “ser o pai de”. Compreender como tais relações se comportam
é importante para saber que tipo de conclusão pode ou não pode ser obtida.
A relação “ser parte de”, pode ser inndicada por S: S(cabeça, cavalo) nos
diz que a cabeça é parte de um cavalo. E S(olho, cabeça) diz que o olho é parte
da cabeça. Esta é uma relação transitiva, pois se o olho é parte da cabeça e a
cabeça é parte do cavalo, então podemos deduzir que o olho é parte do cavalo.
1.1. RELAÇÕES LÓGICAS 3
É uma relação reflexiva, pois uma coisa pe sempre parte dela mesma. Então
S(x, x) é sempre verdade. E também é anti-simétrica, pois se x ̸= y, então se
existe a relação S(x, y), então não existe a relação S(y, x) (o fato da cabeça ser
parte de um cavalo e não ser um cavalo nos revela que um cavalo não é parte
de uma cabeça).
As relações “ser um” e “pertence a” tem exatamente as mesmas propriedades
transitiva, reflexiva e anti-simétrica. O que nos mostra que podemos agrupar as
relações em famı́lias que se comportam de maneira semelhante. Outro exemplo
de relação que compartilha as mesmas propriedades: quando um número divide
outro. Todo número divide a si mesmo, se ele divide x que divide y, então
tambem divide y. Mas se x divide y, então y não divide x se eles forem diferentes.
Toda vez que uma relação tem tal caracterı́stica de ser anti-simétrica, reflexiva
e transitiva, dizemos que ela foram uma ordem parcial sobre seus elementos.
Outro exemplo é a relação entre dois números x e y onde x ≤ y. Neste caso,
dizemos também que temos uma ordem total, pois para todo número, um
deles sempre será menor ou igual ao outro, sem que haja nenhum que escapa
desta ordenação.
Já a relação “ser pai de” é anti-simétrica (se Vader é pai de Luke, Luke nao
é pai de Vader), anti-reflexiva (uma pessoa nunca é o pai dela mesma) e anti-
transitiva (se assumirmos em nosso modelo famı́lias não incestuosas, este será o
caso; do contrário, perde-se esta propriedade). Pela diferença das propriedades
desta relação, ela realmente é bem diferente das demais. Em compensação,
a relação “ser descendente de” tem a transitividade. E como sempre que uma
pessoa é pai de outra, ela também é sua descendennte, então a relaçao de ser pai
é um refinamento da relação de ser descendente. Um exemplo de relação que
tem as mesmas propriedades de anti-simetria, anti-reflexividade e anti-transitiva
de “ser pai de” é quando “um número não divide outro”.
Uma relação não precisa ser sempre definida sobre dois elementos. Podem
existir uma quantidade arbitrária de elementos nela. Por exemplo, podemos re-
lacionar todas as pessoas que já viveram com o ano de seu nascimento e de sua
morte. Se chamarmos tal relação de H, temos que H(De Morgan, 1806, 1871),
H(Darwin, 1809, 1882) e H(Marx, 1818, 1883) são exemplos de tais relações. Na-
turalmente, torna-se mais difı́cil identificar propriedades tão gerais em relações
com mais elementos. A aridade de uma relação é o número de diferentes ele-
mentos que ela liga. Por exemplo, relações binárias tem aridade 2.
Note também que relações spodem ser definidas como conjuntos de tuplas
que as satisfazem. Sendo assim, podemos definir novas relações por meio da
união de duas outras, por meio da intersecção, da diferença e também de seu
complemento.
No fim, Augustus De Morgan obteve ainda mais reconhecimento por sua
contribuição para a lógica formal que complementou e enriqueceu o que se sabia
antes sobre a lógica de Aristóteles. Seis anos após a publicação de sua obra sobre
relações, ele iria se aposentar com ajuda de seus pupilos que lhe garantiriam uma
pensão. Seus últimos anos de vida seriam marcados pela tragédia da perda de
filhos e da deterioração de sua saúde mental, até morrer de causas que a medicina
do século XIX não era capaz de identificar corretamente.
4 CAPÍTULO 1. O MODELO RELACIONAL
Figura 1.2: Edgar Frank “Ted” Codd: A motivação mais importante para o
trabalho de pesquisa que resultou no modelo relacional era o objeticp de fornecer
uma divisória clara entre os aspectos lógicos e os aspectos fı́sicos do gerencia-
mento do banco de dados.
Figura 1.3: Filmes de 1970: “Wanda” é sobre uma dona de casa de uma
região rural que, insatisfeita com a falta de perspectivas em sua vida após perder
o emprego, acaba se envolvendo com um assaltante de bancos. Ele ganharia o
prêmio de melhor filme estrangeiro no Festival de veneza. “Woodstock” é um
documentário sobre o festival de contracultura de mesmo nome que ocorreu um
ano antes.
estavam em cinema no cartaz, ele poderia observar uma relação entre o tı́tulo
dos filmes em cartaz, o diretor e um ator participante. E obteria assim a relação
F:
F (“Wanda”, “Barbara Loden”, “Barbara Loden”)
F (“Wanda”, “Barbara Loden”, “Michael Higgins”)
F (“Wanda”, “Barbara Loden”, “Frank Jourdano”)
F (“Wanda”, “Barbara Loden”, “Valerie Manches”)
F (“Woodstock”, “Michael Wadleigh”, “Janis Joplin”)
F (“Woodstock”, “Michael Wadleigh”, “Jimi Hendrix”)
F (“Woodstock”, “Michael Wadleigh”, “Joan Baez”)
F (“Woodstock”, “Michael Wadleigh”, “Joe Cocker”)
Note que todas as relações do mesmo tipo precisam ter sempre o mesmo
número de elementos e cada elemento de cada posição deve pertencer a um
mesmo tipo de conjunto. Se criarmos uma relação que contém todos os ato-
res de um filme, não podemos usar ela para comparar filmes que contém um
número diferente de atores, já que relações de números diferentes de elementos
são relações diferentes. Por causa disso, como é importante que todos os filmes
tenham um mesmo tipo de relação para poderem ser comparados, usamos o
modelo acima de relação ternária com nome do filme, diretor e ator, sendo que
uma nova relação é introduzida para cada ator.
Observando os cinemas da cidade de San jose onde estava, Codd poderia
observar uma relação C entre cada um dos cinemas e seu endereço e telefone:
C(“Cinelux Los Gatos Theatre”, “43 N Santa Cruz Ave Los Gatos”, 3999800)
C(“California Theatre”, “345 S 1st St San Jose”, 7924542)
C(“The Stanford Theatre”, “221 University Ave Palo Alto”, 3243700)
C(“Aquarius Theatre”, “430 Emerson St Palo Alto”, 3273241)
1.2. O MODELO RELACIONAL DE BANCO DE DADOS 7
Linguagens de Consulta e
Consultas Conjuntivas
Uma das primeiras tarefas feitas por Edgar Codd foi especificar uma linguagem
na qual consultas às relações de um banco de dados podiam ser feitas. Para
isso ele desenvolveu um novo tipo de álgebra, denominado álgebra relacional.
Depois, ele investigou também uma outra representação alternativa, o cálculo
relacional. Logo depois, outras pessoas começaram a desenvolver outros tipos
de linguagens mais práticas para seremm usadas em bancos de dados relacionais.
Iremos acompanhar esta história. Mas primeiro, vamos nos restringir a um
tipo muito especı́fico de consulta: as consultas conjuntivas. Elas são bastante
simples, mas máquinas conseguem responder elas bem rápido.
9
10CAPÍTULO 2. LINGUAGENS DE CONSULTA E CONSULTAS CONJUNTIVAS
Com estas duas operações podemos resolver consultas bastante simples que
uma pessoa poderia fazer sobre o cinema de São Francisco em 1970:
Pergunta 1: Quem é o(a) diretor(a) de “Wanda”?
πDiretor(a) (σTı́tulo=“Wanda” (F ))
O operador σ primeiro descarta qualquer elemento da relação cujo tı́tulo do
filme não é “Wanda” e depois seleciona apenas a informação do diretor do filme,
produzindo uma nova relação de aridade 1 contendo apenas o nome do diretor
desejado.
Pergunta 2: Em quais cinemas posso assistir “Wanda”?
πCinema (σTı́tulo=“Wanda” (S))
Aqui fazemos algo parecido com a consulta anterior. Mas desta vez btemos
uma relação de aridade 2 e que contém diferentes cinemas que estão com o filme
escolhido em cartaz.
Pergunta 3: Qual o endereço e telefone do cinema “The Stanford Theatre”?
πEndereço, Telefone (σCinema=“The Stanford Theatre” (C))
Mas nem todas as consultas podem ser respondidas com os dois operadores
vistos. Um exemplo que requer novo operador é: “Cite o nome e endereço de
todos os cinemas que estão passando um filme de Michael Wadleigh”. Para isso
é necessário um operador novo:
dos filmes das relações encontradas. Usamos então a junção natural com S para
obter exatamente as relações que também tem os tı́tulos dos filmes encontrados,
e usamos outra junção, desta vez com C, para assim casar os elementos encon-
trados até agora com C, já que ambas as relações compartilham como atributo
o nome de cinemas. Com o resultado das junções, usamos uma última projeção
para remover todos os atributos que não estamos interessados, ficando só com
o nome do cinema e seu telefone.
Para enchergar melhor o quê está acontecendo, note que podemos representa
rerlações na forma de uma tabela ou matriz. E note que na fórmula abaixo,
começamos primeiro com a relação F :
“Wanda” “Barbara Loden” “Barbara Loden”
“Wanda” “Barbara Loden” “Michael Higgins”
“Wanda” “Barbara Loden” “Frank Jourdano”
“Wanda” “Barbara Loden” “Valerie Manches”
F =
“Woodstock”
“Michael Wadleigh” “Janis Joplin”
“Woodstock” “Michael Wadleigh” “Jimi Hendrix”
“Woodstock” “Michael Wadleigh” “Joan Baez”
“Woodstock” “Michael Wadleigh” “Joe Cocker”
“Woodstock” “Michael Wadleigh” “Janis Joplin”
“Woodstock” “Michael Wadleigh” “Jimi Hendrix”
σDiretor(a)=“Michael Wadleigh” (F ) =
“Woodstock”
“Michael Wadleigh” “Joan Baez”
“Woodstock” “Michael Wadleigh” “Joe Cocker”
Ao fazer a junção natural (▷◁) das duas últimas relações representadas como
matrizes acima, identificamos que ambas as relações possuem um atributo Tı́tulo
em comum. Devemos então considerar apenas elementos do Tı́tulo que aparecem
nas duas relações e unir a coluna delas sem copiar redundantemente a coluna de
Tı́tulo. Essa operação é equivalente a filtrarmos da relação S somente os filmes
dirigidos por Michael Wadleight:
12CAPÍTULO 2. LINGUAGENS DE CONSULTA E CONSULTAS CONJUNTIVAS
“Cinelux Los Gatos Theatre” “Woodstock” “20:30”
“Aquarius Theatre” “Woodstock” “22:15”
Observe agora a relação C:
“Cinelux Los Gatos Theatre” “43 N Santa Cruz Ave Los Gatos” “399 9800”
“California Theatre” “345 S 1st St San Jose” “792 4542”
C=
“The Stanford Theatre” “221 University Ave Palo Alto” “324 3700”
“Aquarius Theatre” “430 Emerson St Palo Alto” “327 3241”
“Studius Theatre” “396 S. First Street” “469 9850”
“Cinelux Los Gatos Theatre” “Woodstock” “20:30” “43 N Santa Cruz Ave Los Gatos” “399 9800”
“Aquarius Theatre” “Woodstock” “22:15” “430 Emerson St Palo Alto” “327 3241”
É importante observar que a junção natural pode gerar uma nova relação com
uma quantidade de elementos (linhas na matriz) muito maior que a das relações
iniciais, apesar disso não ocorrer nos exemplos acima. Um exemplo, suponha
que estamos fazendo a junção de duas relações representadas pela matriz abaixo.
O esquema contendo os atributos da primeira relação é (A, B), e o esquema de
atributos da segunda é (B, C). Logo, a junção ocorre entre a segunda coluna
da primeira relação e a primeira coluna da segunda relação:
5 1 8
5 1 16
5 1 32
5 1 1 8 10 1 8
10 1 ▷◁2,1 1 16 = 10 1 16
3 1 1 32 10 1 32
3 1 8
3 1 16
3 1 32
Algumas vezes podemos querer realizar junções entre duas colunas que tem
atributos diferentes. Ou então, podemos querer simplesmente calcular o produto
cartesiano de duas relações que tem um atributo em comum. No primeiro caso,
podemos querer mudar o nome de um dos atributosde modo que as colunas que
2.2. O CÁLCULO RELACIONAL 13
Note que aqui não estamos interessados em qual é o filme, apenas se existe
ou não em cartaz um filme dirigido por Michael Wadleigh. Então expressamos
a nossa fórmula em cálculo relacional sem usar nenhum valor e1 . Se a propri-
edade de nossa consulta for válida, a consulta acima é equivalente ao conjunto
contendo uma relação vazia: {⟨⟩}. Se não for válida, nos retornará um conjunto
vazio: {} = ∅. Então podemos assim obter um resultado que será equivalente a
verdadeiro ou falso.
Note também que a variável livre x2 aparece em dois locais: no segundo
elemento da relação S e no primeiro da relação F . Sabemos que estas duas
posições representam um nome de filme. Com isso, a expressão S(x1 , x2 , x3 ) ∧
F (x2 , “Michael Wadleigh”, x4 ) só será verdadeira se existir um filme x2 dirigido
por Michael Wadleigh e se este filme estiver em cartaz (existir uma sessão para
ele na relação S que sabe quais filmes estão em cartaz em algum cinema). As
demais variáveis não tem tanta importância e existem apenas para preencher o
espaço de elementos existentes que não nos importa.
Pergunta 6: Liste os pares de pessoas tais que a primeira dirigiu a segunda
e a segunda tambémm já dirigiu a primeira.
uma relação, e os elementos que não são folha correspondem sempre a operações
como σ, π, ▷◁ e δ. A fórmula correspondente à toda a expressão em cálculo re-
lacional é igual à fórmula da raı́z. Para obtê-la, seguimos as seguintes regras
recursivas:
{⟨e1 , . . . , en ⟩| (R(e1 , . . . , en )}
{⟨e1 ,...,em ,e′1 ,...e′m′ ⟩|∃x1 ,...xk ,x′1 ,...xk′ (R1 (u1 )∧...∧Rn (un )∧R1′ (u′1 )∧...∧R′ (u′n′ ))}
Sobre cada fórmula Fn , obtenha uma nova fórmula Fn+1 da seguinte forma:
para cada par de variáveis em u1 , . . . , un que são iguais, produza Fn+1 =
σa=b (Fn ), onde a e b são os atributos gerados que são associados a cada uma
das variáveis escolhidas. Repita este procedimento adicionando mais seleções
até que tenha sido criada uma para cada par de variáveis idênticas existente.
Em seguida, para continuar obtendo novas fórmulas à partir da anterior,
para cada valor constante C que aparece em u1 , . . . , un , gere uma nova fórmula
Fn+1 = σa=C (Fn ), onde a é o atributo gerado que é associado à posição daquela
constante.
Por fim, quando não houverem mais constantes, deve-se pegar a fórmula Fn
obtida e gerar a Fn+1 = πa1 ,...,am Fn , onde a1 , . . . , am é um atributo associados
à uma ocorrência de cada variável e1 , . . . , em .
Seguindo o procedimento acima, podemos produzir uma fórmula de álgebra
relacional à partir de qualquer fórmula de cálculo relacional. POrtanto, isso
demonstra que a álgebra relacional é tão ou mais expressiva que o cálculo rela-
cional.
Figura 2.1: Donald D. Chamberlin: As ideias [de Edgar “Ted” Codd] não
tiveram apelo imediato aos usuários, acredito eu que era porque Ted apoiava
elas em simbolismo e terminologia matemática. Em sua linguagem de consulta
inicial, ele usava notação matemática, como quantificadores universais e exis-
tenciais, e ele usava muitas letras gregas. Coisas como estas dão a aparência do
assunto ser muito esotérico e difı́cil. Quando, na verdade, o que ele estava ten-
tando fazer era deixar as consultas mais simples, e não mais difı́ceis. Então eu
acho que o desenvolvimento de uma linguagem baseada em palavras em inglês,
que você pode digitar em um teclado comum, e a qual você pode ler e enten-
der intuitivamente, foi um grande avanço que tornou mais fácil para as pessoas
compreenderem a simplicidade que havia nas ideias de Ted. Isso não foi o que
tornou a ideia simples, foi o que fez com que ela se parecesse simples para os
outros.
você aumentar o nı́vel da linguagem que você usa para fazer perguntas para um
nı́vel mais alto e menos procedural, então as suas perguntas se tornam inde-
pendente do plano de navegação. Se as circunstâncias mudarem, o computador
pode mudar o plano. E você nem mesmo notaria a diferença. Você apenas
pensaria sobre a sua pergunta, e não como o computador faria para encontrar
a resposta.”
Uma das pessoas que estava assistindo a fala chamava-se Donald D. Cham-
berlin. Ele tambem era um jovem pesquisador da IBM que havia sido atraı́do
para a pesquisa cientı́fica inspirado pela corrida espacial e pelo lançamento do
satélite Sputnik, que ocorreu quando ele estava na oitava série. Anos depois
ele entraria na universidade para estudar Engenharia Elétrica (Ciência da Com-
putação era arriscado: ninguém sabia dizer se esse negócio de computadores
seria uma carreira duradoura) e faria lá um mestrado e doutorado na área de
engenharia elétrica depois da graduação. Um estágio o aproximou da IBM e
depois de terminar o doutorado, Donald Chamberlin tornou-se um pesquisador
na empresa. Poucos anos depois de entrar, com 28 anos de idade, era quando
ele assistiu a fala de Edgar Codd e foi convencido.
De fato, Chamberlin havia perdido todo o interesse em outros tipos de bancos
de dados. Havia percebido que com a abordagem relacional de Codd, consultas
20CAPÍTULO 2. LINGUAGENS DE CONSULTA E CONSULTAS CONJUNTIVAS
3. A linguagem não deve possuir sı́mbolos especiais que não podem ser digi-
tados em um teclado simples.
4. Se possı́vel, um usuário sem treinamento algum, deve ser capaz de ler uma
consulta e entender o que ela faz.
FILMES
TITULO DIRETOR ATOR
“Wanda” “Barbara Loden” “Barbara Loden”
“Wanda” “Barbara Loden” “Michael Higgins”
“Wanda” “Barbara Loden” “Frank Jourdano”
“Wanda” “Barbara Loden” “Valerie Manches”
“Woodstock” “Michael Wadleigh” “Janis Joplin”
“Woodstock” “Michael Wadleigh” “Jimi Hendrix”
“Woodstock” “Michael Wadleigh” “Joan Baez”
“Woodstock” “Michael Wadleigh” “Joe Cocker”
SESSOES
CINEMA TITULO HORARIO
“Cinelux Los Gatos Theatre” “Woodstock” “20:30”
“California Theatre” “Wanda” “20:15”
“Aquarius Theatre” “Woodstock” “22:15”
“Studius Theatre” “Wanda” “20:45”
CINEMAS
CINEMA ENDERECO TELEFONE
“Cinelux Los Gatos Theatre” “43 N Santa Cruz Ave Los Gatos” “399 9800”
“California Theatre” “345 S 1st St San Jose” “792 4542”
“The Stanford Theatre” “221 University Ave Palo Alto” “324 3700”
“Aquarius Theatre” “430 Emerson St Palo Alto” “327 3241”
“Studius Theatre” “396 S. First Street” “469 9850”
Uma vez que tenhamos os dados armazenados em sistema tabular, podemos
usar SQL para responder perguntas sobre ele.
Pergunta 1: Quem é o(a) diretor(a) de “Wanda”?
SELECT DISTINCT ENDERECO, TELEFONE FROM CINEMAS WHERE CINEMA=’The Stanford Theatre’;
A consulta acima agora leva em conta somente pessoas que foram atores e
diretores exatamente no mesmmo filme. Como basta comparar as colunas de
uma mesma linha, a consulta é bem mais simples e retorna:
“Barbara Loden”
Pergunta 8: Liste pares de atores que atuaram no mesmo filme.
Novamente temos que comparar diferentes linhas de uma mesma tabela. A
consulta abaixo responde à pergunta acima.
SELECT DISTINCT a.ATOR, b.ATOR FROM FILMES a, FILMES b WHERE a.TITULO = b.TITULO;
24CAPÍTULO 2. LINGUAGENS DE CONSULTA E CONSULTAS CONJUNTIVAS
Isso porque quando estamos fazendo consultas a uma mesma tabela, só po-
demos comparar os elementos de uma linha com os elementos da própria linha.
E se compararmos desta forma, TITULO = TITULO sempre vai ser verdadeiro em
todas as linhas (pois estamos comparando cada valor com ele mesmo). E o par
ATOR, ATOR é sempre o mesmo elemento repetido duas vezes.
Pergunta 9: Produza a resposta “O Poderoso Chefão” e “Francis Coppola”.
Na álgebra relacional e no cálculo relacional, isso é tão simples como gerar
uma nova relação ⟨“O Poderoso Chefão”, “Francis Coppola”⟩, ignorando qual-
quer outra relação pré-existente.
Em SQL, para gerar diretamente uma tabela de uma só linha com tais
valores, usamos uma expressão diferente:
E isso ignora qualquer tabela existente, e simplesmente gera uma nova tabela
de uma só linha com o filme de 1972 e seu respectivo diretor:
“O Poderoso Chefão” “Francis Coppola”
Em suma, a linguagem SQL, tal como a definimos aqui, é formada por
consultas que tem uma das três formas diferentes:
VALUES(<valores>);
SELECT DISTINCT <colunas> FROM <tabelas>;
SELECT DISTINCT <colunas> FROM <tabelas> WHERE <condiç~
ao>;
<condiç~
ao> := <coluna>=<coluna ou literal>
<condiç~
ao> := <coluna>=<coluna ou literal> AND <condiç~
ao n~
ao vazia>
WHERE a = b
Se o código SQL já tinha uma cláusula WHERE antes, então nós adicionamos
ao final dele, antes do ponto-e-vı́rgula:
AND a = b
5. Para o caso de mudanças de nomes δai →aj (F ) para uma fórmula de álgebra
relacional F , repare que no SQL não há necessidade de termos tal recurso.
A álgebra relacional precisa dele porque a junção natural é dependente do
nome dos atributos para poder ou não efetuar a junção natural. Já o SQL
pode comparar e manipular duas colunas quaisquer em qualquer uma de
suas operações, sem se importar se elas tem ou não o mesmo nome de
atributo.
Contudo, para implementar corretamente a tradução de fórmula de álgebra
relacional para SQL, assim como quando mostramos como fazer a tradução
para o cálculo relacional, precisamos manter um dicionário. No caso da
tradução para SQL, inicialmente o dicionário começa associando cada atri-
buto a uma coluna de mesmo nome: {(a1 , a1 ), . . . , (an , an )}. Posterior-
mente, para cada vez que ocorrer uma mudança de nome, vamos alte-
rando tal dicionário em cada trecho da fórmula para que possamos efetuar
a tradução correta para SQL. Para todos os operadores anteriores, con-
sultamos sempre o dicionário para saber qual é a coluna que realmente
corresponde ao atributo mencionado em cada operação.
2.4 Datalog
No mesmo ano em que Edgar Codd divulgou suas ideias sobre bancos de dados
relacionais, na França, Universidade de Aix-Marselha, um professor que havia
recém sido contratado estava alheio a tudo isso e não demonstrava interesse apr-
ticular em bancos de dados. Seus principais interesses no momento era conseguir
material para o novo departamento de computação que estava sendo criado, no
qual ele era um dos primeiros professores. Fora isso que o levou de volta à
França após ter passado os últimos anos estudando e terminando o doutorado
no Canadá.
Este professor se chamava Alain Colmerauer. Quando esteve no Canadá fa-
zendo sua pós-graduação, seu principal interesse não era banco de dados, mas
sim como desenvolver novas linguagens de programação e as técnicas necessárias
para reconhecer a sua sintaxe. Outro assunto que nos últimos anos vinha cha-
mando sua atenção era a inteligência artificial e como fazer com que um compu-
tador entendêsse mensagens escritas em linguagens naturais, como o português,
ou o francês. Esse interesse possivelmente foi influenciado por ele ter se casado
com uma linguista.
Assim que as coisas ficaram mais organizadas no nascente departamento de
computação da universidade, Alain Colmerauer voltou-se para um projeto que
ele tinha vontade de desenvolver. Uma inteligência artificial capaz de compre-
ender e se comunicar em francês. E o projeto começou a ser desenvolvido.
Sendo uma amostra das tentativas de desenvolvimento de inteligência ar-
tificial da época, em cerca de 2 anos depois, o projeto se desenvolveu em um
programa de computador com o qual era possı́vel ter a sequinte conversa (só
que em francês):
Usuário:
Gatos matam ratos.
Tom é um gato que n~ao gosta de ratos que comem queijo.
Jerry é um rato que come queijo.
Max n~ao é um rato.
O que Tom faz?
Computador:
Tom n~ao gosta de ratos que comem queijo.
Tom mata ratos.
Usuário:
Quem é um gato?
Computador:
Tom.
Usuário:
O que Jerry come?
Computador:
Queijo.
Usuário:
Quem n~ ao gosta de ratos que comem queijo?
30CAPÍTULO 2. LINGUAGENS DE CONSULTA E CONSULTAS CONJUNTIVAS
Computador:
Tom.
Usuário:
O que Tom come?
Computador:
Aquilo que gatos que n~ao gostam de ratos que comem queijo comem.
Usuário:
Todo psiquiatra é uma pessoa.
Toda pessoa que eles analizam está doente.
Jacques é um psiquiatra de Marseille.
Jacques é uma pessoa?
Computador:
Sim.
Usuário:
Onde está Jacques?
Computador:
Em Marseille.
Usuário:
Jacques está doente?
Computador:
Eu n~ao sei.
<cabeçalho> :- <corpo> .
A regra significa: se o corpo for verdade, o cabeçalho (que sempre será uma
relação) também será verdade. O sı́mbolo “:-” é uma forma de representar
“←”. Cada regra pode ser vista como uma consulta que gera uma nova relação,
especificando o que ela significa combase em outras relações conhecidas. Em
Datalog, termos que começam com letras maiúsculas sempre são interpretados
como variáveis. Relações começam por letras minúsculas. Vamos assumir então
que para Datalog as relações que vimos sobre filmes será chamada de filme, a
relação sobre sessões será sessao e a relação sobre cinemas será cinema. Vamos
então gerar consultas que respondem perguntas sobre a nossa base de dados de
exemplo.
POr hora, estamos também assumindo que qualquer relação que apareça no
cabeçalho não pode aparecer no corpo. Então o que estamos definindo é uma
versão não recursiva do Datalog. Com esta versão é também possı́vel responder
todas as perguntas que vimos até agora.
Pergunta 1: Quem é o(a) diretor(a) de “Wanda”?
O programa acima é uma consulta. Ela gera uma nova relação chamada
diretor. A relação diretor(X) será verdade para toda variável X tal que
f("Wanda", X, Y) seja verdade (para qualquer Y). De fato, Y não é uma variável
muito relevante e por causa disso, podemos trocá-lo por “ ” para indicar que é
uma variável anônima que não é usada em nenhum outro lugar da consulta:
32CAPÍTULO 2. LINGUAGENS DE CONSULTA E CONSULTAS CONJUNTIVAS
Agora este código gera uma relação chamada nome cinema que será verdade
para dois valores X diferentes extraı́dos de nossa base de dados (“Califormia
Theatre” e “Studius Theatre”).
Pergunta 3: Qual o endereço e telefone do cinema “The Stanford Theatre”?
Aqui Datalog cria uma nova relação binária como resposta à consulta:
Outra propriedade útil é que podemos ter a certeza de que consultas con-
juntivas sempre podem ser satisfeitas para algum banco de dados, e sempre
teremos uma resposta finita se o banco de dados for finito. Afinal, se a ex-
pressamos como {⟨e1 , . . . , em ⟩|∃x1 , . . . xk (R1 (u1 ) ∧ . . . ∧ Rn (un ))}, à partir da
própria linguagem de consulta do cálculo relacional podemos monstar um banco
de dados que conterá exatamente R1 (u1 ), . . . , Rn (un ) que gerará um resultado
⟨e1 , . . . , em ⟩ para a consulta. E como comparamos apenas dados internos ao
próprio banco de dados, não há como uma consulta sobre um banco finito re-
sultar em uma resposta infinita.
Isso não seria verdade se pudéssemos expressar uma consulta de maneira
mais geral como:
{⟨e1 , . . . , em ⟩|∃x1 , . . . xk (R1 (u1 ) ∧ . . . ∧ Rn (un )) ∧ ei = y}
O último termo é uma igualdade arbitrária. Neste caso, se y for valor ar-
bitrários que não aparecem em qualquer relação e seu domı́nio for infinito, esta
consulta poderia gerar um número infinito de valores para ei . Já se o domı́nio
de y for disjunto do de ei , então esta consulta nunca seria aceita e nunca geraria
qualquer resultado.
Contudo, é possı́vel permitir tal notação permitindo igualdade se restringir-
mos que cada elemento e1 , . . . , em só apareça nas expressões de igualdade se ele
for igual a uma constante ou igual a um elemento de relação do banco de dados.
Isso evita o problema de resultados potencialmente infinitos. As consultas sem
solução não seriam então um problema tão grande, pois seria fácil verificar se te-
mos uma consulta de tal tipo, apenas conferindo todas as igualdades e checando
se elas conectam dois valores constantes diferentes.
Datalog pode ser enriquecido permitindo igualdades seguindo o mesmo mo-
delo:
resultado(A, B, C) :- s(A, 2) , B = 1 , C = 5.
Uma vez que estas duas Exibições tenham sido criadas, o seguinte código
SQL funcionaria:
SELECT a.TITULO
FROM FILMES_MONROE a, AQUARIUS_DEZ_DA_NOITE b
WHERE a.TITULO = b.TITULO;
Figura 2.3: Uma máquina de Turing com duas fitas. A fita de cima contém
um banco de dados e só pode ser lida. A fita de baixo, com um tamanho
consideravelmente menor, é onde a máquina pode realizar escrita.
entrada se o banco de dados possui algo que satisfaz a consulta, e ela rejeita
caso contrário.
A classe de problemas computacionais que pode ser resolvida sob tais condições
restritivas é chamada de L ou LOGSP ACE. Da teoria da computação, temos
que:
a b b a
a c c a
b c c b
c d d c
e b b e
d e e d
d f f d
40CAPÍTULO 2. LINGUAGENS DE CONSULTA E CONSULTAS CONJUNTIVAS
Pergunta 11: Quais são os filmes em que “Woody Allen” aparece como
ator ou como diretor?
Pergunta 13: Liste todos os filmes que foram dirigidos por Hitchcock ou
que estão em cartaz em “Roxy Theatre”.
Pergunta 11: Quais são os filmes em que “Woody Allen” aparece como
ator ou como diretor?
Pergunta 12: Que filmes em que “Woody Allen” é ator ou diretor estão
em cartaz em “The Monarch Theatre”?
Pergunta 13: Liste todos os filmes que foram dirigidos por Hitchcock ou
que estão em cartaz em “Roxy Theatre”.
Adicionando Negação
As consultas conjuntivas, mesmo quando adicionamos união, ainda não são ca-
pazes de responder:
Pergunta 15: Quais os filmes dirigidos por Hitchcock em que o diretor não
atuou? Assuma que cada filme possui um só diretor.
Pergunta 16: Que filmes estão em cartaz no “Cine Barão”, mas não no
“Cinespacial”?
Pergunta 17: Liste os filmes nos quais todos os atores já participaram de
um filme de Hitchcock.
Para responder a este tipo de pergunta, devemos ser capazes de identificar
quando algo não acontece.
Se voltássemos no tempo até 1972 e mostrássemos o capı́tulo anterior para
Edgar Codd, primeiro ele ficaria feliz em saber que muitas décadas depois, as
suas ideias sobre bancos de dados tornaram-se a base do ensino. Observaria
com interesse os resultados teóricos de teoria da computação e teria interesse
em nossa prova de equivalência entre álgebra relacional, cálculo relacional e
outras linguagens de consulta. A informação de como seriam as linguagens SQL
e Datalog, que seriam criadas só alguns anos depois sria uma curiosidade vinda
do futuro para ele. Mas uma coisa que o deixaria intrigado seria termos limitado
tanto a proposta original dele.
“Veja bem, quando propus os bancos de dados relacionais, eu estava ciente do
cálculo de predicados e já haviam trabalhos anteriores que mostravam como ele
poderia ser usado para expressar consultas. Eu apresentei a álgebra relacional
como a minha contribuição para ser usado para criar linguagens de consulta
relacional, embora pelo que você me mostrou, as linguagens do futuro tem uma
notação bem diferente. Eu estou agora mesmo provando a equivalência entre
cálculo de predicados e álgebra relacional. Mas a álgebra relacional que eu
uso, assim como o cálculo relacional, não são tão limitados como os que você
apresentou. Eu não teria problemas nenhum em responder consultas sobre quais
filmes Hitchcock não atuou. Embora eu use os operadores ▷◁, π, σ, eu não tenho
nenhum problema em usar operações mais clássicas definidas sobre conjuntos
como a subtração, união e intersecção.”
45
46 CAPÍTULO 3. ADICIONANDO NEGAÇÃO
πTı́tulo (F ) − πTı́tulo πAtor (F ) − πAtor (σDiretor=“Hitchcock” (F )) ▷◁ F
p(alguma_coisa).
?- p(alguma_coisa).
true.
?- p(outra_coisa).
false.
Dizemos que p(outra coisa) é falso porque esta é uma informação ca-
tegórica, sobre a qual temos certeza de sua falsidade (negação lógica) ou
dizemos que é falso pelo fato de não existir algo que nos diga que é verdadeiro
(negação por falha)? Se perguntássemos para Datalog:
?- existe(cisne_negro).
true.
O que está ocorrendo é que Datalog está nos dizendo que encontrou um cisne
negro, isto é, conseguiu encontrar uma forma de avaliar existe(cisne negro)
de modo que a relação é verdadeira. Note que “eu encontrei um cisne negro” é
algo que podemos considerar como sinônimo de “existe um cisne negro”, já que
encontrar um prova sua existência.
Por outro lado, se perguuntássemos para Datalog:
?- existe(cisne_negro).
false.
Então Datalog está nos dizendo que não encontrou um cisne negro. Não
havia o fato existe(cisne negro) armazenado em seu sistema, e tampouco tal
fato pode ser deduzido pelas regras conhecidas. Entretanto, “eu não encontrei
um cisne negro” não é a mesma coisa que “não existem cisnes negros”. À partir
do momento que lidamos com negação, então estamos introduzindo em nossas
respostas para consultas cisnes negros, e é importante sabermos se eles estão
sendo introduzidos porque não existem, ou porque não foram encontrados.
Se temos um conjunto de relações que representa uma teoria completa sobre
algo, então neste caso especı́fico, se não for encontrado, então não existe. Por
exemplo, se um banco de dados se propõe a armazenar todas as informações
existentes sobre um conjunto de cartas colecionáveis produzida especificamente
no ano de 2020, então pode ser possı́vel completar ele com informações completas
que nunca mais precisarãos er atualizadas. Se uma relação não for encontrada,
neste caso podemos dizer que ela não existe e que não encontrar algo é o mesmo
que a não existência. Mas em bancos de dados incompletos, que são atualizados
com mais informações sobre o mundo, então a falha em encontrar algo não
significa que algo não existe.
Como representar a negação lógica é praticamente impossı́vel para Datalog,
o tipo de negação com a qual o sistema lida é a negação por falha. Nem todas
48 CAPÍTULO 3. ADICIONANDO NEGAÇÃO
(ϕ → ψ) ≡ ¬ϕ ∨ ψ
(ϕ ↔ ψ) ≡ (ϕ ∧ ψ) ∨ (¬ϕ ∧ ¬ψ)
Uma consulta em cálculo relacional tem a forma {⟨e1 , . . . , en ⟩|ϕ} onde ϕ é
uma fórmula onde todo e1 , . . . , en é uma variável livre em ϕ (podendo haver
repetição) ou é uma constante.
Tendo especificado as regras sintáticas para as consultas em cálculo rela-
cional, podemos então criar consultas para responter às perguntas envolvendo
negação.
Pergunta 15: Quais os filmes dirigidos por Hitchcock em que o diretor não
atuou? Assuma que cada filme possui um só diretor.
Pergunta 16: Que filmes estão em cartaz no “Cine Barão”, mas não no
“Cinespacial”?
Pergunta 17: Liste os filmes nos quais todos os atores já participaram de
um filme de Hitchcock.
{⟨xt ⟩|∃xd , xa F (xt , xd , xa ) ∧ ∀ya (∃yd F (xt , yd , ya ) → ∃zt F (zt , “Hitchcock”, ya ))}
Como esta é uma forma ampla demais para conseguirmos tratar a negação,
uma forma então seria usar uma interpretação relativizada, determinando domı́nios
que podem ser usados para valorar as variáveis livres da fórmula de uma con-
sulta. No caso da fórmula acima, se o último termo da relação F é uma string,
isso então poderia significar que qualquer string pode ser usada (mas não coisas
que nçao são strings). Ou devı́amos nos restringir ao conjunto de atores? Qual-
quer ator que venha a existir ou que já existiu? A solução mais adequada seria
usar como escolha o conjunto de domı́nio associado à cada termo de cada relação
armazenado no banco de dados. Esta é a chamada interpretação natural (ou
irrestrita) das consultas no cálculo relacional. Note que podemos neste caso
encontrar domı́nios infinitos em nossas consultas, e isso torna o resultado da
consulta indefinido. A consulta acima, por exemplo, seria indefinida.
Outra solução tentadora seria restringir o domı́nio de modo que somente
elementos de πAtor (F ) pudessem ser considerados como elementos válidos da
consulta acima. Ou, para definir de maneira mais geral, o domı́nio ativo de
cada termo de relação em um banco de dados é a soma de todos os valores cons-
tantes que são encontrados naquele termo de uma dada relação. Já o domı́nio
ativo de uma consulta são todas as constantes que aparecem na consulta asso-
ciadas a cada termo de cada relação. Ao avaliar quais as valorações possı́veis
para um termo com uma variável livre na fórmula, poderı́amos nos restringir
somente à valores do domı́nio ativo, tanto do banco de dados, como da con-
sulta que estão associados àquele termo. Esta é a interpretação de domı́nio
ativo das consultas de cálculo relacional. Nesta interpretação a consulta acima
pode ser satisfeita e produz todas as pessoas registradas no banco de dados que
participaram de um filme, mas não no filme “Woodstock” dirigido por Michael
Wadleigh.
Por fim, em algumas consultas, poderı́amos ainda especificar outros conjun-
tos possı́veis que poderiam ser usados para valorar cada variável livre presente
em determinados termos de uma relação. Estes conjuntos necessariamente de-
vem conter o domı́nio ativo e o domı́nio natural delas devem contê-los. Dizemos
entao que a consulta deve ser avaliada em relação a um domı́nio explı́cito D.
Outro exemplo de consulta problemática usando disjunção:
{⟨x, y⟩|F (“Woodstock”, “Michael Wadleigh”, x)∨F (y, “Michael Wadleigh”, “Janis Joplin”)}
{⟨x⟩|∀yR(x, y)}
Executar esta consulta evitando laços infinitos pode ser feito dependendo do
caso, mas é algo intrincado.
E finalmente:
Pergunta 17: Liste os filmes nos quais todos os atores já participaram de
um filme de Hitchcock.
Este é um caso no qual não é possı́vel expressar a consulta somente por
meio de subtração de conjuntos. Expressar desigualdades na cláusula WHERE
tampouco nos ajuda, pois SELECT DISTINCT a.TITULO FROM FILME a, FILME
b WHERE a.ATOR=b.ATOR AND b.DIRETOR <> ’Hitchcock’; apenas nos retor-
naria os filmes nos quais há ao menos um ator queparticipou de um filme que
não é do Hitchcock.
Este é um caso no qual a forma mais simples de resolver é usar a condição
de que não existe resultado para uma subconsulta:
{⟨e1 , . . . , em ⟩|∃x1 , . . . xk , x′1 , . . . x′k (R1 (u1 ) ∧ . . . ∧ Rn (un ))∨(R1′ (u′1 ) ∧ . . . ∧ Rn′ ′ (u′n′ )) }
{⟨e1 , . . . , em ⟩|∃x1 , . . . xk , x′1 , . . . x′k R1 (u1 )∧. . .∧Rn (un )∧¬R1′ (u′1 )∧. . .∧¬Rn′ ′ (u′n′ ) }
valor para ser a mesma constante. E se ambas forem constantes, mas com
valores diferentes, então já sabemos que F1 e F2 são disjuntos e caı́mos de
novo no caso em que F1 − F2 = F1 e podemos apenas usar a fórmula de
F1 .
Observe que seguindo a regra acima, não há como produzir uma fórmula
onde uma variável ei aparece em uma relação negada, mas não aparece em
uma relação não-negada. A relação não-negada funciona então como um
limitador de quais são os valores que ei pode ter, e à partir destes valores,
a relação negada pode remover alguns destes elementos finitos. Com isso,
se as fórmulas de F1 e F2 forem independentes de domı́nio, a fórmula de
F1 − F2 obtida acima também será independente de domı́nio.
Portanto, conseguimos demonstrar que qualquer expressão de álgebra rela-
cional pode ser convertida para uma fórmula de cálculo relacional (e tal fórmula
será independente de domı́nio).
Teorema 8. O cálculo relacional com disjunção e negação é igualmente ex-
pressivo quando restrito à consultas independente de domı́nio e quando sob a
interpretação de domı́nio ativo.
Demonstração. Toda consulta independente de domı́nio já é uma consulta sob
a interpretação de domı́nio ativo, pois ela irá produzir o mesmo resultado, in-
dependente de como o domı́nio é definido.
Por outro lado, cada consulta sob interpretação de domı́nio ativo pode
também ser convertido para uma consulta independente de domı́nio. Basta
modificar a consulta para que a interpretação de domı́nio ativo seja represen-
tada dentro da própria consulta. Por exemplo, assuma que uma negação ou
disjunção possui uma variável x que na interpretação de domı́nio ativo corres-
ponde a valores associados a um termo de uma relação R mais a uma lista de
constantes c1 , . . . , ci . Se modificarmos a consulta acrescentando a conjunção
∧ R(. . . , x, . . .) ∨ x = c1 ∨ . . . ∨ x = ci , então toda interpretação será idêntica
à interpretação de domı́nio ativo e assim a consulta se torna independente de
domı́nio.
Teorema 9. A álgebra relacional é tão ou mais expressiva quanto o cálculo
relacional sob a interpretação do domı́nio ativo.
Demonstração. A versão do cálculo relacional apresentado aqui é muito mais
elaborado e completo que a versão do capı́tulo anterior usando apenas consulta
conjuntiva. Desta forma, a única forma de provar a afirmação é por meio da
análise sintática das fórmulas bem-formadas que apresentamos, mostrando como
podemos usar elas para construir expressões algébricas equivalentes. A fórmula
deve ser interpretada assumindo que uma árvore sintática foi construı́da e a
expressão algébrica correspondente é obtida à partir de regras recursivas que
vão produzindo expressões intermediárias e também um contexto de tradução.
O contexto de tradução é uma lista de possı́veis relações de equivalência
e diferença entre variáveis e constantes. Cada elemento desta lista é uma tu-
pla onde o primeiro elemento é um conjunto de classes de equivalência entre
56 CAPÍTULO 3. ADICIONANDO NEGAÇÃO
{⟨e1 , e2 ⟩|F (e1 , “Barbara Loden”, e2 )} ⇔ πTitulo, Ator σDiretor=“Barbara Loden” (F )
{⟨e1 ⟩|e1 ̸= 5} ⇔ πTitulo (F ) ∪ πDiretor (F ) ∪ . . . − {⟨5⟩}
{⟨e1 ⟩|e1 ̸= e2 } ⇔ πTitulo (F )∪πDiretor (F )∪. . . × πTitulo (F )∪πDiretor (F )∪. . . −{⟨e1 , e2 ⟩|e1 = e2 }
geraremos uma expressão algébrica que será unida às demais por meio
de união (∪). Cada expressão individual é obtida à partir da mudança de
nomes das colunas de F1 e F2 de modo que se ambas tiverem variáveis per-
tencentes à mesma classe de equivalência, elas devem passar a ter colunas
com o mesmo nome. Após realizar a mudança de nome, é feita a junção
natural entre as expressões algébricas correspondentes à F1 e F2 . Por fim,
para cada relação de equivalência, se houver uma variável resultante equi-
valente a uma constante, usamos a seleção σ para manter somente valores
em que a coluna correspondente à ela tenha tal valor constante.
5. Para fórmulas não-atômicas F1 ∨ F2 onde F1 e F2 são fórmulas bem-
formadas com os respectivos contextos de tradução C1 e C2 , começamos
produzindo um novo contexto de tradução concatenando C1 e C2 e produ-
zindo a união da expressão algébrica correspondente à F1 com a expressão
correspondente à F2 . Observe que seguindo todas as regras vistas até
agora, o número de operandos de operações de disjunções que temos é
sempre igual ao número de elementos do contexto de tradução. Cada
operando possui o seu elemento da lista.