Vous êtes sur la page 1sur 55

- C R

AC I O NAL
LO R E L
CÁLC U dova l
e to Sa n
sa B a rr
rí a L u i
a
MSc. M
CÁLCULO RELACIONAL
  Herramienta formal utilizada como lenguaje de consulta a bases
de datos relacionales (BDR).
El álgebra El cálculo relacional
relacional (AR) (CR)
Provee de una colección de Formula la relación resultante en
operadores que actúan términos de las relaciones
sobre relaciones para originales.
obtener otras relaciones

Es procedural (se indica un Es descriptivo (se indica cuál es


procedimiento para resolver el problema y no cómo
el problema) resolverlo).

Operación en un único paso sin


Operaciones paso a paso necesidad de obtener tablas
intermedias

Ambos métodos logran los mismos resultados


CÁLCULO RELACIONAL
  El CR usa un enfoque completamente diferente al álgebra relacional. Los dos
lenguajes son completamente equivalentes. La solución para toda consulta en este
tipo de cálculo se define por:
  Una lista de resultados: la lista de registros que cumplen las condiciones que deseamos
  Una sentencia de cualificación: contiene las condiciones que deseamos que cumplan
los registros de la lista de resultados
  El CR se apoya en un lenguaje de interrogación de bases de datos como puede ser el
SQL
  El CR está basado en una rama de la lógica matemática, llamada Lógica de
Predicados, ó Cálculo de predicados de primer orden.
  El CR incluye un concepto nuevo denominado cuantificador, los cuantificadores
tratan de averiguar el número de registros afectados por una determinada
operación, incluso antes de realizarla, según su naturaleza lo podemos dividir en dos
grupos:
  Cuantificadores existenciales
  Cuantificadores universales
CUANTIFICADORES
Cuantificadores existenciales: son aquellos que tratan de averiguar el número
de registros que devolvería un tipo de consulta.
•  Ej: Conocer el número de clientes de Bogotá que han comprado el producto
2017. Si el número de productos que satisfacen esta relación es mayor que
cero, podemos generar la consulta para lanzar posteriormente un informe, en
caso contrario se podría enviar un mensaje al usuario para que sepa que no
hay ningún cliente con estas características.

Cuantificadores universales: Son aquellos que indican que una


condición se aplica a todas las filas de algún tipo. Se usa para
brindar la misma capacidad que la operación de división en el
algebra relacional.
CÁLCULO RELACIONAL
  La primera propuesta de usar la lógica de predicados
(LP) en bases de datos relacionales la hizo Codd en
[CODD72].
Según el tipo de variables que se manejan, existen dos
tipos de CR.
  El cálculo relacional de tuplas (CRT) emplea variables-
tupla, que designan a tuplas de relaciones.
  En el cálculo relacional de dominios (CRD) se utilizan
variables-dominio, que toman valores de los dominios
asociados a los atributos de las relaciones.
LOGICA DE PREDICADOS
DE PRIMER ORDEN
  En este primer apartado vamos a repasar los conceptos
fundamentales de la lógica de predicados de primer
orden. Fundamentalmente nos centraremos en los
aspectos sintácticos concernientes con las fórmulas
bien formadas (expresiones correctas) del lenguaje.
También se comentarán más brevemente los aspectos
semánticos, referidos al significado de dichas fórmulas
y de los símbolos que las forman. Introduciremos los
conceptos de interpretación, evaluación y modelo.
SIMBOLOS DEL LENGUAJE
Símbolos /operadores/ REPRESENTACIÓN
cuantificadores
  Los de
símbolos símbolos
puntuación básicos del
paréntesis "(",lenguaje son:
")" y coma ",".
símbolos de variables se representan mediante letras minúsculas del final
del alfabeto: r, s, t, u, v, w, x, y, z.
símbolos de constantes se representan mediante letras minúsculas del
principio del alfabeto: a, b, c, d, e.
símbolos de funciones también se representan con letras minúsculas, pero
del centro del alfabeto: f, g, h, i ..
símbolos de predicados se representan mediante letras mayúsculas.
operadores lógicos ¬ (negación), → (implicación), ∧ (conjunción) y ∨
(disyunción).
cuantificadores ∀ (cuantificador universal) y ∃ (cuantificador
existencial).
JERARQUIA DE OPERADORES
Y CUANTIFICADORES
Es de mayor a menor:

1) ¬, ∀, ∃ 2) ∨ 3) ∧ 4) →

Dicha precedencia se puede alterar utilizando los paréntesis.

  Los operadores → y ∧ y el cuantificador ∀ se introducen en el lenguaje


por conveniencia, ya que en realidad no son necesarios pues:

F→G ≡ (¬F)∨G

∀x(F) ≡ ¬∃x(¬F)

F∧G ≡ ¬(¬F∨¬G)
CALCULO RELACIONAL DE
TUPLAS - CRT
  Es un lenguaje de consulta no procedimental
  Describe la información deseada sin dar un
procedimiento específico para obtenerla.

Una consulta en el CRT se expresa como


{t / P(t)}
El conjunto de todas las tuplas t, tal que el predicado P, es
verdadero para t.
CALCULO RELACIONAL DE
TUPLAS - CRT
  se usa t [A] para denotar el valor de la tupla t en el
atributo A y t ∈ r para denotar que la tupla t está en
la relación r.
Ejemplo
Dadas las relaciones r y s:
  la unión se expresa
{ t / r(t) ∨ s(t)}
El conjunto de tuplas t tales que t está en r ó en s
  La diferencia se expresa
r-s={t/r(t) ∧¬ s(t)}
El conjunto de tuplas t tales que t está en r y no en s
  La proyección π i1,...ik ( r ) se expresa
{ t (k) / ∃ u (r(u)∧ t[1]=u[i1] ∧...∧ t[k]=u[ik]) }
donde t (k) significa tuplas de grado k
Ejemplo - Esquema
Las consultas se realizan sobre el esquema siguiente:

  sucursal(nombre_sucursal, ciudad_sucursal, activos)


  cliente (nombre_cliente, calle_cliente, ciudad_cliente)
préstamo (número_préstamo, nombre_sucursal, cantidad)
  prestatario (nombre_cliente, número_préstamo)
  cuenta (número_cuenta, nombre_sucursal, saldo)
  Impositor o depósito (nombre_cliente, número_cuenta)
Ejemplo de consultas
1.  Encontrar el nombre_sucursal,
número_préstamo, nombre_cliente y
cantidad para préstamos mayores de
1200 dólares.
{t / t ∈ préstamo ∧ t[cantidad] >1200}
a.  Si se desea obtener el atributo número_préstamo, en vez de todos los atributos
de la relación préstamo. Para escribir esta consulta en cálculo relacional de
tuplas hay que incluir una expresión de relación sobre el esquema
(número_préstamo). Se necesitan las tuplas de (número_préstamo) tales que hay
una tupla de préstamo con el atributo importe > 1200.
Ejemplo de consultas
Para expresar esta solicitud hay que usar el constructor “existe” de la
lógica matemática. La notación
∃t ∈ r(Q(t))
«existe una tupla t en la relación r tal que el predicado Q(t) es verdadero».
  Usando esta notación podemos escribir la consulta “Determinar el nombre del cliente
de todos los préstamos con cantidad superior a 1.200 €” como

{ t / ∃ s ∈préstamo ( t[nombre_cliente] = s[nombre_


cliente] ∧ s[cantidad]>1200)}
«el conjunto de todas las tuplas t tal que existe una tupla s en préstamo para la cual los
valores de t y s para el atributo nombre_cliente son iguales y el valor de s para el atributo
cantidad es mayor de 1200€».
t se define sólo en el atributo nombre_cliente => el resultado es una relación sobre
(nombre_cliente).
Ejemplo de consultas
  “Determinar el número de préstamo de todos los préstamos con
cantidad superior a 1.200 €” como

{ t / ∃ s ∈préstamo ( t[número_préstamo]
= s[número_préstamo] ∧ s[cantidad]>1200)}
«el conjunto de todas las tuplas t tal que existe una tupla s de la
relación préstamo para la que los valores de t y s para el atributo
número_préstamo son iguales y el valor de s para el atributo
cantidad es mayor de 1200€».
  La variable tupla t sólo se define para el atributo número_préstamo,
dado que es el único atributo para el que se especifica una
condición para t. Por tanto, el resultado es una relación de
(número_préstamo).
Ejemplo de consultas
  Encontrar los clientes que tienen un préstamo en Perryridge y las
ciudades en las que viven.
  Esta consulta involucra dos relaciones: cliente y préstamo
  Se requiere tener dos cláusulas «existe» en la expresión conectadas por y
(∧).

{ t / ∃ s∈préstamo( t[nombre_cliente] = s[nombre_cliente] ∧


s[nombre_sucursal]="Perryridge”
∧ ∃ u ∈cliente (u[nombre_cliente] = s[nombre_cliente] ∧ t[ciudad_cliente] =
u[ciudad_cliente]))}
el conjunto de todas las tuplas (nombre_cliente) tales que el cliente tiene un
préstamo concedido en la sucursal de Perryridge”. La variable tupla u
garantiza que el cliente sea prestatario de la sucursal de Perryridge. La
variable tupla s está restringida para que corresponda al mismo número de
préstamo que s.
Ejemplo de consultas
Para determinar todos los clientes del banco que tienen concedido un préstamo,
abierta una cuenta o ambas cosas, se usó la operación unión del álgebra relacional. En
el cálculo relacional de tuplas serán necesarias dos instrucciones “existe” conectadas
mediante o (∨):
{t | ∃ s ∈ prestatario (t[nombre_cliente] = s[nombre_cliente]) ∨
∃ u ∈ impositor (t[nombre_cliente] = u[nombre_cliente])}
Esta expresión da el conjunto de todas las tuplas de nombre_cliente tales que se
cumple al menos una de las condiciones siguientes:
• nombre_cliente aparece en alguna tupla de la relación prestatario como prestatario
del banco.
• nombre_cliente aparece en alguna tupla de la relación impositor como impositor del
banco.
Si algún cliente tiene concedido un préstamo y abierta una cuenta en el banco, ese cliente sólo
aparece una vez en el resultado, ya que la definición matemática de conjunto no permite
elementos duplicados.
Ejemplo de consultas
Encontrar los clientes que tienen un préstamo, una cuenta o las dos, en la
sucursal Perryridge.

{ t / ∃ s ∈ préstamo(t[nombre_cliente] = s[nombre_cliente] ∧
s[nombre_sucursal] = "Perryridge")

∨ ∃ u ∈ depósito (t [nombre_cliente] = u[nombre_cliente] ∧


u[nombre_sucursal] = "Perryridge")}

Devuelve tuplas nombre_cliente que cumplen al menos que:

  Nombre_cliente aparece en alguna tupla de préstamo con un préstamo en


Perryridge
  Nombre_cliente aparece en alguna tupla de depósito como depositante en
Perryridge
Ejemplo de consultas
Si algún cliente tiene concedido un préstamo y abierta una
cuenta en el banco, ese cliente sólo aparece una vez en el
resultado, ya que la definición matemática de conjunto no
permite elementos duplicados.

Si sólo queremos conocer los clientes que tienen en el


banco tanto una cuenta como un préstamo:

{t | ∃ s ∈ prestatario (t[nombre_cliente] =
s[nombre_cliente]) ∧ ∃ u ∈ impositor (t[nombre_cliente] =
u[nombre_cliente])}
Ejemplo de consultas
Encontrar únicamente aquellos clientes que tienen una
cuenta y un préstamo en Perryridge.

{ t / ∃ s ∈ préstamo(t [nombre_cliente] = s
[nombre_cliente] ∧ s [nombre_sucursal] = "Perryridge")

∧ ∃ u ∈ depósito (t [nombre_cliente] = u
[nombre_cliente] ∧ u[nombre_sucursal = "Perryridge")}
Ejemplo de consultas
Determinar todos los clientes que tienen una cuenta abierta en el banco pero no
tienen concedido ningún préstamo”. La expresión del cálculo relacional de
tuplas para esta consulta es parecida a las que se acaban de ver, salvo en el uso
del símbolo no (¬):

{t | ∃ u ∈ impositor (t[nombre_cliente] = u[nombre_cliente])


∧ ¬ ∃ s ∈ prestatario (t[nombre_cliente] = s[nombre_cliente])}

Esta expresión del cálculo relacional de tuplas usa:

•  la cláusula ∃u ∈ impositor(...) para exigir que el cliente tenga una cuenta


abierta en el banco, y

•  la cláusula ¬ ∃ s ∈ prestatario (. . .) para eliminar los clientes que aparecen


en alguna tupla de la relación prestatario por tener un préstamo del banco.
Ejemplo de consultas
Encontrar los clientes que tienen una cuenta en Perryridge pero no
un préstamo en ella.

{ t / ∃ u ∈ depósito ( t[nombre_cliente]=u[nombre_cliente] ∧ u
[nombre_sucursal] = "Perryridge“
∧ ¬ ∃ s ∈ préstamo ( t[nombre_cliente]=s[nombre_cliente] ∧ s
[nombre_sucursal] = "Perryridge" ))}

  ∃ u ∈ depósito(... ): exige que el cliente tenga una cuenta en


Perryridge, y
  ¬ ∃ s ∈ préstamo(... ): elimina los clientes que aparezcan en
alguna tupla de préstamo por tener un préstamo de Perryridge.
Ejemplo de consultas con
implicación “è”
La fórmula
P⇒Q

Significa “P implica Q”; es decir, “si P es cierto, entonces Q


tiene que serlo también”.

Obsérvese
P ⇒ Q es equivalente lógicamente a ¬P ∨ Q.
Dos expresiones son lógicamente equivalentes si sus tablas
de verdad son iguales.
El empleo de la implicación en lugar de no y o sugiere una
interpretación más intuitiva de la consulta en español.
Ejemplo de consultas con
implicación “è”
Encontrar los clientes que tienen una cuenta en todas las
sucursales situadas en Brooklyn.

  En AR se resuelve con la operación división.

  En CRT se introducen: para todos (∀) e implicación ( => ).

  P => Q Significa «si P es verdadera, entonces Q debe ser


verdadera».

  ∀ t ∈ r(Q (t)) significa « Q es verdadera para todas las tuplas t


en la relación r ».
Ejemplo de consultas con
implicación “è”
Encontrar los clientes que tienen una cuenta en todas las
sucursales situadas en Brooklyn.

{t / ∀ u ∈ sucursal (u [ciudad_sucursal] = "Brooklyn" => ∃ s ∈


depósito (t [nombre_cliente] = s [nombre_cliente] ∧ u
[nombre_sucursal] = s[nombre_sucursal]))}

Es decir:
  el conjunto de todos los clientes (tuplas t (nombre_cliente))
  tal que para todas las tuplas u en la relación sucursal,
  si el valor de u en el atributo ciudad_sucursal es Brooklyn
  entonces el cliente tiene una cuenta en la sucursal cuyo nombre
aparece en el atributo nombre_sucursal de u.
Ejemplo de consultas
Determinar todos los clientes que tienen una cuenta en todas las sucursales de
Arganzuela. Para escribir esta consulta en el cálculo relacional de tuplas se introduce
el constructor “para todo”, denotado por ∀. La notación

∀t ∈ r(Q(t))

significa “Q es verdadera para todas las tuplas t de la relación r”.

La expresión para la consulta se escribe de la manera siguiente:

{t | ∃ r ∈ cliente (r[nombre_cliente] = t[nombre_cliente]) ∧


( ∀ u ∈ sucursal (u[ciudad_sucursal] = “Arganzuela” ⇒ ∃ s ∈ impositor
(t[nombre_cliente] = s[nombre_cliente] ∧ ∃ w ∈ cuenta (w[nu mero_cuenta] =
s[número_cuenta] ∧ w[nombre_sucursal] = u[nombre_sucursal]))))}

El conjunto de todos los clientes (es decir, las tuplas t (nombre_cliente)) tales que, para
todas las tuplas u de la relación sucursal, si el valor de u en el atributo ciudad_sucursal
es Arganzuela, el cliente tiene una cuenta en la sucursal cuyo nombre aparece en el
atributo nombre_sucursal de u”.
Ejemplo de consultas
Si no hay ninguna sucursal en Arganzuela, todos los
nombres de cliente satisfacen la condición. La
primera línea de la expresión de consulta es crítica en
este caso sin la condición

∃ r ∈ cliente (r[nombre_cliente] = t[nombre_cliente])


si no hay ninguna sucursal en Arganzuela, cualquier
valor de t (incluyendo los que no son nombres de
cliente de la relación cliente) valdría.
Definición Formal
Las expresiones del cálculo relacional de tuplas son de la forma:
{t | P(t)}
donde P es una fórmula. En una fórmula pueden aparecer varias variables tupla.
Se dice que una variable tupla es una variable libre a menos que esté cuantificada mediante ∃ o ∀.
Por tanto, en
t ∈ préstamo ∧ ∃s ∈ cliente(t[nombre_sucursal] = s[nombre_sucursal])
t es una variable libre.
La variable tupla s se denomina variable ligada.
Las fórmulas del cálculo relacional de tuplas se construyen con átomos, que tienen una de las
siguientes formas:
  s ∈ r, donde s es una variable tupla y r es una relación (no se permite el uso del operador ∈/ )
  s[x] Θ u[y], donde s y u son variables tuplas, x es un atributo en el que está definida s, y es un atributo en
el que está definida u, y Θ es un operador de comparación (<, ≤, =, ≠, >, ≥); se exige que los atributos x e y
tengan dominios cuyos miembros puedan compararse mediante Θ
  s[x]Θc, donde s es una variable tupla, x es un atributo en el que está definidas,Θes un operador de
comparación y c es una constante en el dominio del atributo x.
Definición Formal
Las fórmulas se construyen a partir de los átomos usando las reglas siguientes:
  Cada átomo es una fórmula.
  Si P es una fórmula, también lo son: ¬P y (P ).
1 1 1

  Si P y P son fórmulas, también lo son: P ∨ P , P ∧ P y P ⇒ P .


1 2 1 2 1 2 1 2

  Si P (s) es una fórmula que contiene la variable tupla libre s, y r es una


1

relación,
∃s ∈ r(P (s)) y ∀s ∈ r(P (s))
1 1

Igual que en el álgebra relacional, se pueden escribir expresiones equivalentes


que no sean idénticas en apariencia. En el cálculo relacional de tuplas estas
equivalencias incluyen las tres reglas siguientes:
  P ∧ P es equivalente a ¬ (¬(P ) ∨ ¬(P )).
1 2 1 2

  ∀t ∈ r(P (t))es equivalente a ¬ ∃ t ∈ r(¬P (t)).


1 1

  P ⇒ P es equivalente a ¬(P ) ∨ P .
1 2 1 2
Seguridad de las
expresiones
Las expresiones del cálculo relacional de tuplas pueden generar relaciones infinitas.

Supóngase que se escribe la expresión


{t | ¬ (t ∈ préstamo)}
Hay infinitas tuplas que no están en préstamo. La mayor parte de estas tuplas contienen valores
que ni siquiera aparecen en la base de datos. Resulta evidente que no se desea permitir
expresiones de ese tipo.
Para definir las restricciones del cálculo relacional de tuplas, se introduce el concepto de dominio
de las fórmulas relacionales de tuplas, P.
El dominio de P, denotado por dom(P), es el conjunto de todos los valores que aparecen
explícitamente en P, o en una o más relaciones cuyos nombres aparezcan en P.
Ejemplo,
dom(t ∈ préstamo ∧ t[importe] > 1200)
Es el conjunto que contiene a 1200 y el conjunto de todos los valores que aparecen en préstamo.
Seguridad de las
expresiones
Además
dom(¬ (t ∈ préstamo))
es el conjunto de todos los valores que aparecen en
préstamo, dado que la relación préstamo se menciona en
la expresión.
La expresión {t | P (t)}
es segura si todos los valores que aparecen en el resultado son valores
de dom(P).

La expresión {t |¬ (t ∈ préstamo)} no es segura.


Potencia expresiva de los
lenguajes
  El cálculo relacional de tuplas restringido a expresiones seguras
es equivalente en potencia expresiva al álgebra relacional
básica (con los operadores ∪, −, ×, σ y ρ, pero sin los
operadores relacionales extendidos como la proyección
generalizada G y las operaciones de reunión externa).

  Cada expresión del álgebra relacional que sólo utilice los


operadores básicos, existe una expresión equivalente del
cálculo relacional de tuplas y viceversa.
  En el cálculo relacional de tuplas no tiene ningún equivalente de
la operación agregación, pero se puede extender para
contenerla. La extensión del cálculo relacional de tuplas para
que maneje las expresiones aritméticas es sencilla.
Cálculo relacional de
dominios
  Usa variables de dominio, que toman sus valores del dominio de un atributo,
en vez de hacerlo para una tupla completa.

  El cálculo relacional de dominios, se halla estrechamente relacionado con


el cálculo relacional de tuplas.

De︎finición
finición formal

  Las expresiones del cálculo relacional de dominios son de la forma

{<x1, x2,...,xn > |P(x1, x2,...,xn)}


donde
•  x1 , x2 , . . . , xn representan las variables de dominio,
•  P representa una fórmula compuesta por átomos, como era el caso en el
cálculo relacional de tuplas.
Cálculo relacional de
dominios
Los átomos del cálculo relacional de dominios tienen una de las formas
siguientes:
< x1, x2,...,xn > ∈ r
r es una relación con n atributos y
x1, x2,...,xn son variables de dominio o constantes de dominio.
xΘy
x e y son variables de dominio y
Θ es un operador de comparación (<, ≤, =, =, >, ≥).
Se exige que los atributos x e y tengan dominios que puedan compararse
mediante Θ.
xΘc
X es una variable de dominio,
Θes un operador de comparación y
C es una constante del dominio del atributo para el que x es una variable de
dominio.
Cálculo relacional de
dominios
Las fórmulas se construyen a partir de los átomos, usando
las reglas siguientes:
  Los átomos son fórmulas.
  Si P1 es una fórmula, también lo son ¬P1 y (P1).
  SiP1 yP2 sonfórmulas,tambiénlosonP1 ∨ P2,P1 ∧ P2 yP1
⇒ P2.
  Si P1(x) es una fórmula en x, donde x es una variable libre
de dominio, también son fórmulas:
∃ x (P1(x)) y ∀ x (P1(x))

Como notación abreviada se escribe ∃ a,b,c (P(a,b,c)) en


lugar de ∃ a (∃ b (∃ c (P(a,b,c)))).
Ejemplos
  Determinar el número de préstamo, el nombre de la sucursal y el importe de
los préstamos de más de 1.200 e:

{<p,s,i> | <p,s,i>∈ pr estamo ∧ i > 1200}


  Determinar todos los números de préstamo de los préstamos por importe
superior a 1.200 e:

{<p> |∃s,i(<p,s,i>∈ pr estamo ∧ i > 1200)}


En el cálculo de tuplas, cuando se escribe ∃ s para alguna variable tupla s, se
vincula inmediatamente con una relación escribiendo ∃ s ∈ r.

En el cálculo de dominios, cuando se usa ∃ s b no se refiere a una tupla, sino a un


valor de dominio. Por tanto, el dominio de la variable s no está restringido hasta
que la subfórmula < p,s,i > ∈ préstamo restringe s a los nombres de sucursal que
aparecen en la relación préstamo.
Ejemplos
  Determinar el nombre de todos los clientes que tienen concedido
un préstamo en la sucursal de Navacerrada y determinar el
importe del préstamo:
{<n,i> |∃ p(<n,p>∈ prestatario
∧ ∃ s (< p, s, i > ∈ pr estamo ∧ s = “Navacerrada”))}

  Determinar el nombre de todos los clientes que tienen concedido


un préstamo, abierta una cuenta o ambas cosas en la sucursal de
Navacerrada:
{< n > |∃p(< n,p >∈ prestatario
∧∃s,i(< p,s,i >∈ pr estamo ∧ s = “Navacerrada”)) ∨∃c(< n,c >∈
impositor
∧∃s,x(< c,s,x >∈ cuenta ∧ s = “Navacerrada”))}
Ejemplos
Determinar el nombre de todos los clientes que tienen una cuenta
abierta en todas las sucursales situadas en Arganzuela:
{<n> |∃d,c(<n,d,c>∈ cliente)∧∀ x,y,z (< x,y,z > ∈ sucursal ∧ y =
“Arganzuela” ⇒ ∃ a,b (< a,x,b > ∈ cuenta ∧ < n,a > ∈ impositor))}
el conjunto de todas las tuplas c (nombre _cliente) tales que, para
todas las tuplas x, y, z (nombre_sucursal, ciudad_sucursal, activos), si
la ciudad de la sucursal es Arganzuela, las siguientes afirmaciones
son verdaderas:
•  Existe una tupla de la relación cuenta con número de cuenta a y
nombre de sucursal x. ︎
•  Existe una tupla de la relación impositor con cliente n y número de
cuenta a”.
Seguridad de las
expresiones
  Es posible escribir expresiones que generen relaciones infinitas. Esto llevó a definir la
seguridad de las expresiones de cálculo relacional de tuplas. Se produce una situación
parecida en el cálculo relacional de dominios. Las expresiones como:
{< p,s,i > | ¬(< p,s,i > ∈ préstamo)}
no son seguras porque permiten valores del resultado que no están en el dominio de la
expresión.
  En el cálculo relacional de dominios también hay que tener en cuenta la forma de las
fórmulas dentro de las instrucciones “existe” y “para todo”. Considérese la expresión:
{<x> |∃y(<x,y>∈ r) ∧ ∃z(¬(<x,z>∈ r) ∧ P(x,z))}
P es una fórmula que implica a x y a z.
Para comprobar la primera parte de la fórmula, ∃ y (< x, y > ∈ r), se toma en consideración sólo
los valores de r.
Para comprobar la segunda parte de la fórmula, ∃ z (¬ (< x, z > ∈ r) ∧ P (x, z)), hay que tomar
en consideración valores de z que no aparecen en r.
Seguridad de las
expresiones
  En el cálculo relacional de tuplas se restringió cualquier variable cuantificada existencialmente a variar
sobre una relación concreta. Dado que no se hizo así en el cálculo de dominios, se añaden reglas a la
definición de seguridad para tratar casos como el del ejemplo. Se dice que la expresión:
{<x1, x2,...,xn > |P(x1, x2,...,xn)}
es segura si se cumplen todas las condiciones siguientes:
  Todos los valores que aparecen en las tuplas de la expresión son valores de dom (P).
  Para cada subfórmula “existe” de la forma ∃ x (P1(x)), la subfórmula es cierta si y sólo si hay un valor x
de dom(P1) tal que P1(x) es cierto. Para que ∃ x (P1(x)) sea cierto sólo hay que encontrar una x para la
que P1(x) lo sea. En general habría que comprobar infinitos valores. Sin embargo, si la expresión es
segura, se sabe que se puede restringir la atención a los valores de dom(P1). Esta restricción reduce
las tuplas que hay que tomar en consideración a un número finito
  Para cada subfórmula “para todo” de la forma ∀x (P1(x)), la subfórmula es verdadera si y sólo si P1(x)
es cierto para todos los valores x de dom(P1). Para asegurar que ∀x (P1(x)) es cierto hay que
comprobar en general todos los valores posibles, por lo que es necesario examinar infinitos valores.
Como antes, si se sabe que la expresión es segura, basta con comprobar P1(x) para los valores
tomados de dom(P1).
El propósito de las reglas adicionales es garantizar que se puedan comprobar las subfórmulas “para todo” y
“existe” sin tener que comprobar infinitas posibilidades.
Potencia expresiva de los
lenguajes
Cuando el cálculo relacional de dominios se restringe a las expresiones
seguras, es equivalente en potencia expresiva al cálculo relacional de
tuplas restringido también a las expresiones seguras.Llos tres lenguajes
siguientes son equivalentes:
  El álgebra relacional básica (sin las operaciones extendidas del
álgebra relacional).

  El cálculo relacional de tuplas restringido a las expresiones seguras.

  El cálculo relacional de dominios restringido a las expresiones


seguras.

Hay que tener en cuenta que el cálculo relacional de dominios tampoco


tiene equivalente para la operación agregación, pero se puede extender
fácilmente para contenerla.
Query-by-Example
QBE
Query-by-Example (QBE, Consulta mediante ejemplos) es el nombre tanto de un
lenguaje de manipulación de datos como de un sistema de base de datos que
incluyó ese lenguaje.

El lenguaje de manipulación de datos QBE tiene dos características distintivas:

  presenta una sintaxis bidimensional. Las consultas parecen tablas. Las


consultas de los lenguajes unidimensionales (como SQL) se pueden formular
en una línea (posiblemente larga). Los lenguajes bidimensionales necesitan
dos dimensiones para su formulación.

  Las consultas en QBE se expresan “mediante ejemplos”. En lugar de incluir un


procedimiento para obtener la respuesta deseada, se emplea un ejemplo de lo
que se desea. El sistema generaliza ese ejemplo para calcular la respuesta a la
consulta.
Query-by-Example
QBE
  Existe una estrecha correspondencia entre QBE y el
cálculo relacional de dominios.

  Existen dos enfoques de QBE:


  la versión original basada en texto y
  una versión gráfica.
QBE- Esqueletos de
Tablas
  Una consulta en QBE se expresa mediante esqueletos de
tablas.
  Estas tablas presentan el esquema de la relación.
  En lugar de llenar la pantalla con todos los esqueletos, el
usuario elige los que necesita para una determinada
consulta y rellena esos esqueletos con filas de ejemplo.
  Cada fila de ejemplo consiste en constantes y elementos
ejemplo, que son variables de dominio. Para evitar confusiones
entre los dos, QBE usa un carácter de subrayado (_) antes de las
variables de dominio, como en _x, y permite que las constantes
aparezcan sin ninguna indicación particular.
QBE- Consultas sobre una
relación
  Recuperando el ejemplo bancario habitual, para determinar todos los números de
préstamo de la sucursal de Navacerrada se usa el esqueleto de la relación préstamo y se
rellena del modo siguiente:

  Esta consulta indica al sistema que busque tuplas de préstamo que tengan
“Navacerrada” como valor del atributo nombre_sucursal. Para cada tupla de este tipo, el
sistema asigna el valor del atributo número _préstamo a la variable x. El valor de la
variable x se “imprime” (normalmente en pantalla), debido a que el comando P. (acrónimo
de print) aparece en la columna número_préstamo junto a la variable x.

Este resultado es parecido al que se obtendría como respuesta a la siguiente consulta del
cálculo relacional de dominios:

  {⟨x⟩|∃s,c(⟨x,s,c⟩ ∈ pre stamo ∧ s = “Navacerrada”)}


QBE- Esqueletos de tablas de
QBE para el ejemplo bancario
QBE- Consultas sobre una
relación
  QBE asume que cada posición vacía de una fila contiene una variable
única. En consecuencia, si alguna variable no aparece más de una vez en
la consulta, se puede omitir. La consulta anterior, por tanto, puede volver a
escribirse como:

  QBE (a diferencia de SQL) realiza de manera automática la eliminación de


duplicados. Para evitar la eliminación es necesario insertar el comando
ALL. después del comando P.:
QBE- Consultas sobre una
relación
  Para mostrar la relación préstamo completa, se puede crear una única
fila con el comando P. en todos los campos. También se puede usar
una notación más concisa consistente en colocar una única orden P.
en la columna encabezada por el nombre de la relación:

  QBE permite formular consultas que conlleven comparaciones


aritméticas (por ejemplo, >), en lugar de las comparaciones de
igualdad. Ej:“Determinar el número de todos los préstamos de
aquellos préstamos de importe superior a 700 e”:
QBE- Consultas sobre una
relación
  Las comparaciones sólo pueden contener una expresión aritmética en el lado derecho de la
operación de comparación

(por ejemplo, > (_x +_y − 20)).

La expresión puede contener tanto variables como constantes. El lado izquierdo de la comparación debe
estar vacío. Las operaciones aritméticas que son compatibles con QBE son =, <, ≤, >, ≥, y ¬.

Exigir que el lado izquierdo esté vacío implica que no se pueden comparar dos variables con nombres
distintos.

Consulta “Determinar el nombre de todas las sucursales que no se hallan en Arganzuela”. Esta consulta
se puede formular del siguiente modo:
QBE- Consultas sobre una
relación
El objetivo principal de las variables en QBE es obligar a ciertas tuplas a tener el mismo
valor en algunos atributos.
consulta “Determinar el número de préstamo de todos los préstamos solicitados
conjuntamente por Santos y Gómez”:

Para ejecutar esta consulta el sistema busca todos los pares de tuplas de la relación
prestatario, que coinciden en el atributo número_préstamo, para los que el valor del atributo
nombre_cliente es “Santos” para una tupla y “Gómez” para la otra.
El sistema muestra el valor del atributo número_préstamo.
  En el cálculo relacional de dominios la consulta se podría escribir como:
{⟨p⟩ | ∃ x (⟨x, p⟩ ∈ prestatario ∧ x = “Santos”) ∧ ∃ x (⟨x, p⟩ ∈ prestatario ∧ x = “Gómez”)}
QBE- Consultas sobre una
relación
  la consulta “Determinar el nombre de todos los clientes que viven en la misma
ciudad que Santos”:
Datalog
es un lenguaje de consultas no procedimental basado en el
lenguaje de programación lógica Prolog.
Al igual que en el cálculo relacional, el usuario describe la
información deseada sin especificar el procedimiento concreto
para obtener esa información.
La sintaxis de Datalog recuerda la de Prolog.
el significado de los programas en Datalog se define de una
manera puramente declarativa, a diferencia de la semántica
más procedimental de Prolog, por lo que Datalog simplifica la
escritura de consultas sencillas y facilita la optimización de las
consultas.
Resumen
  El cálculo relacional de tuplas y el cálculo relacional de
dominios son lenguajes no procedi- mentales que representan
la potencia básica necesaria en un lenguaje de consultas
relacionales. El álgebra relacional básica es un lenguaje
procedimental que es equivalente en potencia a ambas formas
del cálculo relacional cuando se limitan a expresiones seguras.
  Los cálculos relacionales son lenguajes rígidos y formales que
no resultan adecuados para los usuarios ocasionales de los
sistemas de bases de datos. Los sistemas comerciales de bases
de datos, por tanto, usan lenguajes con más “azúcar
sintáctico”. Se han considerado dos lenguajes de consultas:
QBE y Datalog.
  QBE está basado en un paradigma visual: las consultas tienen
un aspecto muy parecido a tablas.
Resumen
  QBE y sus variantes se han hecho populares entre los usuarios poco
expertos de bases de datos, debido a la simplicidad intuitiva del
paradigma visual. El muy usado sistema de bases de datos Access de
Microsoft soporta una versión gráfica de QBE denominada GQBE.
Datalog procede de Prolog pero, a diferencia de éste, tiene una
semántica declarativa que hace que las consultas sencillas sean más
fáciles de formular y que la evaluación de las consultas resulte más
fácil de optimizar.
  La definición de las vistas resulta especialmente sencilla en Datalog, y
las vistas recursivas que permite Datalog hacen posible la formulación
de consultas, tales como el cierre transitivo, que no podrían
formularse sin usar la recursividad o la iteración. Sin embargo, en
Datalog no hay normas aceptadas para características importantes
como la agrupación y la agregación. Datalog sigue siendo,
principalmente, un lenguaje de investigación.
BIBLIOGRAFÍA
Ramez Elmasri Fundamentals of Database Systems, 7th Edition,
University of Texas at Arligton y otro . 2016 . http://noahc.me/
Fundamentals%20of%20Database%20Systems%20%287th%20editio
n%29.pdf

https://rua.ua.es/dspace/bitstream/10045/2990/1/
ApuntesBD1.pdf

http://bibliotecadigital.univalle.edu.co/bitstream/10893/10313/3/
Fundamentos%20de%20Bases%20de%20Datos.pdf

https://www.uoc.edu/masters/oficiales/img/913.pdf

Vous aimerez peut-être aussi