Bases de Datos y Sistemas de la Información – Facultad de Informática – Universidad Complutense de Madrid
Tema 4 : Lenguajes formales del modelo relacional
Se trata de los lenguajes formales de manipulación de datos que dan el soporte teórico a los lenguajes de consulta relacionales. Para ellos se parte de los esquemas de relaciones ya definidos.
Vamos a ver 3 lenguajes: 1 Álgebra relacional
2 Cálculo relacional de tuplas SQL 3 Cálculo relacional de dominios QBE
4.1 Álgebra relacional
Lenguaje de manipulación de datos DML (Data Management Language) de tipo procedimental (se dice cómo se deben hacer las cosas, no qué se desea obtener) que permite consultar la BD. Define operaciones sobre una o dos relaciones que se pueden componer entre ellas. El resultado es una nueva relación. No hay operaciones para modificar el contenido de una tabla, sólo se pueden crear tablas nuevas. Así, si se quiere definir la eliminación de una fila de un tabla T se define una nueva tabla T’ que contiene todas las filas de T salvo la borrada.
T’ expr(T)
Expr(T) será una expresión del álgebra relacional produciendo el resultado deseado. En álgebra relacional se parte de un esquema inicial y se van definiendo nuevas tablas. Cada nueva tabla se puede usar en la definición de la siguiente.
Operaciones fundamentales: selección, proyección, unión, diferencia de conjuntos, producto cartesiano y renombramiento. Agrupadas según:
- Operaciones entre conjuntos: unión, intersección, diferencia.
- Operaciones que eliminan partes de una relación: proyección (elimina columnas) y selección (elimina filas)
- Operación de renombramiento
- Combinación de tuplas de 2 relaciones: productos cartesianos, uniones naturales, productos, divisiones
- Extensiones del álgebra relacional.
4.1.1 Operaciones entre conjuntos: unión, intersección, diferencia Son operaciones binarias que requieren:
- En el momento de efectuar la operación se supone que el orden de las columnas es el mismo.
Def.:
Dados dos esquemas de relación R(A1,....,An), S(A1,....,An)
La operación unión de R y S , que se denota (R U S)(A1,....,An), produce un esquema cuyas instancias válidas pueden escribirse de la forma (r U s), con r instancia válida de R y s instancia válida de S.
La operación intersección de R y S , y se denota (R S)(A1,....,An), produce un esquema cuyas instancias válidas pueden escribirse de la forma (r s), con r instancia válida de R y s instancia válida de S.
La operación diferencia de R y S , y se denota (R \ S)(A1,....,An), produce un esquema cuyas instancias válidas pueden escribirse de la forma (r \s), con r instancia válida de R y s instancia válida de S.
Ej.: Partimos del siguiente esquema relacional:
Programadores(DNI, Nombre, Apellidos, Dirección, Teléfono) Analistas(DNI, Nombre, Apellidos, Dirección, Teléfono) Proyectos(Código, DNIDir, Descripción)
Distribución(CodigoPr, DNIEmp, Horas)
Distribución relaciona empleados con proyectos. Todos los empleados son programadores o
analistas (algunos las dos cosas). Ejemplos:
- Deseamos formar un esquema de relación con todos los empleados de la empresa. Solución:
Empleados Programadores
U
Analistas- Queremos conocer a los empleados que son a la vez programadores y analistas. Solución:
ProgramadoresYAnalistas Programadores
∩
Analistas - Empleados que son analistas pero no programadoresSolución:
SoloAnalistas Analistas
\
programadores- Empleados que son sólo Programadores o SoloAnalistas Solución:
SoloProgOSoloAnalistas SoloAnalistas
U
SoloProgramadores SoloProgOSoloAnalistas Empleados\
ProgramadoresYAnalistas4.1.2 Operaciones que eliminan partes de una relación: proyección y selección Proyección
Def:
Sea R(A1,..,An) un esquema de relación y r instancia válida de R. La operación de proyección de R respecto a los atributos B1, …,Bk con{ B1, …,Bk} { A1,..,An } se denota
B1, …,Bk(R) y produce un esquema de relación que tiene:- como atributos B1, …,Bk
- como instancias válidas los valores en B1, …,Bk de las instancias válidas de R. Ejemplo:
- Determinar los códigos de los proyectos en los que hay algún empleado trabajando. ProyectosEnMarcha
CodigoPr(Distribución)Obs.:
- Para que la expresión
lista1(
lista2(R)) tenga sentido debe ser lista1lista2. En este caso
lista1(
lista2(R)) =
lista1(R). SelecciónDef:
Sea R(A1,..,An) un esquema de relación y r instancia válida de R. La operación de selección de R respecto a una condición C se denota
C(R) y produce un esquema de relación:- Atributos: (A1,..,An)
- Instancias válidas: las de R tras eliminar las filas que no cumplan C.
C es la condición de selección es una fórmula construida de la siguiente forma: C:= <nombre_atributo> <op_comparación> <nombre_atributo>
C:= <nombre_atributo> <op_comparación> <constante> C:= C <AND> C
C:= C <OR> C C:= <NOT> C
Donde <op_comparacion> representa operadores booleanos, <, >, <=, >=, =. Ejs.:
- Códigos de todos los proyectos en los que trabaja el empleado con DNI 4 ProyectosDNI4
CódigoPr((DNIEmp=4)(Distribución))- DNI de los trabajadores que trabajan entre 10 y 20 horas (ambas cantidades inclusive) en algún proyecto.
Entre10Y20
DNIEmp(
(Horas>=10 and Horas<=20)(Distribución))- Código y descripción de los proyectos dirigidos por el empleado de DNI 4 o por el empleado de DNI 6
Proyectos4o6 <---
Código, Descripción(
(DNIDIR=4 OR DNIDir=6)(Proyectos)) Obs.:- Se verifica:
C1 (
C2(R)) ) =
C2 (
C1(R)) ) =
C1 AND C2 (R) 4.1.3 Operación de renombramientoDef.
Sea R(A1,..,An) esquema de relación. La operación de renombramiento se denota por
S(B1,...,Bn)(R) y produce un nuevo esquema de relación con: - Nombre: S- Atributos: (B1,...,Bn), donde cada Bi es un nuevo nombre de atributo con el mismo dominio que Ai.
- Instancias válidas: Las de R Obs.:
- Si sólo se quieren renombrar los atributos se puede omitir S, y si sólo se quiere cambiar el nombre de la relación se puede omitir (B1,...,Bn).
- La notación S R también cambia el nombre a un esquema de relación. Ej.:
- DNI’s de empleados que no trabajan ni dirigen ningún proyecto: DNIEmpleados
DNI(ProgramadoresU
Analistas) DNIEmpleadosActivos
(DNI)(
DNIEmp(Distribución))
U
(DNI)(
DNIDir(Proyectos))
DNIEmpleadosNoActivos DNIEmpleados
\
DNIEmpleadosActivos 4.1.4 Operaciones de combinación de filasProducto Cartesiano Def.:
Dadas dos relaciones R1, R2 esquemas de relación , la operación producto Cartesiano de R1, se denota por R1 x R2 y se define como:
- Atributos: (atrib. de R1)
U
(atrib. de R2). Si tienen algún nombre de atributo A común, este se convierte en R1.A, R2.A- Instancias: Son de la forma r1xr2, con r1 instancia de R1, r2 instancia de R2. Ej.:
Queremos conocer los nombres, direcciones y teléfonos de los empleados que dirigen algún proyecto:
1 Datos de todos los empleados
Empleados Programadores
U
Analistas
Empleados(DNI, Nombre,Dirección,Teléfono)
2 Hacemos el producto cartesiano con los DNI’s de los directores de proyecto:
DNIDirPorEmpleados
DNIDir(Proyectos) x Empleados
3 Nos quedamos con los datos de los directores de proyecto
DatosDirProyecto
Nombre, Dirección, Teléfono(
DNIDir = DNI(DNIDirPorEmpleados))
DatosDirProyecto(Nombre,Dirección,Teléfono)Join (reunión) Def.:
Se define la reunión de R1 y R2 ( R1 R2) como: R1 R2 =
C(R1 x R2)Donde c es una conjunción de operaciones booleanas: C= C1 AND C2 AND C3 ...
Ej.:
Queremos conocer los nombres, direcciones y teléfonos de los empleados que dirigen algún proyecto:
1. Datos de todos los empleados
Empleados Programadores
U
Analistas
Empleados(DNI, Nombre,Dirección,Teléfono)
2. Datos de los directores de proyecto
DatosDirProyecto
Nombre, Dirección, Teléfono( Proyectos
Empleados)
Ej.:Obtener los nombres de todos los empleados que trabajan en algún proyecto más de 10 horas: Dos formas:
NombresTrabajanMasde10
Nombre(Empleados
Distribución)
Resultado Nombre Herminia Calixto Teodora EvaristoEquijoin (equirreunión) Def.:
Se llaman operación Equijoin a todo join cuya condición es una conjunción de igualdades. Obs.:
Dada una instancia válida de un equijoin con condición C, se verifica que todas las tuplas tienen valores repetidos para los atributos de la condición C.
Ej.: R1(A,B) A B C DNIDir=DNI DNIEmp=DNI AND Horas>10 C
1 B1 2 B2 2 B3 R2(C,D) C D 2 D1 2 D2 R1 |x|(A=C) R2 A B C D 2 B2 2 D1 2 B2 2 D2 2 B3 2 D1 2 B3 2 D2 Join natural Def.:
Sean R1(A1,...,An) y R2(B1,...,Bm) dos esquemas de relación y (C1,...,Cj) la lista de los atributos comunes a ambas relaciones.
La operación join natural (reunión natural) de R1 y R2, Produce un esquema de relación R1 R2 tal que:
- Atributos: { A1,...,An } U { B1,...,Bm } (los atributos comunes sólo aparecen una vez).
- Instancias válidas: Dada r1 instancia válida de R1 y r2 de R2, se obtiene una instancia válida de la unión natural combinando todas las tuplas u de r1 y v de r2 tales que u y v coinciden sobre { C1,...,Cj }.
Ej.:
Datos personales de los directores de proyecto. DNIDirPro
(DNI)(
DNIDir(Proyectos))
DatosDirProyecto DNIDirPro (Programadores U Analistas) Teorema:
Sean R1 y R2 dos esquemas de relación con atributos comunes (C1,...,Cj), Donde los atributos de A son (A1,...,An, C1,...,Cj)
Y los de B (B1,...,Bm, C1,...,Cj)
Entonces R1 R2 = (salvo el orden de los atributos)
(A1,A2,...,An,B1,...,Bm,C1,...,Cj)(
A1,A2,...,An,B1,...,Bm,R1.C1,...,R1.Cj(
(R1.C1 = R2.C2 AND ,...,AND R1.Cj=R2.Cj)(R1 x R2) )) Ej.: R1(A,B) A B 1 B1 2 B2 2 B3 R2(C,D)A C 2 C1 2 C2 R1 x R2 R1.A B R2.A C 1 B1 2 C1 1 B1 2 C2 2 B2 2 D1 2 B2 2 D2 2 B3 2 D1 2 B3 2 D2
(R1.A=R2.A)(R1 x R2 ) R1.A B R2.A C 2 B2 2 D1 2 B2 2 D2 2 B3 2 D1 2 B3 2 D2(A,B,C) (
(R1.A,B,C)(
(R1.A=R2.A)(R1 x R2 )) A B C 2 B2 D1 2 B2 D2 2 B3 D1 2 B3 D2 Ej.:Obtener los datos de todos datos de los empleados que comparten domicilio con otro empleado. Empleados(dni,nombre,domicilio)
DNI Nombre Domicilio
1 Aniceto Jazmín 1
2 Eulalia Rosa 3
3 Teodora Clavel 2
4 Macario Rosa 3
5 Anacleto Jazmín 1
E1.DNI<>E2.DNI AND E1.Domicilio=E2.Domicilio(E1(Empleados) x E2(Empleados)) Observación- Los expresiones booleanas NULL op X, X op NULL siendo op operador booleano son falsos (incluso el caso NULL = NULL).
- Como resultado de lo anterior puede ser que alguna instancia válida de R1 |x| R1 tenga menos tuplas que la correspondiente instancia de R1.
Ej.: Analistas |x| Analistas DNI 4 5 6
4.1.5 Divisiones
Idea: Se utilizan cuando se busca que algún atributo de una relación tome (al menos) todos los valores de otro atributo en otra relación.
Def.:
Sea R(A1,...,An), S(B1,...,Bm) con {B1,....,Bm}{A1,...,An}. Entonces la operación división RS produce un esquema de relación
Atributos: {C1,...,Cj} = {A1,...,An}\{B1,...,Bm}
Instancias válidas: Dada r instancia válida de R, s inst. válida de S, una tupla u está en R S cuando para todo v de S, la tupla que se obtiene al unir los valores de u y v está en R. Ej.: T = RS, STR R A B A1 B1 A2 B1 A3 B1 A4 B1 A1 B2 A3 B2 A2 B3 A3 B3 A1 B4 A2 B4 A3 B4 S A A1 A2 A3 T B B1 B4
Ej.: Determinar los datos personales de los empleados que trabajan en todos los proyectos que trabaja el empleado Jacinto
DatosJacinto
(
Nombre = Jacinto)(empleados))
ProyectosJacinto
(
codigoPr)(( DatosJacincto |x|(
DNI=DNIEmp)(Distribución))
DNIProyecto
(
codigoPr, DNIEmp) (Distribución)
DNIBuscados DNIProyecto ProyectosJacinto
DatosBuscados
(DNI)(DNIBuscados) |x| empleados
DefiniciónUn lenguaje que permita expresar todas las operaciones del álgebra relacional se llama
Observación:
No todas las consultas imaginables se pueden representar en el álgebra relacional. Por ejemplo no se pueden expresar las que tienen relación con las operaciones de recuento de filas tipo ¿En cuántos proyectos trabaja Bertoldo? Veremos que en SQL sí se pueden expresar estas consultas. Existe una variante del álgebra relacional, llamada álgebra relacional extendida que sí considera el caso de los recuentos.
4.1.5 Álgebra Relacional Extendida
Al considerar el caso de contar vemos en seguida que tenemos que esto conduce al caso de las repeticiones. Por ejemplo, considerar la consulta ¿En cuántos proyectos trabaja Bertoldo? tenemos que una forma natural de hacerlo es considerar la tabla
distribución(codPr,DniEmp,Horas) y contar el número de repeticiones del DNI de Bertoldo
(otra forma sería quedarse con los proyectos de Bertoldo y contarlos, pero la forma sugerida aquí también es natural). Pero si consideramos que las consultas devuelven conjuntos entonces nos saldrá siempre el valor 0 o 1 (0 si no participa en ningún proyecto, 1 si participa en 1 o más). Para poder contar valores repetidos debemos cambiar la estructura soporte de las relaciones de conjuntos a multiconjuntos. En el caso de los multiconjuntos cada elemento tiene un cardinal (número de repeticiones). El orden, como en el caso de los conjuntos, no importa. ERA (Extended Relational Algebra, definida por primera vez en ) se define sobre multiconjuntos. Incluye las mismas operaciones que el Álgebra Relacional, además de 3 operaciones nuevas:
La proyección extendida
π
α E se define de forma análoga a la proyección normal, pero ahora α enlugar de un conjunto de atributos es una secuencia de expresiones sobre atributos,
El operador de unicidad δ E elimina los repetidos del multiconjunto E. El cardinal de los elementos en E queda a uno.
El operador de agrupación
Γ
α,f E donde α es una lista de atributos por la que se ordena, y f es una tupla de funciones de agrupación que se aplica sobre cada grupo considerado como multiconjunto. Cada valor distinto de α da lugar a un multiconjunto de tuplas que incluye todas los atributos de E que no están en α. El resultado es una sola tupla por cada valor distinto de α en E. Esta tupla incluye los atributos de α seguida por el valor indicado por f. Se suele suponer que f es de la forma (A1 f1,…, An fn,…), indicando que la función de agrupación genera nuevos atributos A1,…An. El valor del atributo Ai para cada multiconjunto de agrupación se obtiene aplicando fi.4.2 Cálculo relacional de tuplas (TRC)
Lenguaje no procedimental.Forma general de una consulta en cálculo relacional de tuplas: {t | P(t) } = el conjunto de todas las tuplas que cumplen la condición P. P es una fórmula escrita en lógica de primer orden.
Ejemplo
Datos personales del empleado con DNI 3:
{t | ((t Programadores) (t Analistas)) (t.DNI = 3]) }
4.2.1 Fórmulas en el cálculo relacional de tuplas Pueden ser átomos y fórmulas compuestas.
Átomos.
Los átomos tienen una de las siguientes formas:
1.- x R. Con x una variable de tupla y R un esquema de relación. Una variable de tupla representa un fila genérica de una instancia válida de R.
2.- t.A p s.B, donde t y s son variables de tupla, A es un atributo de la relación en la que
está definida la variable de tupla t, B es un atributo de la relación en la que está definida la variable de tupla s, y op es un operador de comparación (<,>,= ...)
El dominio de los atributos A y B debe ser compatible.
Obs.: Con t[A] o t.A denotamos el valor de la tupla t en el atributo A.
3.- t.A op c, c op t.A, donde t variable de tupla, A un atributo de la relación en la que está definida la variable de tupla t, c un valor del dominio de A y op es un operador de comparación (<,>,= ...).
Fórmulas compuestas
Para construir una fórmula se usan las siguientes reglas: 1.- Las fórmulas básicas son fórmulas.
2.- Si F es una fórmula (F) y F también son fórmulas.
3.- Si F1 y F2 son formulas entonces F1 F2, F1F2 y F1F2 también son fórmulas. 4.- Se pueden usar y para ligar las variables de tupla. Si F(t) es una fórmula en la que aparece libre la variable de tupla t, entonces las siguientes también son fórmulas:
tR, P(t) tR, P(t)
Una variable de tupla que está cuantificada se dice ligada cuando aparece en una fórmula afectada por un cuantificador (,).
Ejemplos
- Deseamos formar un esquema de relación con todos los empleados de la empresa.
{t | (t
Programadores)
(t
Analistas)} t es libre- Queremos conocer a los empleados que son a la vez programadores y analistas.
{t | (t
Programadores)
(t
Analistas)} DNI: 4- Empleados que son analistas no programadores (SoloAnalistas Analistas \ Programadores) {t | (t
Analistas)
(t
Programadores)} DNI : 5,6,7- Empleados que son sólo Programadores o SoloAnalistas: {t | ((t
Programadores)
(t
Analistas))
Observación: Para que tenga sentido una consulta en el cálculo relacional de tuplas de la forma {t | P(t) } t debe ser una variable libre.
4.2.3 Expresión de operaciones del álgebra relacional en el cálculo relacional de tuplas Selección
Ej:
- proyectos en los que trabaja el empleado con DNI 4 ProyectosDNI4 ((DNIEmp=4)(Distribución)) {t | (t Distribución) (t.DNIEmp = 4)}
- Trabajadores que trabajan entre 10 y 20 horas (ambas cantidades inclusive) en algún proyecto. Entre10Y20 (Horas>=10 and Horas<=20)(Distribución)
DNI’s: 1,4,5
{t | (t Distribución) (t.Horas >=10) (t.Horas <=20)}
- Proyectos dirigidos por el empleado de DNI 4 o por el empleado de DNI 6 Proyectos4o6
Código, Descripción((DNIDIR=4 OR DNIDir=6)(Proyectos)) Respuesta: Códigos P1, P2, P5 {t | (t Distribución) ((t.DNIDir = 4) (t.DNIDir=6))} Proyección Ej:- Determinar los códigos de los proyectos en los que hay algún empleado trabajando. ProyectosEnMarcha
CodigoPr(Distribución){t | p Distribucion( t.CodigoPr = p.CodigoPr)} Observación
Cuando se quiere hacer que la consulta {t | P(t)}devuelva tuplas de un nuevo esquema de relación, no se incluye ningún átomo de la forma t r en la condición. Así se supone que t es una tupla de un nuevo esquema de relación, cuyos atributos son los que aparecen en P(t) en expresiones de la forma t.A.
Producto Cartesiano
Queremos conocer los nombres, direcciones y teléfonos de los empleados que dirigen algún proyecto:
1.1 Datos de todos los empleados
Empleados Programadores
U
Analistas1.2 Hacemos el producto cartesiano con los DNI’s de los directores de proyecto: DNIDirPorEmpleados
DNIDir(Proyectos) x EmpleadosDNIDirPorEmpleados (DNIDir, DNI, Nombre,Dirección,Teléfono)
1.3 Nos quedamos con los datos de los directores de proyecto
DatosDirProyecto
Nombre, Dirección, Teléfono( DNIDir = DNI(DNIDirPorEmpleados))DatosDirProyecto(Nombre,Dirección,Teléfono)
{t | u(
((u Analistas) (u Programadores))
(vProyectos( v.DNIDir = u.DNI) (t.Nombre = u.Nombre) (t.Dirección = u.Dirección) (t.teléfono = u.teléfono) ) } Join natural R1(A,B) R2(A,C,D)
{t | u R1( v R2 (u.A = v.A t.A = u.A t.B = u.B t.C = v.C t.D = v.D))}
División
Empleados que trabajan en los mismos proyectos que Jacinto {t | (t Programadores t Analistas)
p (p Distribucion j (( j Programadores j Analistas) j.nombre = Jacinto p.DNIEmp = j.DNI )
u ((u Distribucion ) t.DNI = u.DNIEmp u.CodigoPr = p.CodigoPr) )
}
4.2.4 Significado de una fórmula. Fórmulas seguras.
Para que tengan una fórmula {t | P(t)} del calculo relacional de tuplas esté bien definida debe cumplir:
1. Todas las variables deben estar ligadas, exceptuando t que es libre.
2. Todas las variables que aparezcan en la fórmula-condición deben pertenecer a un esquema de relación, menos quizá, t.
3. La fórmula debe ser segura. Fórmulas seguras
Es posible que el resultado de una expresión sea infinito, por ejemplo: {t | (t R)}
Para evitar esto se introduce el concepto de dominio: dom(P) es el conjunto de todos los valores a los que P hace referencia, es decir los valores de las instancias de relaciones que aparecen en P.
Def.
Se dice que una consulta {t | P(t)} es segura si:
- todos los valores que aparecen en la respuesta son valores de dom(P).
- Para cada subexpresión de P de la forma R(p(R)), si un valor r asignado a la variable R hace cierto p(r), entonces r contiene sólo valores en Dom(P).
- Para cada subexpresión de P de la forma R(p(R)), si un valor r asignado a la variable R contiene valores fuera de dom(P), entonces no hace cierto p(r).
Ejemplo:
La expresión {t | (t R)} no es segura: dom( (t R)) es el conjunto de todos los valores
que aparecen en R. Sin embargo, es posible tener una tupla t en la respuesta que contenga valores que no aparezcan en R.
Teorema
La propiedad de ser una consulta segura en el cálculo relacional de tuplas es indecidible. ¿Solución?
Aunque no hay un criterio para dividir el conjunto de fórmulas entre seguras y no seguras, sí hay criterios correctos pero incompletos para saber si una fórmula es segura. Es decir si el criterio dice que una fórmula es segura lo es, pero si dice que no puede que lo sea o que no lo sea.
4.3 Cálculo relacional de dominios
El cálculo relacional de dominios utiliza variables de dominio que toman sus valores del dominio de un atributo, en lugar de tomarlos de una tupla completa.
4.3.1.1 Forma general de una consulta
{<x1,....,xn> | P(x1, x2, ..., xn)} con xi variables de dominio
Ejemplo
- códigos de proyectos en los que trabaja el empleado con DNI 4 ::REVISAR:: ProyectosDNI4 <-- ((DNIEmp=4)
(Distribución))
{t | (t Distribución) (t[DNIEmp] = 4)}
{<cod> | desc, dni((<cod,desc,dni> Proyectos) dni = 4) }
{<cod> | desc (<cod,desc, 4>
Distribución)
}
Obs.:
En el cálculo relacional de dominios se supone un orden predeterminado para los atributos de cada esquema.
4.3.1.2 Fórmulas en el cálculo relacional de dominios Pueden ser
- átomos
- fórmulas compuestas - átomos
1.- < x1, ..., xn > r donde r es una relación con n atributos donde xi son variables de dominio o constantes de dominio.
2.- x y, donde x y y son variables de dominio y es un operador de comparación (<,>,= ...). 3.- x c, donde x variable de dominio, c un valor del dominio de x y es un operador de comparación (<,>,= ...).
Fórmulas Compuestas - Un átomo es una fórmula.
Si F es una fórmula (F) y F también son fórmulas.
Si F1 y F2 son formulas entonces F1 F2, F1F2 y F1F2 también son fórmulas.
Se pueden usar y para ligar las variables de tupla. Si F(t) es una fórmula en la que aparece libre la variable de dominio x, entonces las siguientes también son fórmulas:
x, P(x) x, P(x)
Una variable de tupla que está cuantificada se dice ligada cuando aparece en una fórmula afectada por un cuantificador (,).
4.3.1.2.1 Ejemplos
- Deseamos formar un esquema de relación con todos los empleados de la empresa.
{<dni,nom,dir,tel> | < dni,nom,dir,tel>
(Programadores
Analistas)} Selección- Trabajadores que trabajan entre 10 y 20 horas (ambas cantidades inclusive) en algún proyecto.
Entre10Y20 <--
(Horas>=10 and Horas<=20)(Distribución)
DNI’s: 1,4,5
{t | (t
Distribución)
(t[Horas]>=10) (t[Horas]<=20)}
{<dni> | c,h(<c,dni,h>
Distribución
h >=10 h <=20)}
Producto CartesianoQueremos conocer los nombres, direcciones y teléfonos de los empleados que dirigen algún proyecto:
1.1 Datos de todos los empleados
Empleados Programadores U Analistas
Empleados(DNI, Nombre,Dirección,Teléfono)
1.2 Hacemos el producto cartesiano con los DNI’s de los directores de proyecto:
DNIDirPorEmpleados
DNIDir(Proyectos) x Empleados
DNIDirPorEmpleados (DNIDir, DNI, Nombre,Dirección,Teléfono)
1.3 Nos quedamos con los datos de los directores de proyecto
DatosDirProyecto
Nombre, Dirección, Teléfono(
DNIDir = DNI(DNIDirPorEmpleados))
DatosDirProyecto(Nombre,Dirección,Teléfono){t | u(
((u Analistas) (u Programadores)) (t[Nombre] = u[Nombre]) (t[Dirección] = u[Dirección]) (t[teléfono] = u[teléfono])
(vProyectos( v[DNIDir] = u[DNI]) )
}
{<n,dir,t> | dni(
((<dni,n,dir,t> Analistas) (<dni,n,dir,t> Programadores))
(cod,descr (<cod,descr,dni>Proyectos) }
4.3.1.3 Significado de una fórmula. Fórmulas seguras.
Para que tengan una fórmula {<x1,...,xn>| P(<x1,...,xn>)} del calculo relacional de dominios tenga significado debe cumplir:
1. Todas la variables deben estar ligadas, exceptuando <x1,...,xn> que es libre. 2. La fórmula debe ser segura.
Fórmulas seguras:
Son fórmulas no-seguras las que contienen alguna subfórmula capaz de generar un número infinito de tuplas.
{ <dni,nom,dir,tel> | (<dni,nom,dir,tel> programadores) }
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))}
donde P es una fórmula que implica a x y a z. Se puede probar la primera parte de la fórmula,
y (<x, y> r), tomando en consideración sólo los valores de r. Sin embargo, para probar 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. Dado que todas las relaciones son finitas, no aparece en r un número infinito de valores. Por tanto, no resulta posible en general probar 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. Dado que todas las relaciones son finitas, no aparece en r un número infinito de valores. Por tanto, no es posible en general probar la segunda parte de la fórmula sin tomar en consideración un número infinito de valores de z. En vez de eso, se añaden ligaduras para prohibir expresiones como la anterior.
Condiciones de seguridad: Se dice que la expresión
{<x1, x2, ..., xn> | P(x1, x2, ..., xn)}
es segura si se cumplen todas las condiciones siguientes:
1. Todos los valores que aparecen en las tuplas de la expresión son valores de dom(P). 2. 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 en dom(P1) tal que P1(x) es verdadero.
3. 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 verdadero para todos los valores x de dom(P1).
Teorema
La seguridad de una fórmula en el cálculo de dominios es indecidible.
Teorema
Es equivalente el poder expresivo de - el álgebra relacional
- el cálculo relacional de tuplas para fórmulas seguras - el cálculo relacional de dominios para fórmulas seguras