Está en la página 1de 31

23/03/2021

1
23/03/2021

Todo modelo de datos debe definir un lenguaje de definición de datos


para crear las estructuras donde se almacenará la información y un
lenguaje de manipulación de datos con el que acceder y gestionar esa
información.

Codd eligió como núcleo de los lenguajes que se desarrollaran para el


modelo relacional el álgebra de conjuntos y el cálculo de predicados de
primer orden. Del primero salió el álgebra relacional, del segundo los
cálculos relacionales. Y en todos ellos, en mayor o menor medida se basa
SQL.

2
23/03/2021

Codd propuso estos tres lenguajes como base teórica de cualquier


lenguaje que quisiera cumplir con los requisitos formales del modelo. Ni
AR ni los CR pueden ser explotados comercialmente, al menos tal y como
los definió Codd, porque adolecen de falta de operadores: carecen de
operadores aritméticos simples (sumas, restas, etc.), o de manipulación
de cadenas de caracteres, por poner dos ejemplos “escandalosos”. Tan
sólo constituyen una declaración de los mínimos requeridos para
cualquier lenguaje de manipulación de datos que se quiera etiquetar a sí
mismo como “relacional”. En otras palabras, cualquier lenguaje de
manipulación y definición de datos en bases de datos relacionales ha de
poseer la potencia suficiente como para “hacer”, como mínimo, lo que
pueden “hacer” los lenguajes de Codd.

3
23/03/2021

El álgebra relacional recibe este nombre precisamente por su carácter


algebraico: incluye un conjunto de operadores cuyos operandos son
relaciones y el resultado de la operación es otra relación, del mismo modo
que cuando sumamos dos enteros obtenemos otro número entero.

4
23/03/2021

Antes de continuar debemos definir una serie de términos que serán de


uso habitual en el tema. Evidentemente, partimos de las definiciones
propias del modelo:

relación: el AR hace uso del orden de las componentes de las tuplas para definir
operadores y propiedades de los operadores. En realidad, se trata de retomar la
definición original de la relación matemática como el subconjunto de un
producto cartesiano de n dominios, de tal forma que las tuplas resultado de ese
producto cumplían y cumplen que

Las tuplas son listas de valores (conjunto ordenado) tal que el i-


ésimo valor pertenece al i-ésimo dominio.

Vamos a combinar la definición anterior de tupla con la adaptación que en su


momento introdujimos a la relación matemática para adecuarla al objetivo final
que es una base de datos. Utilizaremos al mismo tiempo los nombres de atributos
y el orden de las componentes en una tupla:

El conjunto de nombres de atributos es un conjunto ordenado.


Las tuplas son listas de valores (conjunto ordenado) tal que el i-
ésimo valor pertenece al i-ésimo dominio asociado al i-ésimo nombre de

5
23/03/2021

atributo.

A partir de ahora, los operadores pueden utilizar tanto el nombre simbólico de un atributo
como su orden dentro de la tupla.

esquema de relación: es la descripción formal de la relación con sus atributos y dominios


asociados. En realidad, se aplica únicamente a las relaciones nominadas, aquellas
descritas en el esquema lógico relacional.
R( A1:D1, A2:D2, ..., An:Dn )
donde:
R es el nombre de la relación
Ai es el nombre del atributo
Di es el nombre del dominio asociado a Ai

El nombre cualificado de atributo es, por decirlo así, el nombre completo de un


atributo, por ejemplo, R.Ai, el atributo Ai de la relación R. Su uso evita la
ambigüedad de dos atributos en dos tablas distintas con el mismo nombre.

En general, nos referimos a los atributos por su nombre sin especificar la relación
a la que pertenecen. No obstante, es habitual que, en distintas relaciones y, sobre
todo, en las relaciones derivadas (los resultados de operar con relaciones
nominadas), nos podamos encontrar nombres de atributo coincidentes en
relaciones distintas. La forma de diferenciar unos de otros es utilizar los nombres
cualificados: “alumno.nombre”, “asignatura.nombre”.

En definitiva, se pueden utilizar indistintamente, siempre y cuando no se


produzcan ambigüedades, las dos formas ya conocidas de referirse a un atributo:
nombre cualificado: R.Ai
nombre no cualificado: Ai

El alias de relación es un nombre alternativo para una relación. Dada una


relación R se define un alias mediante la declaración:

define alias S para R

Entonces la relación puede referenciarse tanto por R como por S, y los nombres
cualificados de atributos R.Ai o S.Ai.

5
23/03/2021

La relación nominada es toda relación definida en el esquema lógico


relacional. En otras palabras, las que constituyen nuestra base de datos.

Por contra, la relación derivada es aquella que se obtiene como resultado de


una expresión del Álgebra Relacional.

Una relación derivada no tiene nombre ni alias. Así pues, los nombres de los
atributos de ésta se obtendrán a partir de los nombres cualificados de atributos de
las relaciones operando, y si existe ambigüedad se utilizarán los alias. Las reglas
que rigen en los operadores para la asignación de nombres a los atributos de
relaciones derivadas se verán con cada uno de ellos.

6
23/03/2021

Dos relaciones son compatibles si el grado de ambas es el mismo y los dominios


asociados a los i-ésimos atributos de cada una son iguales.
R( A1:D1, A2:D2, ..., An:Dn )
S( B1:E1, B2:E2, ..., Bm:Em )

R y S son compatibles si y sólo si:


1) n = m
2) i Di = Ei (1  i  n)

Dicho de otra forma, el número de atributos ha de ser el mismo en ambas


relaciones y, además, los dominios han de ser los mismos para atributos de la
misma posición.

7
23/03/2021

Este es un ejemplo de dos relaciones compatibles, con el mismo grado


(3) y los mismos dominios en las mismas posiciones. Esta propiedad es
necesaria para operar con unión, intersección y diferencia.

8
23/03/2021

Este es un el conjunto inicial de operadores del álgebra relacional. Lo


marcado en rojo es la notación estándar; lo no marcado, la que vamos a
utilizar por comodidad.

Si, por ejemplo, nosotros vamos a escribir:

PERIODICOS donde ciudad='Alicante' [periodico, ciudad]

En notación estándar:

πperiodico,ciudad(σciudad='Alicante'(PERIODICO))

Con la necesaria distancia, la notación que proponemos se acerca más a


un procedimiento. Nuestro objetivo no tanto aprender el lenguaje o
procesarlo en un compilador, como adquirir destreza en el manejo de
relaciones y tuplas.

9
23/03/2021

Una característica importante, derivada del marco teórico que estamos


desarrollando, es que ninguna operación en AR produce tuplas
duplicadas. No tiene nada que ver con la realidad de un servidor de base
de datos real, en este es más que normal que se produzcan esos
derivados. Aquí estamos trabajando con un artefacto matemático con sus
propiedades, derivadas del conjunto.

Dicho mal y pronto, es como si todo lo que escribiéramos en AR se


tradujera a SQL como select distinct...

10
23/03/2021

Vamos a "jugar" con el esquema que presentamos aquí. El título es


"periodismo deportivo".

Tenemos periódicos y periodistas, los periodistas trabajas en periódicos


(PERIODISTA.periódico). Los periódicos se identifican por su nombre
(PERIODICO.periódico; Marca, As, El Mundo, Información...).

También tenemos equipos (de fútbol, vamos a suponer). Los periodistas


se relacionan con los equipos, cada periodista es fanático de un único
equipo (PERIODISTA.equipo). Los equipos se identifican por su nombre
(EQUIPO.nombre; Hércules, Elche C.F., Real Madrid...).

Los equipos juegan partidos. Los partidos se identifican por el equipo


local y la fecha (PARTIDOS.fecha, PARTIDOS.local). Los partidos reciben
a un equipo visitante (PARTIDOS.visitante).

Por último, los periodistas asisten a los partidos (VADEGORRA.dni,


VADEGORRA.fecha, VADEGORRA.local).

11
23/03/2021

Una de las expresiones más simples en SQL es select * from... En AR es


incluso más conciso, se pone el nombre de la tabla y la evaluación
obtiene todo el contenido, todas las filas.

PARTIDOS, en AR, es equivalente a select * from partidos en SQL.

Vamos a insistir mucho en qué tenemos en cada punto de la expresión.


Justo al principio no tenemos nada; al evaluar PARTIDOS, todas las filas
y columnas de PARTIDOS. Como es el final de la expresión, este es el
resultado de la orden en AR.

12
23/03/2021

Ya no queremos todas las columnas, solo la fecha. Utilizamos la


proyección. Nuevamente, al empezar no tenemos nada, después
obtenemos todas las filas y columnas de PARTIDOS y, finalmente, nos
quedamos solo con la columna "fecha".

13
23/03/2021

Ahora añadimos una selección, un filtrado de filas. Al principio no tenemos


nada; pasamos a disponer de toda la información de la tabla PARTIDOS;
a continuación, quitamos todas las filas que no sean del Hércules como
visitante y, finalmente, quitamos la columna "visitante" y obtenemos
"fecha" y "local".

14
23/03/2021

Es el mismo ejemplo de antes, pero en AR no pasa como en SQL que


tenemos un orden estricto para select... from... where..., podemos ordenar
los operadores según nos convenga. Recuerda que AR es un lenguaje
procedimental, nosotros establecemos cómo se obtiene el resultado al
definir la secuencia de ejecución de los operadores.

Por eso, en principio, podemos hacer primero la proyección (filtrado de


columnas) y después la selección (filtrado de filas). Pero no siempre,
depende de los resultados intermedios. Este ejemplo es erróneo.

Cuando ya tenemos toda la información almacenada de PARTIDOS, lo


primero que hacemos es desechar la columna "visitante", ya no
disponemos de ella, la hemos eliminado en el resultado intermedio.
Después pretendemos filtrar, precisamente, por PARTIDOS.visitante =
'Hércules'; obviamente, no podemos, esa información ya no existe.

Por tanto, el orden de ejecución es importante, a veces es necesario


colocar los operadores en una secuencia concreta. En otros casos, como
veremos, no, de ahí la importancia de conocer en todo momento con qué
columnas estamos trabajando.

15
23/03/2021

Otra diferencia entre AR y SQL es que el primero permite utilizar el mismo


operador varias veces. Aquí hemos añadido una condición más al filtrado
de filas. Fíjate que siempre se mantiene el orden correcto de los
operadores.

16
23/03/2021

Pero también podemos "compactar" la orden y utilizar conectivas lógicas,


AND en este caso y que nosotros hemos traducido por "Y".

17
23/03/2021

Algunos operadores necesitan que se den unas condiciones previas para


poder ejecutarlos. Unión, intersección y diferencia de conjuntos precisan
que los operandos a izquierda y derecha sean relaciones compatibles
(igual grado e iguales dominios en las mismas posiciones de la tupla).

La concatenación natural busca atributos comunes entre las dos


relaciones que actuarán como operandos. Atributos comunes son
aquellos que se llaman igual y trabajan sobre los mismos dominios. Por
ejemplo, PERIODICO.periodico y PERIODISTA.periodico.

PERIODICO ⋈ PERIODISTA es lo mismo que

select pco.*, psta.dni, psta.nombre, psta.estudios


from PERIODICO pco, PERIODISTA psta
where pco.periódico=psta.periódico

Si no hay tales atributos comunes, el resultado es un producto


cartesiano.

19
23/03/2021

Ahora vamos a utilizar otros operadores y necesitamos alguna aclaración


previa.

Hay unos operadores que se definen a partir de otros. Aquellos que se


definen por sí mismos (unión, diferencia, producto, selección y
proyección) se denominan primitivas. Estos dos, intersección y
concatenación natural son operadores derivados de las primitivas.

Por ejemplo, la intersección es, en realidad, una secuencia de dos


diferencias.

Caso aparte, lo justificaremos ahora después, es la concatenación


natural. Este operador es equivalente a una secuencia de producto,
selección y proyección. Si nos fijamos bien, es equivalente a una consulta
sobre dos tablas que explicita la condición que igual columnas de una y
otra tabla.

20
23/03/2021

Los operadores unión, intersección, producto y concatenación


natural son conmutativos y asociativos en cuanto a la información
resultante. No así en cuanto a la estructura, a los nombres cualificados de
las columnas.

No es lo mismo R  S que S  R, si miramos los nombres de las


columnas, pero sí el contenido de las filas resultado. Si R(A,B,C) y
S(D,E,F) la tabla resultado de R  S tendrá las columnas R.A, R.B y
R.C. Si fuera S  R las columnas serían S.D, S.E y S.F.

Si R = {(1,1,1),(2,2,2)} y S = {(3,3,3)}, en ambos casos el resultado sería


{(1,1,1),(2,2,2),(3,3,3)}. Por esto es por lo que decimos que la unión es
conmutativa.

21
23/03/2021

Ahora queremos el nombre de los equipos que nunca han jugado como
equipo local. Desde el punto de vista relacional es bastante sencillo: de
todos los equipos existentes quitar aquellos que aparecen en
PARTIDO.local. O sea, una diferencia de conjuntos.

Pero hemos de tener cuidado con el operador diferencia, tiene un


requisito: los operandos deben ser compatibles.

Por eso, esta expresión es errónea. Lo primero que obtenemos son las
columnas y todas las filas de EQUIPO. A continuación, solo nos
quedamos con EQUIPO.nombre. Y aquí está fallo: si la relación de la
izquierda de la diferencia es esa columna, a la derecha estamos
intentando restar una tabla con 3 columnas; las tablas no son compatibles
y no se pueden restar.

22
23/03/2021

La solución es sencilla: poner paréntesis. Eso altera el orden de


evaluación de la expresión, realizando primero lo que está entre
paréntesis y guardándose ese resultado para cuando haga falta, que será
cuando haya que ejecutar la diferencia de conjuntos.

La diferencia de conjunto no está implementada en todos los servidores


—en Oracle disponemos del comando MINUS, pero no en MariaDB o
MySQL—. En MariaDB se puede simular usando el operador NOT IN,
como podemos ver en la orden SQL de la parte inferior de la diapositiva.

Ahora que empezamos a trabajar con operadores binarios, cobra


importancia la estructura de los resultados. En la diferencia de conjuntos
(R-S)=T, siendo R(a, b) y S(c, d) en el resultado nos encontraremos será
T(R.a, R.b). Ocurre lo mismo con unión e intersección.

23
23/03/2021

En cuanto a la concatenación natural, primero veamos lo que queremos


conseguir. Tenemos una tabla PROFESOR y otra DEPARTAMENTO.
Ambas se relacionan mediante la igualdad entre PROFESOR.cod y
DEPARTAMENTO.cod. De ahí que un join de esas dos tablas obtendría
toda la información de los profesores y del departamento en el que
trabajan.

El dato importante aquí es que hay dos columnas comunes, con el mismo
nombre y, suponemos, con el mismo dominio: PROFESOR.cod y
DEPARTAMENTO.cod

24
23/03/2021

De ahí que yo pueda utilizar la concatenación natural obtener ese


resultado. En SQL esto se puede resolver mediante un join normal o
directamente —en MariaDB al menos— con el operador NATURAL JOIN.

25
23/03/2021

Sin embargo, hemos de tener cuidado con si hay más de un par de


columnas comunes. En este caso, tenemos PROFESOR.cod y
DEPARTAMENTO.cod, y PROFESOR.nom y DEPARTAMENTO.nom. La
concatenación natural va a usar las dos igualdades combinadas:

PROFESOR.cod = DEPARTAMENTO.cod AND PROFESOR.nom =


DEPARTAMENTO.nom

Es decir, con los datos que hay actualmente en las tablas no nos saldrá
ningún resultado, y es que estamos pidiendo "profesores y departamentos
en los que trabajan si los profesores se llaman igual que su
departamento".

26
23/03/2021

Aparte de otras alternativas, la más cómoda es utilizar la equivalencia en


primitivas que, además, nos resulta mucho más familiar:

profesor x departamento = from profesor, departamento


donde profesor.cod=departamento.cod = where
profesor.cod=departamento.cod
[prof, profesor.nom, dir, profesor.cod, departamento.nom] = select prof,
profesor.nom, dir, profesor.cod, departamento.nom

27
23/03/2021

Sin entrar en detalles tan concretos, siempre debemos asegurarnos de


que existen las que hemos llamado "columnas comunes".

La tercera expresión no es correcta porque la tabla que hace de puente


entre PEATON y COCHE es ATROPELLADO; la primera operación es
concatenar entre las dos primeras, y esas no tienen columnas comunes.

28
23/03/2021

Otra vez debemos aclarar con qué atributos estamos operando en cada
momento. Al principio no tenemos nada, no hay relación; a continuación,
tenemos todas las columnas de PROFESOR. Ahora habría que ejecutar
la concatenación natural, pero antes hay que obtener su parte derecha, y
esta consiste en todas las columnas de DEPARTAMENTO; en este
momento, el intérprete del lenguaje detectaría que PROFESOR.cod y
DEPARTAMENTO.cod son comparables, y ejecutaría la operación.

Ya no hay más operaciones, es el resultado final, pero se ha eliminado


una de las columnas comparadas. Concretamente, la estructura del
resultado final es todas las columnas de PROFESOR y las no
comunes de DEPARTAMENTO.

Fíjate que en la expresión equivalente con primitivas obtenemos el mismo


conjunto de atributos cualificados (nombres completos de columna).

29
23/03/2021

30
23/03/2021

31

También podría gustarte