Álgebra relacional: Fundamentos para la manipulación de datos
by Juan Carlos García
25-Sept-2024
(16)
Suscribirme al canal:
Hola, bienvenido a este nuevo post donde te enseñare todo al respecto sobre el álgebra relacional y, para ello primero tenemos que recordar los conceptos que plantea la teoría de conjuntos, este post es muy importante ya que te dará las bases para que más adelante seas capaz de crear querys o consultas sobre tus tablas y comprendas a la perfección el por qué y como es que se conforman esas consultas.
- Este post forma parte de mi curso gratuito de bases de datos, te invito a revisarlo ya que hay muchos temas interesantes que estoy seguro te serán de gran ayuda.
¡No te puedes perder las nuevas clases 🧐!
Modelos de Base de Datos
Lista de los principales tipos y modelos de base de datos que existen
(14)
Normalización de base de datos
Normalización de base de datos: descripción y características de las 5 formas normales.
(12)
Modelo entidad relación
Modelo entidad relación: simbología y características del diagrama entidad relación.
(9)
Servidor de Base de Datos
Servidores de Base de Datos: ¿Qué son? Tipos, características e instalación.
(5)
Backup y restaurar SQL Server
Backup SQL Server: ¿Cómo respaldar y restaurar una base de datos en SQL Server?
(3)
🧐 Autoevaluación: Álgebra relacional
¿Cómo se aplica el álgebra relacional en base de datos?
¿Qué es una proyección en álgebra lineal?
¿Qué es el producto cartesiano en base de datos?
Tabla de contenido
- 1 ¿Qué es el álgebra relacional?
- 2 Operaciones fundamentales del álgebra relacional
-
3 Operaciones no fundamentales o complementarias
- 3.1 Operación intersección de conjuntos
- 3.2 Operación reunión natural (Natural Join)
- 3.3 Operación Join con condición o Theta Join
- 3.4 Operación Join Externo
- 3.5 Operación división
- 3.6 Operación asignación
- 3.7 Operación de agrupación
- 3.8 Operación de ordenamiento
- 3.9 Operaciones de mantenimiento de datos
- 4 Dependencias funcionales (DF)
- 5 ¿Qué son las dependencias funcionales?
- 6 Representación de una dependencia funcional
- 7 ¿Cómo definir una dependencia funcional?
- 8 Ejemplo de dependencias funcionales
- 9 Cierre canónico
- 10 Ejemplo: cierre canónico
- 11 ¿Cómo calcular la cerradura de una dependencia funcional?
Compra tu libro de base de datos
Es momento de que sigas aprendiendo por tu cuenta, puedes comprar un libro como los siguientes para complementar tu estudio.
BASE DE DATOS: es una tarea fácil (Spanish Edition)
Hosting Digital Oceans
Con nuestro link de recomendación de EWebik, recibe 200 dólares en crédito para probar tus proyectos por 60 días.
- VPS que van desde los 5 dólares.
- VPS escalables.
- Levanta tus servidores con unos pocos clics y crécelos cuando los necesites.
Diseño de Bases de Datos - Un enfoque práctico: Aprende a diseñar bases de datos desde el modelo conceptual hasta el modelo relacional con esta guía práctica con ejemplos (Spanish Edition)
¿Qué es el álgebra relacional?
El álgebra relacional se considera un lenguaje de consulta procedimental, que representa los pasos de un conjunto de operaciones, donde intervienen, una o más relaciones de entrada, dando como resultado una nueva relación.
Quizá te preguntes ¿Y cuál es este conjunto de operaciones de las que te hablo? Existe una serie de operaciones que se pueden aplicar únicamente a una relación (operaciones unarias) y otro conjunto que opera en más de una relación (operaciones binarias).
Y antes de continuar con el tema, es importante que recuerdes que en las bases de datos relacionales, la información se almacena en:
- Relaciones o tablas.
- Y que dichas tablas se conforman por atributos y tuplas.
- Te dejo aquí el capítulo sobre el modelo relacional donde revisamos todo esto.
Operaciones fundamentales del álgebra relacional
Bien, continuando con el tema principal revisemos ¿Cuáles son las operaciones fundamentales del álgebra relaciona? Responderemos a esta pregunta con la siguiente lista:
- Selección
- Proyección
- Unión
- Diferencia de conjuntos
- Producto cartesiano
- Renombramiento
Existe otro conjunto de operaciones que no entran en esta lista de fundamentales, pero son importantes ya que están definidas en términos de las operaciones fundamentales.
- Intersección de conjuntos
- Reunión natural (Natural Join)
- Theta Join
- Join Externo
- Join externo por la izquierda
- Join externo por la derecha
- Join externo completo (izquierda y derecha)
- División
- Asignación
Si eres observador seguramente habrás notado que las dos listas anteriores se parece mucho a los términos que maneja la teoría de conjuntos y, tienes razón, así que revisemos un poco lo que establece esta teoría.
Gracias por tu calificación
(16)
Fundamentos de la teoría de conjuntos
La teoría de conjuntos establece una serie de operaciones que nos ayudan a comprender y explicar matemáticamente como es que dos objetos, entidades o dominios a los cuales denominamos conjuntos están relacionados.
Comencemos repasando las operaciones básicas que establece esta teoría y para ello, vamos a imaginar que tenemos dos conjuntos A y B.
Unión (∪)
- La unión se representa por el símbolo ∪
- Entonces el conjunto A ∪ B es el resultado de la unión de los conjuntos A y B
- El conjunto A ∪ B contiene todos los elementos que están por lo menos en uno de los conjuntos A o B
Intersección (∩)
- La intersección se representa con el símbolo ∩
- Entonces el conjunto A ∩ B es el resultado de la intersección A y B
- El conjunto A ∩ B contiene todos los elementos comunes entre A y B
Diferencia (\)
- La diferencia se representa por el símbolo \
- Entonces el conjunto A \ B es la diferencia entre A y B
- El conjunto A \ B contiene todos los elementos de A que no pertenecen a B
Complemento (∁)
- El complemento se representa por el símbolo ∁
- Entonces el conjunto A∁ es el complemento de A
- A∁ contiene todos los elementos que no pertenecen a A, para comprender esto, piensa que tienes un conjunto B que funciona como un conjunto de referencia o universal y deseamos saber que elementos le hacen falta a A para ser igual al conjunto B.
Diferencia simétrica (Δ)
- La diferencia simétrica se representa por el símbolo Δ
- Entonces el conjunto A Δ B es la diferencia simétrica de A y B
- A Δ B contiene todos los elementos que pertenecen ya sea a A o B pero que no existe en ambos
Producto cartesiano (×)
- El producto cartesiano se representa por el símbolo ×
- Entonces A × B es el producto de A y B
- A × B contiene todos los pares ordenados (a, b) donde a pertenece a A y b pertenece a B
Como puedes observar, las operaciones básicas de conjuntos pueden ser representados mediante expresiones matemáticas, pero si aun te quedan algunas dudas, puedes investigar un poco en Internet sobre conjuntos, pero analizados mediante diagramas de Venn, donde el análisis se realiza con ilustraciones, te invito a indagar un poco más.
📌 Después de este paréntesis, regresemos al tema principal y analicemos cada una de las operaciones fundamentales del álgebra relacional.
Gracias por tu calificación
(16)
Relaciones ejemplo: Tema cines.
Antes de pasar a revisar cada una de las operaciones vamos a definir las relaciones que ocuparemos como referencia en todos los ejemplos:
- Cines, un catálogo de los cines que tenemos disponibles.
Cines | ||||
---|---|---|---|---|
Clave-cine | Nombre | Dirección | Zona | Ingreso |
1 | Cine 1 | Dirección 1 | Centro | $100000 |
2 | Cine 2 | Dirección 2 | Centro | $500000 |
3 | Cine 3 | Dirección 3 | Norte | $200000 |
4 | Cine 4 | Dirección 4 | Norte | $1000000 |
5 | Cine 5 | Dirección 5 | Norte | $1100000 |
6 | Cine 6 | Dirección 6 | Sur | $700000 |
7 | Cine 7 | Dirección 7 | Sur | $800000 |
8 | Cine 8 | Dirección 8 | Poniente | $600000 |
9 | Cine 9 | Dirección 9 | Poniente | $200000 |
- Ahora, supongamos que en otra tabla vamos agregando el número de salas activas por cine, si el cine no se encuentra en dicha tabla, es porque no esta ni siquiera en construcción.
Salas | |
---|---|
Clave-cine | Número-salas-activas |
2 | 15 |
4 | 4 |
6 | 6 |
8 | 10 |
- Por último, en una tercera tabla vamos almacenando las películas por cine, ya que al tener películas asignadas, quiere decir que el cine esta completamente operativo.
Películas | |
---|---|
Clave-cine | Número-películas |
2 | 40 |
6 | 15 |
8 | 10 |
Y con esto es suficiente, quizá lleguemos a renombrar alguna, pero si esto pasa lo indicaré en su momento.
Gracias por tu calificación
(16)
Operación de selección
La operación de selección como su nombre lo indica, nos permite obtener datos de una relación, siempre y cuando se cumplan una condicional a dichas condiciones se les conoce como predicados.
- La selección puede ser representada por la letra sigma “σ”.
- Y el predicado lo representamos como un subíndice de la letra σ.
- La relación la debemos escribir entre paréntesis delante de σ.
Por ejemplo, de nuestra tabla de cines queremos obtener los cines que pertenecen a la zona centro
σZona = Centro (cines)
La relación o tabla que resulta después de ejecutar la selección es la siguiente:
Cines | ||||
---|---|---|---|---|
Clave-cine | Nombre | Dirección | Zona | Ingreso |
1 | Cine 1 | Dirección 1 | Centro | $100000 |
2 | Cine 2 | Dirección 2 | Centro | $500000 |
Fácil de entender ¿Cierto? Pero aun podemos hacer más con los predicados o condicionales:
- Se permiten las comparaciones: =, ≠, <, ≤, > o ≥
- σZona ≠ Centro (cines)
- Podemos combinar varios predicados a través de las conectivas “Y (∧)” y “O (∨)” que en escancia son operadores “AND” y “OR” en temas de lógica.
- σZona ≠ Centro ∧ Clave-cine = 2 (cines)
- En el predicado podemos comparar dos atributos (Columnas). Quizá en mi ejemplo no tiene sentido pero es posible:
- σZona ≠ Dirección (cines)
- Ahora, respecto a los valores nulos, toda comparación que implique un valor nulo se evalúa como falso.
Operación de proyección
La operación de proyección se considera como unaria, ya que se puede aplicar a una sola relación y retornando únicamente los atributos especificados:
- La proyección puede ser representada mediante la letra griega pi “Π”
- Los atributos a retornas se establecen como un subíndice.
- La relación la debemos escribir entre paréntesis delante de Π.
Por ejemplo, para nuestra tabla de cines, tenemos la siguiente proyección:
ΠClave-cine,Nombre (cines)
El resultado sería:
Cines | |
---|---|
Clave-cine | Nombre |
1 | Cine 1 |
2 | Cine 2 |
3 | Cine 3 |
.. | .. |
9 | Cine 9 |
Composición de operaciones relacionales
Al igual que en teoría de conjuntos, en la álgebra relacional podemos crear operaciones complejas a través de la composición de operadores, por ejemplo:
ΠClave-cine (σClave-cine = 1 (salas))
En la operación anterior podemos observar que:
- La proyección en su argumento no tiene una relación como lo vimos anteriormente, si no que tiene una expresión que a su vez es una relación.
Esto es válido, ya que:
El resultado de una operación del álgebra relacional es del mismo tipo, es decir, el resultado es otra relación.
Partiendo de esto, el álgebra relacional nos permite crear operaciones complejas a partir de las operaciones fundamentales y el resultado será otra relación. Bien, ahora que ya sabemos esto continuemos, mas adelante vamos a necesitar esto.
Operación unión
Como vimos en la teoría de conjuntos, esta operación funciona prácticamente igual, recupera los datos de dos relaciones que están en ambas o en tan solo una de ellas.
- La unión la podemos representar mediante “∪”
- Debes tomar en cuenta que la unión solo se puede dar con relaciones compatibles, pero ¿Qué significa que sean compatibles? Sigamos que te lo cuento ya mismo.
Reglas de la operación unión
Para que la unión se pueda dar, debemos cumplir con lo siguiente:
- La relación A y B deben ser de la misma aridad, que en otras palabras, se requieren el mismo número de atributos.
- Ahora, los dominios (valores de cada atributo) de los atributos i- ésimos de A y de B deben ser iguales para todo i.
Las reglas anteriores a aplican a toda relación, aun cuando esta sea resultado de alguna expresión del álgebra relacional.
Gracias por tu calificación
(16)
📌 Ahora, con el conjunto de relaciones ejemplo, queremos saber que cines ya tienen salas o películas asignadas, para poder cumplir con esto analicemos lo siguiente:
- Si solo tomáramos la relación “cines”, no podemos hacer esto, ya que no cuenta con un atributo que nos indique esto, además no cumplimos con el principio de aridad.
- No podemos solo tomar “salas”, por que no sabríamos que cines ya tienen películas asignadas.
- Por lo contrario, si solo tomamos “películas”, sabríamos los cines que ya tienen películas, pero excluiríamos aquellos cines que únicamente tienen salas disponibles, pero aun no le han asignado películas.
Bien si utilizamos la unión, podemos obtener lo que pide el cliente, con el conjunto de tablas que tiene actualmente, la operación quedaría de la siguiente manera:
- Primero hagamos una proyección de “salas”
ΠClave-cine (salas)
- Ahora una proyección de “películas”
ΠClave-cine (películas)
- Y ahora, para obtener una relación que cumpla, necesitamos unir ambas relaciones.
ΠClave-cine (salas) ∪ ΠClave-cine (películas)
Dando como resultado la siguiente relación
Clave-cine |
---|
2 |
4 |
6 |
8 |
Operación diferencia
Supongamos que tenemos una relación A y otra B y queremos obtener la diferencia A - B:
- En primer lugar la operación de diferencia la podemos representar mediante “-”.
- Y nos da como resultado una relación con las tuplas que están en A pero no están en B.
- Otro punto importante, es que la diferencia se da únicamente entre relaciones compatibles (la compatibilidad la vimos en el operador unión).
- Por último, las tuplas duplicadas son eliminadas.
- Utilizando la selección, vamos a obtener aquellos cines que tienen un ingreso mayor o igual a 500000.
σIngreso ≥ 500000 (Cines)
Clave-cine | Nombre | Dirección | Zona | Ingreso |
---|---|---|---|---|
2 | Cine 2 | Dirección 2 | Centro | $500000 |
4 | Cine 4 | Dirección 4 | Norte | $1000000 |
5 | Cine 5 | Dirección 5 | Norte | $1100000 |
6 | Cine 6 | Dirección 6 | Sur | $700000 |
7 | Cine 7 | Dirección 7 | Sur | $800000 |
8 | Cine 8 | Dirección 8 | Poniente | $600000 |
- Utilizando la selección, ahora obtengamos aquellos cines que están en la zona centro.
σZona = Centro (Cines)
Clave-cine | Nombre | Dirección | Zona | Ingreso |
---|---|---|---|---|
1 | Cine 1 | Dirección 1 | Centro | $100000 |
2 | Cine 2 | Dirección 2 | Centro | $500000 |
- Ahora, ambas relaciones son compatibles, por lo tanto podemos llevar a cabo la diferencia A - B, para ello recordemos que debemos obtener las filas que están en A pero no en B, de las tablas anteriores ¿Qué tuplas cumplen con esto?
σIngreso ≥ 500000 (Cines) - σZona = Centro (Cines)
Clave-cine | Nombre | Dirección | Zona | Ingreso |
---|---|---|---|---|
4 | Cine 4 | Dirección 4 | Norte | $1000000 |
5 | Cine 5 | Dirección 5 | Norte | $1100000 |
6 | Cine 6 | Dirección 6 | Sur | $700000 |
7 | Cine 7 | Dirección 7 | Sur | $800000 |
8 | Cine 8 | Dirección 8 | Poniente | $600000 |
Gracias por tu calificación
(16)
Operación producto cartesiano
La operación producto cartesiano nos permite obtener la combinación de cada tupla de una relación A con cada una de las tupla de otra relación B, y cada atributo corresponde a A seguido de los de B.
- La operación producto cartesiano la podemos representar a través de “x”
- No obstante, puede darse el caso de que ambas relaciones tengan el mismo nombre, si esto sucede no podríamos distinguir el origen de cada tupla, por lo tanto, a cada atributo se le adjunta el nombre de la relación:
- (nombre-relación.atributo1, nombre-relación.atributo2)
- Si un atributo solo aparece un una sola de las relaciones, se puede omitir el nombre de la relación.
- El producto cartesiano tiene como regla que cada relación de su argumento tenga nombres diferentes, esto solventa varios problemas, pero también causa otros, por ejemplo: si queremos hacer el producto sobre la misma relación, para este caso se debe utilizar la operación renombramiento que veremos mas adelante.
Por ejemplo, hagamos el siguiente producto cartesiano:
cines x salas
⚠️ Nota: no voy a ocupar todos los datos de la tabla “cines” por que son bastante, solo utilizaré las dos primeras tuplas.
Recuerda que tenemos que realizar las combinaciones posibles y poner primero los atributos de “cines” seguido de las tuplas de “salas”. Y como tenemos atributos que tienen el mismo nombre, debemos adjuntar el nombre de la relación:
El resultado se vería de la siguiente manera:
cines x salas | ||||||
---|---|---|---|---|---|---|
cines.Clave-cine | Nombre | Dirección | Zona | Ingreso | salas.Clave-cine | Número-salas-activas |
1 | Cine 1 | Dirección 1 | Centro | $100000 | 2 | 15 |
1 | Cine 1 | Dirección 1 | Centro | $100000 | 4 | 4 |
1 | Cine 1 | Dirección 1 | Centro | $100000 | 6 | 6 |
1 | Cine 1 | Dirección 1 | Centro | $100000 | 8 | 10 |
2 | Cine 2 | Dirección 2 | Centro | $500000 | 2 | 15 |
2 | Cine 2 | Dirección 2 | Centro | $500000 | 4 | 4 |
2 | Cine 2 | Dirección 2 | Centro | $500000 | 6 | 6 |
2 | Cine 2 | Dirección 2 | Centro | $500000 | 8 | 10 |
… | … | … | … | … | … | … |
Ahora ¿Qué notas de raro en esta tabla resultante? A simple vista podemos observar que:
- Un cine ahora tiene dos "clave-cine", la que se encuentra en su propia tabla y la que está en la tabla “salas”.
- Cine 1 aparece en el resultado a pesar que no hay registros referentes a su clave en salas.
Esto se da, por que el producto cartesiano realiza la combinación y no se preocupa por nada más, y mientras se den las condiciones que establecen sus reglas arrojará un resultado.
Ahora, que pasa si hacemos una composición de operadores y limitamos la selección:
σcines.Clave-cine = salas.Clave-cine (cines x salas)
Con esta operación deseamos que nos regrese únicamente aquellas tuplas donde ambas claves tengan el mismo valor, dando como resultado:
σcines.Clave-cine = salas.Clave-cine (cines x salas) | ||||||
---|---|---|---|---|---|---|
cines.Clave-cine | Nombre | Dirección | Zona | Ingreso | salas.Clave-cine | Número-salas-activas |
2 | Cine 2 | Dirección 2 | Centro | $500000 | 2 | 15 |
😍 Ahora si tiene sentido nuestra nueva relación, al aplicar la condicional mediante el operado de selección, podemos recuperar el cine que tiene salas ocupadas.
Por lo tanto, con el producto cartesiano podemos combinar los datos y con otros operadores, podemos filtrar y retornar los datos que realmente necesitemos.
Operación de renombramiento
El operador de renombramiento, como bien dice su nombre, nos permite:
- Ya sea asignarle un nombre a una relación que no tiene nombre.
- O cambiarle el nombre a una relación que ya tiene un nombre asignado.
- Esto aplica también en los atributos.
Si eres observador, el resultado de cada operación que hemos hecho hasta el momento, no tienen un nombre, es aquí donde interviene este operador, también es útil como te mencione en el apartado anterior, utilizarlo cuando haces el producto cartesiano sobre la misma relación.
- Al operador de renombramiento lo podemos representar por la letra rho minúscula “ρ”.
- La sintaxis sería escribir ρ seguido del nuevo nombre y entre paréntesis el nombre de la relación a renombrar, por ejemplo:
- ρ nuevo_nombre (nombre_relacion)
Por ejemplo: si deseamos hacer el producto cartesiano sobre la misma tabla “cines” lo tendríamos que hacer de la siguiente manera:
cines x ρ c (cines)
Con esto, cumplimos las reglas del producto cartesiano y podemos ejecutar la operación, y si ya tenemos un resultado, podemos asignarle un nombre, por ejemplo:
ρ Res(σcines.Clave-cine = salas.Clave-cine (cines x salas))
Ahora nuestra nueva relación “Res” tiene un nombre y cuenta con los mismos datos que vimos en el ejemplo.
Pero, también podemos renombrar atributos, por ejemplo:
ρ Nuevo-nombre ← zonas(cines)
Con lo anterior estamos renombrando al atributos “zonas” a “Nuevo-nombre”, obvio tu debes poner el nombre que necesites.
Gracias por tu calificación
(16)
Operaciones no fundamentales o complementarias
Ya hemos terminado con las operaciones fundamentales y, en términos matemáticos, podríamos obtener cualquier relación resultante. Sin embargo, existen operaciones complementarias que no precisamente agregan potencia a la teoría del álgebra relacional, si no que nos ayudan a simplificar algunas consultas, así que veamos cuales son estas operaciones.
Operación intersección de conjuntos
La intersección nos permite obtener la información que esta en dos relaciones.
- La intersección de conjuntos la podemos representar mediante “∩”
¿Por qué no añade valor en cuestiones matemáticas? Esto se debe a que la intersección se puede reescribir a través de la diferencia de conjuntos, que vimos anteriormente:
A ∩ B = A - (A - B)
Por lo tanto, la intersección se puede llevar a cabo en función de otras operaciones, no obstante, es útil ya que es más fácil escribir:
A ∩ B que A - (A - B)
Por ejemplo, para nuestras relaciones de ejemplo tenemos las siguiente intersección
ΠClave-cine (cines) ∩ ΠClave-cine (salas)
Clave-cine |
---|
2 |
4 |
6 |
8 |
Operación reunión natural (Natural Join)
La operación reunión o unión natural (Natural Join) es útil para simplificar operaciones donde el protagonista es el producto cartesiano, ya que, comúnmente el resultado de un producto cartesiano, incluye una selección.
- La reunión natural la podemos representar médiate el siguiente símbolo “⋈”
Entonces, la reunión natural se considera una operación binaria que permite combinar la selección y producto cartesiano en unas sola operación.
¿Cómo opera? Bien, la reunión natural nos permite obtener:
- El producto cartesiano de las relaciones de su argumento.
- Además, lleva a cabo una selección forzando la igualdad de atributos que en este caso será la llave presentes en ambas relaciones (clave y clave foránea)
- Por último, elimina los atributos duplicados.
Por ejemplo, si establecemos la siguiente operación:
ΠClave-cine, Nombre, Dirección, Número-salas-activas (
σcines.Clave-cine = salas.Clave-cine (cines x salas) )
Anteriormente vivimos que esta operación nos regresa los registros donde las llaves sean las mismas, si aplicamos nuestro Natural Join, la operación quedaría así:
Πcines.Clave-cine, Nombre, Dirección, Número-salas-activas (cines ⋈ salas )
cines.Clave-cine | Nombre | Dirección | Número-salas-activas |
---|---|---|---|
2 | Cine 2 | Dirección 2 | 15 |
4 | Cine 4 | Dirección 4 | 4 |
6 | Cine 6 | Dirección 6 | 6 |
8 | Cine 8 | Dirección 8 | 10 |
En el resultado eliminamos una columna que se duplica y además obtenemos el mismo resultado que vimos anteriormente aplicando la selección por separado.
Gracias por tu calificación
(16)
Operación Join con condición o Theta Join
Theta Join es similar a Natural Join, con la diferencia que nos permite aplicar una condición de comparación.
- Theta Join la representamos a través del símbolo “⋈θ"
- La condición se representa a través de theta “θ”
- La relación resultante es el producto cartesiano y se seleccionan las tuplas que satisfacen la condición.
Por ejemplo, quiero saber que cines tienen asignadas ya películas de la zona centro.
Π Clave-cine, Nombre, Ingreso ( cines ⋈zona = centro películas )
Clave-cine | Nombre | Ingreso |
---|---|---|
2 | Cine 2 | $500000 |
Operación Join Externo
Este tipo de unión o reunión tiene 3 variantes:
- Join externo por la izquierda A =⋈θ B
- Join externo por la derecha A ⋈=θ B
- Join externo completo (izquierda y derecha) A =⋈=θ B
A diferencia de los otros Join que vimos, el Join Externo, regresa todas las tuplas que se encuentran en A, en B o en ambas relaciones, ya sea que tengan o no tuplas coincidentes en la otra relación y todo depende de los siguientes casos.
Join externo por la izquierda A =⋈θ B
- Conserva toda las tuplas de la relación a la izquierda, es decir las de A.
- Y algo importante es que si no se encuentran tuplas coincidente con B, los datos se rellenarán con valores nulos.
cines =⋈zona = centro películas
cines.Clave-cine | Nombre | Dirección | Zona | Ingreso | péliculas.Clave-cine | Número-péliculas |
---|---|---|---|---|---|---|
1 | Cine 1 | Dirección 1 | Centro | 100000 | 2 | 40 |
1 | Cine 1 | Dirección 1 | Centro | 100000 | 6 | 15 |
1 | Cine 1 | Dirección 1 | Centro | 100000 | 8 | 10 |
2 | Cine 2 | Dirección 2 | Centro | 500000 | 2 | 40 |
2 | Cine 2 | Dirección 2 | Centro | 500000 | 6 | 15 |
2 | Cine 2 | Dirección 2 | Centro | 500000 | 8 | 10 |
3 | Cine 3 | Dirección 3 | Norte | 200000 | NULL | NULL |
4 | Cine 4 | Dirección 4 | Norte | 1000000 | NULL | NULL |
5 | Cine 5 | Dirección 5 | Norte | 1100000 | NULL | NULL |
6 | Cine 6 | Dirección 6 | Sur | 700000 | NULL | NULL |
7 | Cine 7 | Dirección 7 | Sur | 800000 | NULL | NULL |
8 | Cine 8 | Dirección 8 | Poniente | 600000 | NULL | NULL |
9 | Cine 9 | Dirección 9 | Poniente | 200000 | NULL | NULL |
Join externo por la derecha A ⋈=θ B
- Conserva las tuplas de la relación de la derecha, es decir de B.
cines ⋈=zona = centro películas
cines.Clave-cine | Nombre | Dirección | Zona | Ingreso | péliculas.Clave-cine | Número-péliculas |
---|---|---|---|---|---|---|
1 | Cine 1 | Dirección 1 | Centro | 100000 | 2 | 40 |
2 | Cine 2 | Dirección 2 | Centro | 500000 | 2 | 40 |
1 | Cine 1 | Dirección 1 | Centro | 100000 | 6 | 15 |
2 | Cine 2 | Dirección 2 | Centro | 500000 | 6 | 15 |
1 | Cine 1 | Dirección 1 | Centro | 100000 | 8 | 10 |
2 | Cine 2 | Dirección 2 | Centro | 500000 | 8 | 10 |
Gracias por tu calificación
(16)
Join externo completo (izquierda y derecha) A =⋈=θ B
- Conserva toda las tuplas de ambas relaciones A y B.
- Las tuplas no coincidentes las rellena con nulos.
cines =⋈=zona = centro películas
cines.Clave-cine | Nombre | Dirección | Zona | Ingreso | péliculas.Clave-cine | Número-péliculas |
---|---|---|---|---|---|---|
1 | Cine 1 | Dirección 1 | Centro | 100000 | 2 | 40 |
2 | Cine 2 | Dirección 2 | Centro | 500000 | 2 | 40 |
1 | Cine 1 | Dirección 1 | Centro | 100000 | 6 | 15 |
2 | Cine 2 | Dirección 2 | Centro | 500000 | 6 | 15 |
1 | Cine 1 | Dirección 1 | Centro | 100000 | 8 | 10 |
2 | Cine 2 | Dirección 2 | Centro | 500000 | 8 | 10 |
3 | Cine 3 | Dirección 3 | Norte | 200000 | NULL | NULL |
4 | Cine 4 | Dirección 4 | Norte | 1000000 | NULL | NULL |
5 | Cine 5 | Dirección 5 | Norte | 1100000 | NULL | NULL |
6 | Cine 6 | Dirección 6 | Sur | 700000 | NULL | NULL |
7 | Cine 7 | Dirección 7 | Sur | 800000 | NULL | NULL |
8 | Cine 8 | Dirección 8 | Poniente | 600000 | NULL | NULL |
9 | Cine 9 | Dirección 9 | Poniente | 200000 | NULL | NULL |
En escancia el Join externo nos permite buscar esa información faltante, ya sea de lado izquierdo o lado derecho,
Operación división
La operación división nos permite obtener todas la tuplas de una relación A que se corresponden con todas las tuplas de una relación B, en otras palabras, podemos aplicar división donde se incluya la expresión “para todos”.
- La operación de división la podemos representar mediante “÷” o “/”.
Operación asignación
Antes de continuar, déjame hablarte sobre el operador asignación, el cual lo podemos representar mediante “←” este operador nos permite almacenar el resultado de una operación en una relación.
Por ejemplo, si deseo obtener la información de todos los cines donde el número de salas sea mayor o igual a diez, podemos hacer lo siguiente:
- Seleccionemos las tuplas que cumplan con Número-salas-activas ≥ 10 y lo vamos almacenar dentro de una relación temporal que llamaremos “S” y lo vamos hacer aplicando el concepto de asignación:
S ← σNúmero-salas-activas ≥ 10 (Salas)
S | |
---|---|
Clave-cine | Número-salas-activas |
2 | 15 |
8 | 10 |
- Ahora hagamos una proyección sobre la misma S para únicamente obtener la Clave-cine y asignamos el resultado en "S1":
S1 ← ΠClave-cine(S)
Clave-cine |
---|
2 |
8 |
- Y si aplicamos la división cines ÷ S1 tenemos lo siguiente:
Nombre | Dirección | Zona | Ingreso |
---|---|---|---|
Cine 2 | Dirección 2 | Centro | $500000 |
Cine 8 | Dirección 8 | Poniente | $600000 |
La división nos regresa los atributos definidos en “cines” que no están definidos en S1.
Gracias por tu calificación
(16)
Operación de agrupación
- La operación de agrupación se representa por gama “γ” y hace referencia a los valores calculados.
- γ atributo-a-agrupar;función-de-agreación → alias (A)
- Esta operación nos permite agrupar un conjunto de valores en función de un atributo.
- La función de agregación nos permite realizar una combinación de tuplas para producir un valor denominado como “agregado” o bien un resumen, dentro de las funciones de agregación podemos encontrar
- sum
- avg
- count
- min
- max
- Etc.
Por ejemplo:
γ Zona;avg(Ingreso) → Ingreso-promedio (cines)
Lo cual da como resultado:
Zona | Ingreso-promedio |
---|---|
Centro | $300000 |
Norte | $766666 |
Poniente | $400000 |
Sur | $750000 |
📌 Toma en cuenta que las funciones de agregación no consideran los valores nulos.
Operación de ordenamiento
- El operador de ordenamiento lo representamos a través de la letra tao "τ"
- τatributo1[asc | desc], atributo2 [asc | desc],… (A)
- Nos permite regresar una relación, pero ordenada según el predicado.
- Podemos ordenar dicha relación resultante por más de un atributo, comenzando con el primer atributo en la condición y así sucesivamente.
Por ejemplo, utilicemos el ordenamiento para saber que zona tiene más ingreso, es decir ordenamos por zona y después por ingresos de mayor a menor:
τZona, Ingresos [desc] (A)
La cual da como resultado:
Clave-cine | Nombre | Dirección | Zona | Ingreso |
---|---|---|---|---|
2 | Cine 2 | Dirección 2 | Centro | $500000 |
1 | Cine 1 | Dirección 1 | Centro | $100000 |
5 | Cine 5 | Dirección 5 | Norte | $1100000 |
4 | Cine 4 | Dirección 4 | Norte | $1000000 |
3 | Cine 3 | Dirección 3 | Norte | $200000 |
8 | Cine 8 | Dirección 8 | Poniente | $600000 |
9 | Cine 9 | Dirección 9 | Poniente | $200000 |
7 | Cine 7 | Dirección 7 | Sur | $800000 |
6 | Cine 6 | Dirección 6 | Sur | $700000 |
Operaciones de mantenimiento de datos
Son aquellas que nos permiten alterar los datos dentro de las relaciones, ya sea, eliminar, actualizar o ingresar nuevos datos.
Borrado o eliminación de datos
- Nos permite eliminar datos de una relación A.
- Tiene la notación A = A - e
- Donde "e" es una tupla constante o el resultado de una operación.
- Cuenta con la restricción de que “e” debe ser compatible con las tuplas de A.
Inserción de nuevos datos
- Nos permite agregar nuevos datos a una relación A.
- Tiene la notación A = A ∪ e
- Donde "e" es una tupla constante o el resultado de una operación.
- Cuenta con la restricción de que “e” debe ser compatible con las tuplas de A.
Actualización: Borrado + inserción
- Nos permite modificar los datos existentes de una relación A, donde elimina la tupla original y la sobrescribe con los nuevos valores.
- Para realizar esta operación, por lo regular se utiliza la operación de proyección donde se enlistan los atributos que deseamos afectar.
La mejor forma de aprender como hacer estas operaciones de mantenimiento es verlas en acción, así que retomaremos este tema un poco más adelante en este curso.
Gracias por tu calificación
(16)
Dependencias funcionales (DF)
En este punto ya estamos más que familiarizados con los conceptos:
- Relación
- Tuplas
- Y atributos
En este apartado analizaremos las dependencias funcionales entre los atributos de una base de datos y la importancia que estas dependencias tienen durante el diseño de nuestra DB.
¿Qué son las dependencias funcionales?
Una dependencia funcional (DF) es un tipo de restricción establecida entre los atributos o subconjuntos de atributos de una base de datos.
Por ejemplo:
- Podemos establecer que un atributo A que pertenece a una relación R, depende funcionalmente de otro atributo B perteneciente a R, sí, todo valor de B le corresponde siempre un valor de A.
Representación de una dependencia funcional
Una dependencia funcional la podemos representar mediante: A → B , donde:
- A es el determinante
- Y B es la dependencia
Lo anterior especifica una restricción en las posibles tuplas que pueden ser formadas mediante un estado de relación en un subconjunto “r” perteneciente a “R”. En términos un poco más sencillos podemos expresar y leer lo anterior como:
- A determina funcionalmente B si para toda r, no es posible que r tenga dos tuplas que coincidan en los atributos A y no coincidan en los atributos de B.
De lo anterior podemos exponer ciertos conceptos:
- Una dependencia funcional es una propiedad semántica entre atributos.
- Una dependencia funcional debe mantenerse en todos los estados del subconjunto r de R.
- Ahora, un estado de relación r(R) que satisface la restricción de una dependencia funcional y, lo podemos identificar como “estado de relación legal”.
Por lo tanto, el uso de las dependencias funcionales, es describir a detalle el esquema de relaciones en R, estableciendo las restricciones que siempre se deben cumplir entre atributos.
¿Cómo definir una dependencia funcional?
No existe un forma en que podamos de manera automática obtener o establecer una DF a partir de un subconjunto r, para establecer una restricción, se requiere que alguien conozca la semántica de los atributos de R.
Gracias por tu calificación
(16)
Ejemplo de dependencias funcionales
Se requiere modelar una base de datos para un negocio de rastreo satelital, donde:
1 Cada rastreador es identificado a través del IMEI, que representa:
- Tipo de equipo
- Marca
- Número de teléfono
- Protocolo
- Status
2 Cada cliente de dicha empresa es identificado mediante el RFC, que relaciona:
- Nombre
- Dirección
- Teléfono
3 Y los contratos que manejan los identifican a través de un número de contrato, que incluye:
- Fecha
- Cliente
- Equipo
- Periodo de arrendamiento
- Precio
4 Ahora, tenemos una restricción, solo se puede arrendar un equipo por contrato.
Bajo las condiciones anteriores y haciendo una análisis de cada uno de los puntos, podemos encontrar la semántica de los atributos en cada relación.
Entonces:
- IMEI determina a Tipo de equipo, Marca, Número de teléfono, Protocolo y Status.
IMEI → {Tipo de equipo, Marca, Número de teléfono, Protocolo, Status}
- RFC determina a Nombre, Dirección y Teléfono
RFC → {Nombre, Dirección, Teléfono}
- Número de contrato determina a Fecha, Cliente, Equipo, Periodo de arrendamiento y Precio.
Número de contrato → {Fecha, RFC, IMEI, Periodo de arrendamiento, Precio}
- IMEI, RFC determinan un número de contrato.
{IMEI, RFC} → {Número de contrato}
Como puedes observar, las DF es como si hicieras un análisis de las posibles llaves que hay en tus tablas, aunque, no quiere decir que serán tus llaves y las debes marcar como tal, ya que muchas DF cumplen debido a la semántica de los datos, pero por la naturaleza y reglas de negocio no es necesario establecerlas.
Por ejemplo:
- Número de teléfono determina a IMEI, Tipo de equipo, Marca, Protocolo y Status.
Número de teléfono → {IMEI, Tipo de equipo, Marca, Protocolo, Status}
Lo anterior suena lógico ¿Cierto? Un número de teléfono también es único para un rastreador, ya que hoy en día, al menos yo no he manejado un localizador que soporte más de una SIM, por lo tanto, no debería haber dos equipos activos con el mismo número de teléfono.
Ahora, si un equipo se descompone, podemos insertar esa SIM en otro equipo, por lo tanto, se mantendría la regla anterior, pero el número de teléfono ahora representa una nueva tupla y, todo los datos anteriores a esta nueva tupla, estarían ligados a ella mediante el número de teléfono, esto causaría que no podamos distinguir de primera instancia los datos generados por cada equipo.
Es aquí donde la experiencia de quien modela la base de datos entra en acción, ya que la dependencia funcional respecto al número de teléfono es válida, y en algunos momentos quizá hagamos uso de ella, pero, la experiencia y conocimiento del negocio, nos dará la pauta para establecer y utilizar las DF que sean útiles para el negocio.
Cierre canónico
Ahora que hemos visto las dependencias funcionales, pasamos a otro tema dónde trataremos a las DF como un conjunto de elementos que trataremos de convertir en un conjunto más pequeño a través de ciertas operaciones, a esta reducción se le conoce como:
- Cierre canónico
- Base canónica
- Cierre mínimo
- Cobertura canónica
- Etc.
Los ejemplos que hemos visto tienen muy pocos atributos, pero en bases de datos reales, quizá te llegues a encontrar relaciones con una gran cantidad de atributos, en donde el número de DF se convierte en un problema debido a la redundancia entre ellas y en muchos de los casos, estas dependencias tienen información innecesaria.
Así que en este apartado trataré de explicarte cómo podemos reducir estas dependencias funcionales a un conjunto mínimo de atributos, pero que mantenga la misma funcionalidad del conjunto original de DF.
Para el caso, de un determinante simple, donde:
α → βγ
Podemos separar en dos dependencias funcionales más simples, sin afectar al determinante y por ende, no hay perdida de información, por lo tanto, nuestras nuevas DF quedan de la siguiente manera:
α → β
α → γ
Ahora, para el caso de un determinante compuesto, donde:
βγ → α
Si lo separamos veríamos algo así:
β → α
γ → α
Lo cual no es válido, ya que de entrada el determinante no es el mismo, por lo tanto:
No es posible dividir un determinante y obtener nuevas dependencias funcionales.
Gracias por tu calificación
(16)
Ejemplo: cierre canónico
Supongamos que tenemos la siguiente relación R
R(A,B,C,D)
Con el conjunto F de dependencias funcionales:
F(A → B, AC → BD, D → ABC)
Bien, si aplicamos las reglas aprendidas en el apartado anterior, podemos reducir a las siguientes dependencias funcionales:
- A → B, no puede ser dividida.
- AC → BD, la podemos dividir en:
- AC → B
- AC → D
- D → ABC, también puede ser dividida en:
- D → A
- D → B
- D → C
Ahora como podemos saber si el nuevo conjunto de dependencias al que hemos llegado es esencial o no, que quiere decir esto, como podemos reducir el número de dependencias funcionales sin que tengamos una pérdida en la información. Para ello debemos calcular la “Cerradura” y, para ello debemos.
- Seleccionamos un dependencia
- Ahora debemos obtener la cerradura del determinante.
- Después volvemos a calcular el cierre del determinan, pero, sin tomar en cuenta la dependencia seleccionada.
- Si los resultado respecto al cierre o cerradura del determinante son iguales, la dependencia se considera “No Esencial” y puede ser eliminada sin que exista una pérdida en la información.
- Si el resultado del cierre del determinante no son iguales, la dependencia se considera “Esencial” y no puede ser eliminada ya que existiría una pérdida en la información.
¿Cómo calcular la cerradura de una dependencia funcional?
Bien, lo primero es conocer como representar la cerradura, lo haremos encerrando el determinante o conjunto de atributos en cuestión entre llaves y se agrega el símbolo de “+”:
{AB}+
Entonces para realizar el cálculo:
- Se toman los atributos que forman el determinante.
- De un conjunto de relaciones dadas, se buscan las dependencias funcionales ya sea en conjunto o por separado de los atributos que conforman el determinante.
- Las dependencias encontradas se agregan al conjunto resultante.
Por ejemplo: para el subconjunto de DF f que reducimos anteriormente, teníamos:
- A → B
- AC → B
- AC → D
- D → A
- D → B
- D → C
Gracias por tu calificación
(16)
Revisemos si A → B, es esencial o no:
- Primero calculemos la cerradura {A}+
- Según lo anterior el primer valor obtenido es el mismo determinante: {A}+ = {A}
- Ahora, nos centramos del lado derecho, y buscamos en el subconjunto de dependencias f, aquellos determinantes que en conjunto o solos, tengan dependencias, para este caso solo tenemos A y determina a B, entonces, el siguiente valor es B: {A}+ = {AB}
- Bien, ahora de lado derecho tenemos “AB” y en el subconjunto f, ya no hay ningún determinante que solo o en conjunto tenga más dependencias para A, B o AB, por lo tanto, el cierre de {A}+ = {AB}
- Ahora, volvamos a calcular el cierre {A}+, pero sin tomar en cuenta la dependencia funcional que estamos analizando A → B.
- Recuerda que el primer valor obtenido es el mismo determinante: {A}+ = {A}
- Como en esta ocasión no debemos tomar en cuenta a A → B, no hay otra dependencia funcional con un determinante A, por lo tanto el cierre de {A}+ = {A}
- Entonces hemos encontrado los siguientes cierres para {A}+
- {A}+ = {AB}
- {A}+ = {A}
- Si nosotros eliminamos la dependencia funcional A → B, el resultado del cierre de los determinantes no son iguales, por lo tanto A → B es Esencial y no puede ser eliminada ya que existiría pérdida de información.
Ahora hagamos el mismo análisis para las dependencias funcionales restantes:
- AC → B
- {AC}+ = {ACBD}
- {AC}+ = {ACDB}
- Los cierres son iguales, entonces AC → B No es Esencial y puede ser eliminada.
- AC → D
- {AC}+ = {ACDB}
- {AC}+ = {ACB}
- Los cierres no son iguales, entonces AC → D Es Esencial y no puede ser eliminada.
- D → A
- {D}+ = {DABC}
- {D}+ = {DBC}
- Los cierres no son iguales, entonces D → A Es Esencial y no puede ser eliminada.
- D → B
- {D}+ = {DBAC}
- {D}+ = {DACB}
- Los cierres son iguales, entonces D → B No es Esencial y puede ser eliminada.
- D → C
- {D}+ = {DCAB}
- {D}+ = {DAB}
- Los cierres no son iguales, entonces D → C Es Esencial y no puede ser eliminada.
Después de este análisis, nos quedamos con aquellas DF esenciales, dando como resultado el siguiente subconjunto de DF:
- A → B
- AC → D
- D → A
- D → C
Ahora podemos unir las dependencias funcionales que tengan el mismo determinante y nombraremos a este nuevo subconjunto ff:
- A → B
- AC → D
- D → AC
Por lo tanto, del conjunto original F
F(A → B, AC → BD, D → ABC)
Hemos reducido y eliminado ciertos términos dependientes que eran redundantes, sin haber perdido información.
ff(A → B, AC → D, D → AC)
Ahora, quizá en ff aun existan redundancias, no en las dependencias, si no en los determinantes, ya que existe un determinante compuesto “AC”. Para validar que no tenga redundancia podemos:
- Separar los atributos que conforman el determinante.
- Calcular por separado el cierre de cada atributo que conforma el determinante.
- Validar que las dependencias originales, sean un subconjunto del la cerradura de cada atributo calculado por separado.
- Si las dependencias no son parte del nuevo subconjunto, el atributo no puede ser eliminado.
- Si las dependencias son parte del nuevo subconjunto, el atributo puede ser eliminado.
Por ejemplo, para AC → D:
- {A}+ = {AB}
- Como podemos observar D, no es un subconjunto de la cerradura de {A}+, por lo tanto, el atributo A no puede ser eliminado.
- {C}+ = {C}
- Como podemos observar D, no es un subconjunto de la cerradura de {C}+, por lo tanto, el atributo C no puede ser eliminado.
📌 Lo anterior indica que en AC → D, no existe redundancia y, por lo tanto ff es el cierre canónico, ya que, ff contiene la menor cantidad de atributos que mantiene la misma funcionalidad que las dependencias funcionales originales.
Normalización
Ahora que ya has aprendido lo fundamental del álgebra relacional, puedes continuar con el siguiente tema: normalización de bases de datos y las 5 formas normales.
Excelente viajero, me da gusto que hayas llegado al final, espero que todos los conceptos los hayas comprendido a la perfección, te invito a suscribirte a mi boletín y a mi canal de YouTube para que te avise cuando suba el próximo capítulo, nos vemos en el siguiente post.
Gracias por tu calificación
(16)
🧐 Autoevaluación: Álgebra relacional
¿Cómo se aplica el álgebra relacional en base de datos?
¿Qué es una proyección en álgebra lineal?
¿Qué es el producto cartesiano en base de datos?
Juan Carlos García
Desarrollador de software / SEO
Durante años he desarrollado plataformas dedicadas al rastreo satelital y varios sitios web que se encuentran en la primera página de Google, y hoy quiero compartir contigo lo que se en tecnologías como: Node JS, PHP, C# y Bases de datos.
Si quieres apoyarme sígueme en mis redes sociales y suscríbete a mi canal de YouTube.