Comunidad Oracle Hispana

Álgebra Relacional. División de tablas. Alegrías y amarguras de un principiante

DIVISION DE TABLAS: ALEGRIAS Y AMARGURAS.

QUIEN SOY:

Buenos días amigos del Foro de la Comunidad Oracle Hispana. Hace ya unos meses decidí estudiar tecnologías Oracle y en principio quiero ser y poder decir en breve tiempo que soy un DBA de Oracle. Esto para empezar, mi ambición es más  grande.

Tengo mucho tiempo cada día para estudiar y estoy contento con mis avances. El despliegue que he preparado es equivalente al que montaron los Aliados para desembarcar en Normandía…. :-). Libros, tutoriales, videotutoriales de un montón de fuentes de información de calidad. Oracle está francamente muy bien documentado en la Red.

No sabéis lo que disfruto leyendo y escuchando el mismo concepto desde dos o tres perspectivas  diferentes y lo que eso me enriquece. Tim Wagner explica muy bien en su CBT_Nugget como acceder al diccionario de datos pero en los videos de OracleCoach apuntalan el concepto en cuestión, complementando y reforzando lo que ya sabía… y la apoteosis es leer una simple y magnifica aportación sobre este mismo tema de un anónimo usuario que en su web explica este concepto  de acceso al diccionario extremadanamente bien.

MI LEMA:

Desde el final de mi Bachillerato y en la Universidad donde estudié Electrónica siempre he hecho lo siguiente… primero me estudio la teoría de lo que proceda en ese momento... luego resuelvo problemas desde menor a mayor complejidad. Como decía un profesor mío de Física…    ” Un problema puede o no puede salir pero la teoría hay que sabérsela”

¿CÓMO EXTRAPOLO MI LEMA A ESTE CAMPO DE LAS BBDD EN EL QUE SOY NEOFITO?

Bueno, cogiendo algunos libros de Bases de Datos veo que los primeros temas versan siempre sobre lo mismo.

Ideas generales sobre qué es un Sistema Gestor de Bases de Datos Relacionales.

Modelos de datos: Entidad Relación, Modelo de Red, Modelo Jerárquico, Orientado a Objetos.

El Modelo Relacional y su aplicación al diseño lógico de bases de datos relacionales.

Antes de abordar el problema debo saberme la teoría y en este caso mi deber es entender perfectamente el Modelo Relacional  expuesto en un montón de libros, sitios web, etc. Es decir debo entender el MR Sí o Sí para poder entrar en la fiesta.

Estudiando Algebra Relacional me he encontrado con un pequeña sorpresa que quiero compartir con vosotros (mi mujer que es Colombiana diría compartir con Vds.).

No he tenido ningún problema de entendimiento en las operaciones Básicas y Derivadas con las tablas… A excepción del cociente entre tablas motivo de este post.

 

 

Operaciones Básicas

 

 

Operaciones Unarias

Selección   σ 

Proyección  π

 

Operaciones Binarias

Unión

Diferencia

Producto Cartesiano

 

Operaciones Derivadas

Intersección

Cociente

Combinación

 

Los conceptos de Selección, Proyección así como Unión, Diferencia, Producto Cartesiano e Intersección de tablas (o mejor dicho relaciones) me parecían triviales y avanzaba en la teoría cómodamente… pero amigos, apareció un monstruo que era el Cociente entre tablas, motivo de este pequeño artículo.

Mi cerebro lo repelía o no era capaz de imaginar o hacerse una abstracción de lo que pudiera ser un cociente entre tablas (suma o unión, resta o diferencia, selección, proyección, combinación etc.  Síííí, pero ¿Cociente?). ¡¡¡ Con lo bien que iba y lo poco que me estaba costando extrapolar cada una de estas operaciones al lenguaje SQL… pero el maldito cociente de tablas me amargó el día!!! Aunque de amargura nada, siempre queda el placer de tener algo en lo que pensar, algo que vencer con la mente.

El libro que tenía en mano se va de rositas y dice que se define así:

Tabla1:Tabla2 = πc (Tabla1)-πcc(Tabla1) x Tabla2  -Tabla1)

  • Ese subíndice c es la diferencia de atributos entre Tabla1 y Tabla2 .
  • πc es la proyección de la Tabla1 sobre el atributo del subíndice c.
  • La Tabla1 tiene que tener más columnas que la Tabla2 y además debe tener columnas de la Tabla2.
  • La Tabla2 debe tener al menos una fila o tupla.

¿Os dais cuenta? ¿Cómo concibo una división entre tablas con este panorama?

¡¡ No abandonéis por favor mirad que os pongo un ejemplo y os llevo de la mano… !!

Voy a suponer dos tablas que cumplan las condiciones y aplicar la definición de división anterior, obediente como un corderito.

 

Tabla1 (Coches)

Modelo

Color

Seat

Rojo

Renault

Verde

Ford

Azul

Ford

Negro

Seat

Azul

Tabla2 (Colores)

Color

Rojo

Azul

En nuestro caso c=Modelo, diferencia de atributos entre Tabla1 y Tabla2. Si yo hago todas estas operaciones…

Tabla1:Tabla2 = πc (Tabla1)-πcc(Tabla1) x Tabla2  -Tabla1)

Me sale que ese cociente es esta tabla:

Tabla1:Tabla2

Seat

 

Y además concluye el libro diciendo “este operador es útil para obtener los modelos de coches para los que hay de todos los colores de la otra tabla (Tabla2)”.

Queridos amigos de la Comunidad Hispana si habéis llegado aquí mil gracias por aguantarme pero ¿Os pasa lo mismo que a mí? “Hago lo que sé, pero no sé lo que hago.

 He aplicado la definición, hecho los cálculos intentando no equivocarme y el resultado es correcto (Seat) pero… no me sabe rico, no me sabe a cociente y no veo todavía que salgan los modelos para los que hay de todos los colores, bueno… sí, me ha salido Seat que tiene los dos colores de la Tabla2; Rojo y Azul…  pero ¿Cómo ha sido eso? Me he limitado a aplicar la definición. 
Os voy facilitar la labor mental:

Primero:

πc(Tabla1) x Tabla2  es lo siguiente. Cubre todas las posibilidades  entre modelos de
la Tabla1 y Colores de la Tabla2. Es un producto cartesiano,  aquí  va:

Modelo

Color

Seat

Rojo

Seat

Azul

Renault

Rojo

Renault

Azul

Ford

Rojo

Ford

Azul

Segundo

c(Tabla1) x Tabla2 )-Tabla1 (tabla anterior menos Tabla1 inicial)

(Todas las combinaciones)   menos  (las combinaciones que se han dado en Tabla1)

Al restarle la tabla de antes con todas las posibilidades combinatorias, las combinaciones de la Tabla1 queda como resultado una tabla en la que están los modelos con colores de la Tabla2 que no existían la Tabla1 inicial. Esta tabla delata los colores que le faltan a cada modelo en la Tabla1 para combinar con todos los colores de la Tabla2 colores.

 

Modelo

Color

Renault

Rojo

Renault

Azul

Ford

Rojo

 Me quedo por tanto con los modelos que no pudieron combinar con todos los colores de la Tabla2.

 TERCERO

πcc(Tabla1) x Tabla2  - Tabla1)     c  es el modelo, recordemos. Esta proyección es la tabla con los modelos que no combinaron. Recuerdo que al proyectar no se repiten las filas. Son relaciones realmente.

Seat no está en la tabla de arriba porque combinó con todos los colores de la Tabla2. Seat tenía todos los colores de la Tabla2.

Por tanto esta resta nos da:

πc (Tabla1) - πc( πc(Tabla1) x Tabla2 ) - Tabla1) = Tabla1:Tabla2

Modelo

Seat

Renault

Ford

 

menos

Modelo

Renault

Ford

 

es igual a

Modelo

Seat

 

Todos los modelos

 

Los que NO combinaron con todos los colores

 

Los que SÍ combinaron con todos los colores

 

Efectivamente si aplico la definición paso a paso como he hecho, me salen los modelos de coche de la Tabla1  que tienen en esa tabla combinación  todos los colores de la tabla colores,  la Tabla2.

 

 EXTRAPOLACIÓN A OTRO CASO ANÁLOGO

Imaginemos las tablas AUTORES, EDITORIALES, AUTORES_EDITORIALES

AUTORES(AutorID, Nombre, Provincia, Editorial…etc)

EDITORIALES(EditorialID, Editorial, País, etc)

AUTORES_EDITORIALES(AutorIDEditorialID, ISBN, Fecha,...)

¿Cómo podría saber yo qué Autores han editado en todas las Editoriales?

Pues después de lo visto sería:

Autores_Editoriales : Editoriales

¿Verdad que sí?

 ¿Bueno y cómo se expresa la División de Tablas en SQL?

Para la División no existe una sentencia en SQL como para las operaciones ( Unión, Intersec, Join, minus, etc.) por lo que es necesario hacer una combinación de sentencias y condiciones para obtener la tabla resultado.

Esto será el motivo de la parte 2 de este post.

Lo que sí os prometo que lo interesante viene en la segunda parte que ya versa más sobre cómo lograr esta información con SQL. No os  decepcionaré…

R y S son mis tablas

R ÷ S  se usa cuando queremos expresar preguntas con ALL (todos).

Ejemplo “¿Qué personas tienen una tarjeta de cliente fidelizado en todas la boutiques de la ciudad de Córdoba?”

“¿Qué personas tienen una cuenta bancaria en todos los bancos del país?”

“¿Qué estudiantes están matriculados en todos los cursos dados por EFI?”

“¿Que chicos están apuntados  a aquellos cursos en los que están todas las chicas”

Visitas: 1462

Comentario de Fernando Garcia el noviembre 18, 2014 a las 7:43pm

Excelente artículo Luis!

Asi como podemos pensar a la division como la contraparte de la multiplicacion artimetica...

3 * 2 = 6
6 % 2 = 3
6 % 3 = 2


Podríamos aceptar a la división relacional como la operacion inversa del producto cartesiano....

Modelo: Seat, Renault, Ford
Color: Rojo, Azul


Producto = Modelo X Color = (Seat, Rojo), (Renault, Rojo), (Ford, Rojo), (Seat, Azul), (Renault, Azul), (Ford, Azul)


Producto % Modelo = Color = Rojo, Azul

Producto % Color = Modelo = Seat, Renaul, Ford

Y aprovecho para agregar este valioso link

Comentario de Anibal G. Garcia Soto el noviembre 19, 2014 a las 8:01pm

Excelente aporte

With Primero as
( Select A.modelo,B.color
From Autos A, Colores B
),
Segundo as
( Select Primero.Modelo,Primero.Color from Primero
Minus
Select Modelo,Color from Autos
),
Tercero as
( Select distintc Modelo from Autos
Minus
Select distinct MOdelo from Segundo
)
Select * from Tercero;

With Primero as
( Select A.modelo,B.color
From Autos A, Colores B
),
Segundo as
( Select Primero.Modelo,Primero.Color from Primero
Minus
Select Modelo,Color from Autos
),
Tercero as
( Select distintc Modelo from Autos
Minus
Select distinct MOdelo from Segundo
)
Select * from Tercero;

Fernando gracias x tu comentario , siempre un placer leer tus aclaraciones

Comentario de Anibal G. Garcia Soto el noviembre 19, 2014 a las 8:10pm

SQL> select * from autos;

SQL> select * from autos;

MODELO COLOR
-------------------- ----------
SEAT ROJO
RENAULT VERDE
FORD AZUL
FORD NEGRO
SEAT AZUL

SQL> select * from colores;

COLOR
----------
ROJO
AZUL

Comentario

¡Tienes que ser miembro de Comunidad Oracle Hispana para agregar comentarios!

Participar en Comunidad Oracle Hispana

© 2017   Creado por Fernando Garcia.   Tecnología de

Insignias  |  Informar un problema  |  Términos de servicio