En la teoría de bases de datos , el álgebra relacional es una teoría que utiliza estructuras algebraicas para modelar datos y definir consultas sobre ellos con una semántica bien fundamentada . La teoría fue introducida por Edgar F. Codd . [1]
La principal aplicación del álgebra relacional es proporcionar una base teórica para las bases de datos relacionales , en particular los lenguajes de consulta para dichas bases de datos, entre los que se destaca SQL . Las bases de datos relacionales almacenan datos tabulares representados como relaciones . Las consultas sobre bases de datos relacionales también suelen devolver datos tabulares representados como relaciones.
El objetivo principal del álgebra relacional es definir operadores que transformen una o más relaciones de entrada en una relación de salida. Dado que estos operadores aceptan relaciones como entrada y producen relaciones como salida, se pueden combinar y utilizar para expresar consultas complejas que transformen múltiples relaciones de entrada (cuyos datos se almacenan en la base de datos) en una única relación de salida (los resultados de la consulta).
Los operadores unarios aceptan una única relación como entrada. Algunos ejemplos son los operadores para filtrar determinados atributos (columnas) o tuplas (filas) de una relación de entrada. Los operadores binarios aceptan dos relaciones como entrada y las combinan en una única relación de salida. Por ejemplo, tomar todas las tuplas que se encuentran en cualquiera de las relaciones ( unión ), eliminar las tuplas de la primera relación que se encuentran en la segunda relación ( diferencia ), extender las tuplas de la primera relación con las tuplas de la segunda relación que cumplan determinadas condiciones, etcétera.
El álgebra relacional recibió poca atención fuera de las matemáticas puras hasta la publicación del modelo relacional de datos de EF Codd en 1970. Codd propuso dicha álgebra como base para los lenguajes de consulta de bases de datos.
El álgebra relacional opera con conjuntos homogéneos de tuplas, donde comúnmente interpretamos que m es el número de filas de tuplas en una tabla y n es el número de columnas. Todas las entradas en cada columna tienen el mismo tipo .
Una relación también tiene una tupla única llamada encabezado que le da a cada columna un nombre o atributo único dentro de la relación. Los atributos se utilizan en proyecciones y selecciones.
El álgebra relacional utiliza la unión de conjuntos , la diferencia de conjuntos y el producto cartesiano de la teoría de conjuntos, y agrega restricciones adicionales a estos operadores para crear otros nuevos.
Para la unión de conjuntos y la diferencia de conjuntos, las dos relaciones involucradas deben ser compatibles con la unión , es decir, las dos relaciones deben tener el mismo conjunto de atributos. Debido a que la intersección de conjuntos se define en términos de la unión de conjuntos y la diferencia de conjuntos, las dos relaciones involucradas en la intersección de conjuntos también deben ser compatibles con la unión.
Para que se defina el producto cartesiano, las dos relaciones involucradas deben tener encabezados disjuntos, es decir, no deben tener un nombre de atributo común.
Además, el producto cartesiano se define de forma diferente a la de la teoría de conjuntos , en el sentido de que las tuplas se consideran "superficiales" a los efectos de la operación. Es decir, el producto cartesiano de un conjunto de n -tuplas con un conjunto de m -tuplas produce un conjunto de ( n + m ) -tuplas "aplanadas" (mientras que la teoría de conjuntos básica habría prescrito un conjunto de 2-tuplas, cada una de las cuales contendría una n -tupla y una m -tupla). De manera más formal, R × S se define de la siguiente manera:
La cardinalidad del producto cartesiano es el producto de las cardinalidades de sus factores, es decir, | R × S | = | R | × | S |.
Una proyección ( Π ) es una operación unaria escrita como donde es un conjunto de nombres de atributos. El resultado de dicha proyección se define como el conjunto que se obtiene cuando todas las tuplas en R se restringen al conjunto .
Nota: cuando se implementa en el estándar SQL , la "proyección predeterminada" devuelve un multiconjunto en lugar de un conjunto, y la proyección Π para eliminar datos duplicados se obtiene mediante la adición de la DISTINCT
palabra clave .
Una selección generalizada (σ) es una operación unaria escrita como donde φ es una fórmula proposicional que consta de átomos como se permite en la selección normal y los operadores lógicos ( y ), ( o ) y ( negación ). Esta selección selecciona todas aquellas tuplas en R para las que φ es válido.
Para obtener una lista de todos los amigos o socios comerciales de una libreta de direcciones, la selección se puede escribir como . El resultado sería una relación que contenga todos los atributos de cada registro único donde isFriend sea verdadero o donde isBusinessContact sea verdadero.
Un cambio de nombre ( ρ ) es una operación unaria escrita como donde el resultado es idéntico a R excepto que el atributo b en todas las tuplas se renombra a un atributo a . Esto se usa comúnmente para cambiar el nombre del atributo de una relación con el propósito de una unión.
Para cambiar el nombre del atributo "isFriend" a "isBusinessContact" en una relación, se podría utilizar .
También existe la notación, donde R se renombra a x y los atributos se renombran a . [2]
La unión natural (⨝) es un operador binario que se escribe como ( R ⨝ S ) donde R y S son relaciones . [a] El resultado de la unión natural es el conjunto de todas las combinaciones de tuplas en R y S que son iguales en sus nombres de atributos comunes. Como ejemplo, considere las tablas Employee y Dept y su unión natural: [ cita requerida ]
Tenga en cuenta que ni el empleado llamado Mary ni el departamento de Producción aparecen en el resultado.
Esto también se puede utilizar para definir la composición de las relaciones . Por ejemplo, la composición de Employee y Dept es su unión, como se muestra arriba, proyectada en todos los atributos excepto en el común DeptName .
El operador de unión natural es posiblemente uno de los operadores más importantes, ya que es la contraparte relacional del operador AND lógico. Nótese que si la misma variable aparece en cada uno de dos predicados que están conectados por AND, entonces esa variable representa lo mismo y ambas apariciones siempre deben sustituirse por el mismo valor (esto es una consecuencia de la idempotencia del operador AND lógico).
Formalmente, la semántica de la unión natural se define de la siguiente manera:
Generalmente se requiere que R y S tengan al menos un atributo común, pero si se omite esta restricción y R y S no tienen atributos comunes, entonces la unión natural se convierte en el producto cartesiano.
La unión natural se puede simular con las primitivas de Codd de la siguiente manera. Suponga que c 1 ,..., c m son los nombres de atributos comunes a R y S , r 1 ,..., r n son los nombres de atributos únicos a R y s 1 ,..., s k son los nombres de atributos únicos a S . Además, suponga que los nombres de atributo x 1 ,..., x m no están ni en R ni en S . En un primer paso, los nombres de atributos comunes en S se pueden renombrar:
Luego tomamos el producto cartesiano y seleccionamos las tuplas que se van a unir:
Finalmente tomamos una proyección para deshacernos de los atributos renombrados:
En la práctica, el álgebra relacional clásica descrita anteriormente se extiende con varias operaciones como uniones externas, funciones agregadas e incluso cierre transitivo. [3]
Mientras que el resultado de una unión (o unión interna) consiste en tuplas formadas mediante la combinación de tuplas coincidentes en los dos operandos, una unión externa contiene esas tuplas y, además, algunas tuplas formadas mediante la extensión de una tupla no coincidente en uno de los operandos mediante valores de "relleno" para cada uno de los atributos del otro operando. Las uniones externas no se consideran parte del álgebra relacional clásica analizada hasta ahora. [4]
Los operadores definidos en esta sección suponen la existencia de un valor nulo , ω , que no definimos, que se utilizará para los valores de relleno; en la práctica, esto corresponde al NULL en SQL. Para que las operaciones de selección posteriores en la tabla resultante tengan sentido, se debe asignar un significado semántico a los valores nulos; en el enfoque de Codd, la lógica proposicional utilizada por la selección se extiende a una lógica de tres valores , aunque omitimos esos detalles en este artículo.
Se definen tres operadores de unión externa: unión externa izquierda, unión externa derecha y unión externa completa. (A veces se omite la palabra "externa").
La unión externa izquierda (⟕) se escribe como R ⟕ S donde R y S son relaciones . [b] El resultado de la unión externa izquierda es el conjunto de todas las combinaciones de tuplas en R y S que son iguales en sus nombres de atributos comunes, además (en términos generales) de las tuplas en R que no tienen tuplas coincidentes en S. [ cita requerida ]
Como ejemplo, considere las tablas Employee y Dept y su unión externa izquierda:
En la relación resultante, las tuplas en S que no tienen valores comunes en nombres de atributos comunes con las tuplas en R toman un valor nulo , ω .
Dado que no hay tuplas en Dept con un DeptName de Finance o Executive , aparecen ω en la relación resultante donde las tuplas en Employee tienen un DeptName de Finance o Executive .
Sean r 1 , r 2 , ..., r n los atributos de la relación R y sea {( ω , ..., ω )} la relación singleton sobre los atributos que son únicos para la relación S (aquellos que no son atributos de R ). Entonces la unión externa izquierda puede describirse en términos de la unión natural (y por lo tanto utilizando operadores básicos) de la siguiente manera:
La unión externa derecha (⟖) se comporta casi idénticamente a la unión externa izquierda, pero los roles de las tablas se intercambian.
La unión externa derecha de las relaciones R y S se escribe como R ⟖ S . [c] El resultado de la unión externa derecha es el conjunto de todas las combinaciones de tuplas en R y S que son iguales en sus nombres de atributos comunes, además de las tuplas en S que no tienen tuplas coincidentes en R . [ cita requerida ]
Por ejemplo, considere las tablas Employee y Dept y su unión externa derecha:
En la relación resultante, las tuplas en R que no tienen valores comunes en nombres de atributos comunes con las tuplas en S toman un valor nulo , ω .
Dado que no hay tuplas en Employee con un DeptName de Production , aparecen ω en los atributos Name y EmpId de la relación resultante donde las tuplas en Dept tenían DeptName de Production .
Sean s 1 , s 2 , ..., s n los atributos de la relación S y sea {( ω , ..., ω )} la relación singleton sobre los atributos que son únicos para la relación R (aquellos que no son atributos de S ). Entonces, al igual que con la unión externa izquierda, la unión externa derecha se puede simular utilizando la unión natural de la siguiente manera:
La unión externa (⟗) o unión externa completa en efecto combina los resultados de las uniones externas izquierda y derecha.
La unión externa completa se escribe como R ⟗ S donde R y S son relaciones . [d] El resultado de la unión externa completa es el conjunto de todas las combinaciones de tuplas en R y S que son iguales en sus nombres de atributos comunes, además de las tuplas en S que no tienen tuplas coincidentes en R y las tuplas en R que no tienen tuplas coincidentes en S en sus nombres de atributos comunes. [ cita requerida ]
Como ejemplo, considere las tablas Employee y Dept y su unión externa completa:
En la relación resultante, las tuplas en R que no tienen valores comunes en nombres de atributos comunes con las tuplas en S toman un valor nulo , ω . Las tuplas en S que no tienen valores comunes en nombres de atributos comunes con las tuplas en R también toman un valor nulo , ω .
La unión externa completa se puede simular utilizando las uniones externas izquierda y derecha (y, por lo tanto, la unión natural y la unión de conjuntos) de la siguiente manera:
No hay nada en el álgebra relacional introducido hasta ahora que permita realizar cálculos en los dominios de datos (aparte de la evaluación de expresiones proposicionales que involucran igualdad). Por ejemplo, no es posible usar solo el álgebra introducida hasta ahora para escribir una expresión que multiplique los números de dos columnas, por ejemplo, un precio unitario con una cantidad para obtener un precio total. Los lenguajes de consulta prácticos tienen tales facilidades, por ejemplo, el SELECT de SQL permite que las operaciones aritméticas definan nuevas columnas en el resultado , y una facilidad similar se proporciona de manera más explícita mediante la palabra clave del Tutorial D. [5] En la teoría de bases de datos, esto se llama proyección extendida . [6] : 213 SELECT unit_price * quantity AS total_price FROM t
EXTEND
Además, el cálculo de varias funciones en una columna, como la suma de sus elementos, tampoco es posible utilizando el álgebra relacional presentada hasta ahora. Hay cinco funciones de agregación que se incluyen con la mayoría de los sistemas de bases de datos relacionales. Estas operaciones son Suma, Conteo, Promedio, Máximo y Mínimo. En el álgebra relacional, la operación de agregación sobre un esquema ( A 1 , A 2 , ... A n ) se escribe de la siguiente manera:
donde cada A j ', 1 ≤ j ≤ k , es uno de los atributos originales A i , 1 ≤ i ≤ n .
Los atributos que preceden a g son atributos de agrupación, que funcionan como una cláusula "group by" en SQL. Luego, hay una cantidad arbitraria de funciones de agregación que se aplican a atributos individuales. La operación se aplica a una relación arbitraria r . Los atributos de agrupación son opcionales y, si no se proporcionan, las funciones de agregación se aplican a toda la relación a la que se aplica la operación.
Supongamos que tenemos una tabla llamada Cuenta con tres columnas, a saber, Account_Number, Branch_Name y Balance . Deseamos encontrar el saldo máximo de cada sucursal. Esto se logra mediante Branch_Name G Max( Balance ) ( Account ). Para encontrar el saldo más alto de todas las cuentas independientemente de la sucursal, simplemente podríamos escribir G Max( Balance ) ( Account ).
La agrupación a menudo se escribe como Branch_Name ɣ Max( Balance ) ( Account ). [6]
Aunque el álgebra relacional parece lo suficientemente potente para la mayoría de los propósitos prácticos, existen algunos operadores simples y naturales sobre relaciones que no pueden expresarse mediante el álgebra relacional. Uno de ellos es la clausura transitiva de una relación binaria. Dado un dominio D , sea la relación binaria R un subconjunto de D × D . La clausura transitiva R + de R es el subconjunto más pequeño de D × D que contiene a R y satisface la siguiente condición:
Esto se puede demostrar utilizando el hecho de que no existe una expresión de álgebra relacional E ( R ) que tome R como argumento variable que produzca R + . [7]
Sin embargo, SQL admite oficialmente dichas consultas de punto fijo desde 1999, y tenía extensiones específicas del proveedor en esta dirección mucho antes de eso.
El primer lenguaje de consulta basado en el álgebra de Codd fue Alpha, desarrollado por el propio Dr. Codd. Posteriormente se creó ISBL , y este trabajo pionero ha sido aclamado por muchas autoridades [8] por haber mostrado la manera de convertir la idea de Codd en un lenguaje útil. Business System 12 fue un DBMS relacional de corta duración y de gran solidez industrial que siguió el ejemplo de ISBL.
En 1998 Chris Date y Hugh Darwen propusieron un lenguaje llamado Tutorial D, pensado para su uso en la enseñanza de la teoría de bases de datos relacionales, y su lenguaje de consulta también se basa en las ideas de ISBL. [9] Rel es una implementación de Tutorial D. Bmg es una implementación de álgebra relacional en Ruby que sigue de cerca los principios de Tutorial D y El Tercer Manifiesto . [10]
Incluso el lenguaje de consulta de SQL se basa vagamente en un álgebra relacional, aunque los operandos en SQL ( tablas ) no son exactamente relaciones y varios teoremas útiles sobre el álgebra relacional no se sostienen en la contraparte de SQL (posiblemente en detrimento de los optimizadores y/o usuarios). El modelo de tabla de SQL es una bolsa ( multiconjunto ), en lugar de un conjunto. Por ejemplo, la expresión es un teorema para el álgebra relacional sobre conjuntos, pero no para el álgebra relacional sobre bolsas. [6]
{{cite book}}
: CS1 maint: location missing publisher (link)