Saltar al contenido principal

Álgebra Relacional

Álgebra Relacional

  • Expresividad vs Complejidad

  • Modelo relacional (Edgar F. Codd 1970)

    • Codd propuso dos lenguajes de consulta teóricos:

      • Álgebra Relacional
      • Cálculo Relacional
    • Estos lenguajes fueron la base para SQL

info
  • Una consulta genera una tabla a partir de un conjunto de tablas.

    • El proceso de consulta es "cerrado".
  • Podemos detectar ciertas operaciones básicas sobre tablas (un álgebra)

  • Una consultaa es la composición de estas operaaciones básicas.

  • Lenguaje procedural:

    • Cada consulta indica explícitamente el procedimiento para calcularla.

Algunas consultas

Películas

IDTítuloAñoCategoríaCalificación
1Inception2010Ciencia Ficción8,8
2Waking Life2001Drama7,8
3Her2013Drama8,0
4Spirited Away2001Fantasía8,6
5Titanic1997Drama7,8

Usuarios

IDNombre
1Miguel
2Paulina
3Ignacia

Visto

ID UsuarioID PelículaDía
1430/07/21
2528/07/21
2125/07/21
Quiero toda la información de las películas

Esto sería:

IDTítuloAñoCategoríaCalificación
1Inception2010Ciencia Ficción8,8
2Waking Life2001Drama7,8
3Her2013Drama8,0
4Spirited Away2001Fantasía8,6
5Titanic1997Drama7,8
Quiero toda la información de las películas con calificación mayor o igual a 8.0

Esto sería:

IDTítuloAñoCategoríaCalificación
1Inception2010Ciencia Ficción8,8
3Her2013Drama8,0
4Spirited Away2001Fantasía8,6
Quiero toda la información de las películas de Drama con calificación mayor o igual a 8.0

Esto sería:

IDTítuloAñoCategoríaCalificación
3Her2013Drama8,0
Quiero el nombre de todos los usuario

Esto sería:

Nombre
Miguel
Paulina
Ignacia
El ID de todas las películas que ha visto "Paulina"

Esto sería:

ID Película
5
1

Álgebra Relacional: Tablas

El nombre de la tabla entrega la tabla

Ejemplo la tabla PeliculasRPeliculas \rightarrow R

Devuelve:

IDTítuloAñoCategoríaCalificación
1Inception2010Ciencia Ficción8,8
2Waking Life2001Drama7,8
3Her2013Drama8,0
4Spirited Away2001Fantasía8,6
5Titanic1997Drama7,8

Álgebra Relacional: Selección

Selección

σcondicion(Tabla)σc(R)\sigma_{condicion}(Tabla) \rightarrow \sigma_{c}(R)

σc(R)\sigma_{c}(R) entrega una nueva nueva relación que deja sólo las tuplas de la tabla RR que satisfacen las condición CC

Es una operación que filtra las filas según una condición. La condición es una expresión booleana que puede usar:

  • Comparaciones: ==, \neq, <<, \leq, >>, \geq
  • Operadores lógicos: \wedge (and), \vee (or), ¬\neg (not)
Quiero toda la información de las películas con una clasificación mayor o igual a 8.0

σCalificacion>=8.0(Peliculas)\sigma_{Calificacion>=8.0}(Peliculas)

Devuelve:

IDTítuloAñoCategoríaCalificación
1Inception2010Ciencia Ficción8,8
3Her2013Drama8,0
4Spirited Away2001Fantasía8,6
Quiero toda la información de películas de drama con clasificación mayor o igual a 8.0

σCalificacion>=8.0Categoria=Drama(Pelicula)\sigma_{Calificacion>=8.0 \wedge Categoria=Drama}(Pelicula)

Devuelve:

IDTítuloAñoCategoríaCalificación
3Her2013Drama8,0

Álgebra Relacional: Proyección

Proyección
  • πA1,...,An(R)\pi_{A_{1},...,A_{n}}(R)

πA1,...,An(R)\pi_{A_{1},...,A_{n}}(R) entrega una nueva relación que deja sólo los atributos A1,...,AnA_{1},...,A_{n} de la tabla RR

Quiero el nombre de todos los usuarios

πnombre(Peliculas)\pi_{nombre}(Peliculas)

Devuelve:

Nombre
Miguel
Paulina
Ignacia
Quiero la categoría de todas las películas

πcategoria(Peliculas)\pi_{categoria}(Peliculas)

Devuelve:

Categoría
Ciencia Ficción
Drama
Fantasía
En la proyección de la álgebra relacional, no devuelve duplicados

Convenciones sobre tablas

  • Por ahora asumimos que las tablas no puedes tener duplicados.

  • El orden de las tuplas en las tablas no importan.

  • En términos técnicos, una tabla es un conjunto de tuplas (set-semantics)

  • Esta es la convención que sigue Codd en el modelo relacional y el álgebra relacional.

  • Como veremos difiere ligeramente del SQL:

    • En el SQL pueden haber duplicados.
    • Por ende las tablas son multiconjuntos o bags (bag-semantics).
    • En ciertos casos el orden de las tuplas si importa.
Quiero el título y el año de todas las películas de Drama

πtitulo,ano(σCategoria=Drama(Peliculas))\pi_{titulo,ano}(\sigma_{Categoria='Drama'}(Peliculas))

Devuelve:

TítuloAño
Waking Life2001
Her2013
Titanic1997

Álgebra Relacional: Producto Cruz (o cartesiano)

Producto Cruz
  • R1×R2R_{1} \times R_{2}

R1×R2R_{1} \times R_{2} entrega una nueva relación con todas las tuplas (r1,r2)(r_{1},r_{2}) tal que r1R1r_{1} \in R_{1} y r2R2r_{2} \in R_{2}

Los atributos de R1×R2R_{1} \times R_{2} son la unión de los atributos de R1R_{1} y R2R_{2}

En caso de abigüedad, podemos renombrar atributos

  • Si tenemos el mismo atributo AA en R1R_{1} y R2R_{2}, es común renombrarlo a R1.AR_{1}.A y R2.AR_{2}.A en la tabla R1×R2R_{1} \times R_{2}
ID de todas las Peliculas que ha visto Paulina
  • R1=σid=id_usuario(Visto×Usuarios)R_{1} = \sigma_{id=id\_usuario}(Visto \times Usuarios)
  • R2=σnombre=Paulina(R1)R_{2} = \sigma_{nombre='Paulina'}(R_{1})
  • R3=πid_pelicula(R2)R_{3} = \pi_{id\_pelicula}(R_{2})

Otra opción:

  • R1=σnombre=Paulina(Usuario)R_{1} = \sigma_{nombre='Paulina'}(Usuario)
  • R2=R1×UsuariosR_{2} = R_{1} \times Usuarios
  • R3=σid=id_usuario(R2)R_{3} = \sigma_{id=id\_usuario}(R_{2})
  • R4=πid_pelicula(R3)R_{4} = \pi_{id\_pelicula}(R_{3})

Álgebra Relacional: Join

Join
  • R1CR2R_{1} \bowtie_{C} R_{2}

  • R1CR2R_{1} \bowtie_{C} R_{2} es la abrebiatura de σC(R1×R2)\sigma_{C}(R_{1} \times R_{2})

El cual es el uso típico del punto cruz.

  • La condición casi siempre son igualdades entre atributos R1R_{1} y R2R_{2}
Quiero el ID de todas las películas que ha visto paulina
  • R1=Vistoid=id_usuarioUsuariosR_{1} = Visto \bowtie_{id=id\_usuario} Usuarios
  • R2=σnombre=Paulina(R1)R_{2} = \sigma_{nombre='Paulina'}(R_{1})
  • R3=πid_pelicula(R2)R_{3} = \pi_{id\_pelicula}(R_{2})

Álgebra Relacional: Unión

Unión
  • R1R2R_{1} \cup R_{2}

  • R1R2R_{1} \cup R_{2} entrega una nueva relación con todas las tuplas que están en R1R_{1} y R2R_{2} (pueden estar en ambas).

  • En caso de incompatibilidad de atributos, podemos renombrar atributos en R1R_{1} y R2R_{2}

Los títulos de las películas y los nombres de los usuarios
  • πtitulo(Pelicula)πnombre(Usuarios)\pi_{titulo}(Pelicula) \cup \pi_{nombre}(Usuarios)

Álgebra Relacional: Diferencia

Diferencia
  • R1R2R_{1} - R_{2}

  • R1R2R_{1} - R_{2} entrega una nueva relación con todas las tuplas que están en R1R_{1} y no en R2R_{2}

En caso de incompatibilidad de atributos, podemos renombrar atributos en R1R2R_{1} - R_{2}

Nombre de los usuarios que no han visto ninguna película
  • R1=Usuariosid=idusuarioVistoR_{1} = Usuarios \bowtie_{id=id_usuario} Visto
  • R2=πnombre(R1)R_{2} = \pi_{nombre}(R_{1})
  • R3=πnombre(Usuarios)R_{3} = \pi_{nombre}(Usuarios)
  • R4=R3R2R_{4} = R_{3} - R_{2}

Álgebra Relacional

  • El Álgebra Relacional consiste de las composiciones de los operadores básicos:
σ,π,×,,\sigma, \pi, \times, \cup, -
  • El Álgebra SPC o SPJ consiste de las composiciones de:
σ,π,×\sigma, \pi, \times

o equivalentemente, las composiciones de:

σ,π,\sigma, \pi, \bowtie

(Esta última contiene las consultas más frecuentes)

¿Para qué sirve el álgebra relacional?

  • Provee un lenguaje de consulta general sin ambigüedad.
  • Provee la base de lenguajes de consultas prácticos (SQL)
  • Expresar planes y optimizaciones de consultas.

Ejercicios

Para cada usuario entregue su nombre junto al título y calificación de las peliculas que ha visto
  • R1=Usuarios(id=id_usuario)VistoR_{1} = Usuarios \bowtie_{(id=id\_usuario)} Visto
  • R2=R1(id_pelicula=Peliculas.ID)PeliculasR_{2} = R_{1} \bowtie_{(id\_pelicula=Peliculas.ID)} Peliculas
  • Rfinal=π(nombre,titulo,calificacion)(R2)R_{final} = \pi_{(nombre,titulo,calificacion)}(R_{2})

Ejercicio: intersección

Supongamos que tenemos dos tablas R1R_{1} y R2R_{2} ambas con atributos A1,...,AnA_{1},...,A_{n}

Definimos el operador intersección R1R2R_{1} \cap R_{2} el cual entrega una nueva relación con todas las tuplas que están en R1R_{1} y en R2R_{2}

¿Cómo escribiría la intersección en función de los operadores ya vistos?

  • R1R2=R1(R1R2)R_{1} \cap R_{2} = R_{1} - (R_{1} - R_{2})

Ejercicio: división

Supongamos que tenemos una tabla RR con dos atributos AA y BB y otra tabla SS con un atributo BB'

Definimos el operador división R÷SR \div S el cual entrega una nueva relación con atributo AA que contiene todos los valores aa tales que para todo valor bb en SS, el par (a,b)(a,b) está en RR.

La división es útil para expresar consultas del tipo "encontrar todos los X que están relacionados con todos los Y".

Es decir: {b(a,b)R}=S\{b | (a,b) \in R\} = S

Veamoslo en un ejemplo práctico:

Ejemplo

Tenistas

NombreTorneo
RogerWimbledon
RogerUS Open
RogerRoland Garros
NoleWimbledon
NoleUS Open
NoleRoland Garros
AlcatrazUS Open
GugaRoland Garros

Torneos

Nombre
Wimbledon
US Open
Roland Garros

Tenista÷TorneoTenista \div Torneo

Solución
  • ¿Nombre de jugadores que hayan ganado todos los torneos?

  • R1=πnombre(Tenistas)R_{1} = \pi_{nombre}(Tenistas)

  • R2=R1×TorneoR_{2} = R_{1} \times Torneo

  • R3=R2TenistasR_{3} = R_{2} - Tenistas

  • Rfinal=πnombre(R3)R_{final} = \pi_{nombre}(R_{3})

CONSEJO

Revisa el glosario de esta clase Glosario Álgebra Relacional