Diferencia entre una unión theta, equijoin y unión natural


95

Tengo problemas para entender el álgebra relacional cuando se trata de uniones theta, equijoin y uniones naturales. ¿Podría alguien ayudarme a entenderlo mejor? Si uso el signo = en una combinación theta, ¿es exactamente lo mismo que usar una combinación natural?


re la cita en cuestión de la recompensa ... no está citando a Codd allí, está citando mi respuesta en la que aparece su comentario debajo.
heisenberg

Respuestas:


141

Una unión theta permite relaciones de comparación arbitrarias (como ≥).

Una equijoin es una combinación theta que usa el operador de igualdad.

Una combinación natural es una combinación de atributos que tienen el mismo nombre en cada relación.

Además, una combinación natural elimina las columnas duplicadas involucradas en la comparación de igualdad, por lo que solo queda 1 de cada columna comparada; en términos algebraicos relacionales aproximados: ⋈ = πR,S-as ○ ⋈aR=aS


13
la unión natural eliminará las columnas con el mismo nombre
Bogdan Gavril MSFT

2
¿Todos o todos menos uno?
Christopher Shroba

Equijoin también eliminará la columna de igualdad si tienen el mismo nombre en ambas tablas.
Vishal R

1
@outis, ¿Qué significa "theta" en "theta join"?
Pacerier

2
@Pacerier: Históricamente, la thetacombinación in theta se refiere a una condición arbitraria utilizada como criterio para la combinación. (ver Sistemas de bases de datos: El libro completo de García-Molina, Ullman, Widom, capítulo 2, Theta Join)
Ram Rajamony

58

Si bien las respuestas que explican las diferencias exactas están bien, quiero mostrar cómo el álgebra relacional se transforma en SQL y cuál es el valor real de los 3 conceptos.

El concepto clave en su pregunta es la idea de una combinación. Para comprender una combinación, debe comprender un producto cartesiano (el ejemplo se basa en SQL, donde el equivalente se denomina combinación cruzada, como señala onedaywhen);

Esto no es muy útil en la práctica. Considere este ejemplo.

Product(PName, Price)
====================
Laptop,   1500
Car,      20000
Airplane, 3000000


Component(PName, CName, Cost)
=============================
Laptop, CPU,    500
Laptop, hdd,    300
Laptop, case,   700
Car,    wheels, 1000

El producto cartesiano Producto x Componente será - abajo o violín sql . Puede ver que hay 12 filas = 3 x 4. Obviamente, las filas como "Laptop" con "ruedas" no tienen significado, por eso en la práctica el producto cartesiano se usa raramente.

|    PNAME |   PRICE |  CNAME | COST |
--------------------------------------
|   Laptop |    1500 |    CPU |  500 |
|   Laptop |    1500 |    hdd |  300 |
|   Laptop |    1500 |   case |  700 |
|   Laptop |    1500 | wheels | 1000 |
|      Car |   20000 |    CPU |  500 |
|      Car |   20000 |    hdd |  300 |
|      Car |   20000 |   case |  700 |
|      Car |   20000 | wheels | 1000 |
| Airplane | 3000000 |    CPU |  500 |
| Airplane | 3000000 |    hdd |  300 |
| Airplane | 3000000 |   case |  700 |
| Airplane | 3000000 | wheels | 1000 |

Los JOIN están aquí para agregar más valor a estos productos. Lo que realmente queremos es "unir" el producto con sus componentes asociados, porque cada componente pertenece a un producto. La forma de hacer esto es con una combinación:

Producto JOIN Component ON Pname

La consulta SQL asociada sería así (puedes jugar con todos los ejemplos aquí )

SELECT *
FROM Product
JOIN Component
  ON Product.Pname = Component.Pname

y el resultado:

|  PNAME | PRICE |  CNAME | COST |
----------------------------------
| Laptop |  1500 |    CPU |  500 |
| Laptop |  1500 |    hdd |  300 |
| Laptop |  1500 |   case |  700 |
|    Car | 20000 | wheels | 1000 |

Observe que el resultado tiene solo 4 filas, porque la computadora portátil tiene 3 componentes, el automóvil tiene 1 y el avión ninguno. Esto es mucho más útil.

Volviendo a sus preguntas, todas las uniones sobre las que pregunta son variaciones del JOIN que acabo de mostrar:

Unión natural = la combinación (la cláusula ON) se realiza en todas las columnas con el mismo nombre; elimina las columnas duplicadas del resultado, a diferencia de todas las demás combinaciones; la mayoría de los DBMS (sistemas de bases de datos creados por varios proveedores, como SQL Server de Microsoft, MySQL de Oracle, etc.) ni siquiera se molestan en admitir esto, es solo una mala práctica (o decidieron no implementarlo a propósito). Imagine que llega un desarrollador y cambia el nombre de la segunda columna en Producto de Precio a Costo. Luego, todas las uniones naturales se realizarían en PName Y en Cost, lo que daría como resultado 0 filas ya que ningún número coincide.

Theta Join = esta es la combinación general que todos usan porque le permite especificar la condición (la cláusula ON en SQL). Puede unirse en prácticamente cualquier condición que desee, por ejemplo, en Productos que tienen las 2 primeras letras similares o que tienen un precio diferente. En la práctica, este rara vez es el caso: en el 95% de los casos, se unirá en una condición de igualdad, lo que nos lleva a:

Equi Join = el más común utilizado en la práctica. El ejemplo anterior es una combinación equi. ¡Las bases de datos están optimizadas para este tipo de uniones! Lo contrario de una combinación equi es una combinación no equi, es decir, cuando se une en una condición distinta de "=". ¡Las bases de datos no están optimizadas para esto! Ambos son subconjuntos de la combinación theta general. La combinación natural también es una combinación theta, pero la condición (theta) está implícita.

Fuente de información: universidad + desarrollador certificado de SQL Server + recientemente completó el MOO "Introducción a las bases de datos" de Stanford, así que me atrevo a decir que tengo el álgebra relacional fresca en mente.


1
Utiliza el término 'producto cartesiano' de forma un tanto imprecisa. El producto del operador relacional da como resultado una relación (¡en común con todos los operadores relacionales!). Una CROSS JOINoperación en SQL da como resultado una expresión de tabla (filas de columnas). La operación de conjunto producto cartesiano da como resultado un conjunto de pares.
cuando

1
Cuando dice "Bases de datos", en realidad se refiere a "DBMS", una diferencia crucial al abordar los "conceptos".
cuando

2
onedaywhen - ¡gracias por todos los comentarios útiles! se siente como una revisión de código :). Arreglé el producto cartesiano y los problemas de DBMS. Mantengo mi opinión de que las uniones naturales son solo de interés académico y los DBMS importantes como SQL Server no implementan esto a propósito; agregar una condición conduce explícitamente a una mejor comprensión y mantenimiento del código. Una pregunta relacionada: stackoverflow.com/questions/4826613/natural-join-in-sql-server
Bogdan Gavril MSFT

1
@HLGEM: uno podría hacer argumentos similares en contra SELECT * FROM...(y tal vez lo haga). Pero está en el lenguaje, está en cada implementación de SQL y lo uso a menudo (¡y apuesto a que usted también lo hace!). Pista que no todo el código es código de producción.
cuando

1
El verdadero problema con la columna unida "natural" no se trata de cambiar los nombres, sino de agregar nuevos que no deben entrar en conflicto entre todas las tablas posiblemente unidas en el sistema. Tome columnas muy comunes como "nombre", "descripción", ... El uso de "combinación natural" hará que se unan, mientras que no tiene sentido y más va en contra de la lógica empresarial y conduce a errores. Entonces sí, la "unión natural" es peligrosa. Le obliga a tener nombres distintos a excepción de las columnas de claves (primarias / externas) y perder el "espacio entre nombres".
LoganMzz

14

La respuesta de @outis es buena: concisa y correcta en cuanto a relaciones.

Sin embargo, la situación es un poco más complicada en cuanto a SQL.

Considere los proveedores habituales y la base de datos de piezas pero implementada en SQL:

SELECT * FROM S NATURAL JOIN SP;

devolvería un conjunto de resultados ** con columnas

SNO, SNAME, STATUS, CITY, PNO, QTY

La unión se realiza en la columna con el mismo nombre en ambas tablas, SNO. Tenga en cuenta que el conjunto de resultados tiene seis columnas y solo contiene una columna para SNO.

Ahora considere una ecuación theta, donde los nombres de columna para la unión deben especificarse explícitamente (más las variables de rango Sy SPson obligatorias):

SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;

El conjunto de resultados tendrá siete columnas, incluidas dos columnas para SNO. Los nombres del conjunto de resultados son lo que el estándar SQL denomina "dependiente de la implementación", pero podrían verse así:

SNO, SNAME, STATUS, CITY, SNO, PNO, QTY

o tal vez esto

S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY

En otras palabras, NATURAL JOINen SQL pueden considerarse para eliminar columnas con nombres duplicados del conjunto de resultados (pero por desgracia no eliminarán las filas duplicadas - usted debe recordar cambiar SELECTa SELECT DISTINCTti mismo).


** No sé muy bien cuál es el resultado SELECT * FROM table_expression;. Sé que no es una relación porque, entre otras razones, puede tener columnas con nombres duplicados o una columna sin nombre. Sé que no es un conjunto porque, entre otras razones, el orden de las columnas es significativo. Ni siquiera es una tabla SQL o una expresión de tabla SQL. Yo lo llamo un conjunto de resultados.


Lo mismo vale JOIN ... USING(...).
Benoit

¿Por qué dices "No sé muy bien cuál es el resultado de SELECT * FROM table_expression;" ?
Pacerier

@Pacerier: erm, ¡porque no sé qué es! La última vez que miré, el estándar SQL evitó definir qué es. Sé lo que no es (ni una relación, ni un conjunto, ni una tabla, ni una expresión de tabla). Entonces, para facilitar la referencia, empleé mi propio término, 'conjunto de resultados'. Tenga en cuenta que en el modelo relacional el resultado de una operación que involucra dos relaciones es una relación. No se puede realizar la declaración equivalente para SQL AFAIK.
cuando

11

Natural es un subconjunto de Equi que es un subconjunto de Theta.

Si uso el signo = en una combinación theta, ¿es exactamente lo mismo que usar una combinación natural?

No necesariamente, pero sería un Equi. Natural significa que está haciendo coincidir todas las columnas con nombres similares, Equi solo significa que está usando '=' exclusivamente (y no 'menos que', como, etc.)

Sin embargo, esto es puramente académico, podría trabajar con bases de datos relacionales durante años y nunca escuchar a nadie usar estos términos.


Sospecho que cuando dice "bases de datos relacionales" sospecho que se refiere a otra cosa, por ejemplo, "SQL".
cuando

¿Trabajo que no sea académico con bases de datos relacionales que no sean SQL? Entonces, ¿a qué productos te refieres?
cuando

3
En el álgebra original de Codd, la unión natural es el tipo fundamental de unión, mientras que equi- o theta- "unión" es la abreviatura de NJ (por ejemplo, producto cruzado) seguido de una restricción. "Natural es un subconjunto de Equi que es un subconjunto de Theta" presumiblemente lo que eso significa es que cada NJ también podría expresarse como un EJ o TJ. Supongo que eso es cierto si σ 1 = 1 (A x B) cuenta como un equijoin, en cuyo caso cada operación del álgebra relacional podría expresarse como un equijoin en esa forma. La ambigüedad aquí es que hay más de un posible conjunto de operadores fundamentales para el RA.
nvogel

2
@EricFail: sqlvogel solo está citando la respuesta de kekekela, en lugar de algo de Codd. Si desea obtener más información sobre los escritos de Codd sobre uniones (θ o no), puede probar "El modelo relacional para la gestión de bases de datos", o trabajar en su bibliografía .
Salida

1
... La pregunta a la que enlaza tiene una respuesta que se acerca a lo que está buscando, probablemente lo más cerca posible. Se vincula a Completitud relacional de sublenguajes de bases de datos . La página 10 describe la conexión entre θ, = y uniones naturales (aunque naturales no son estrictamente subconjuntos de = en la formulación de Codd, sino más bien la proyección de = -uniones).
Salida

7

Theta Join: cuando realiza una consulta para unirse usando cualquier operador (por ejemplo, =, <,>,> = etc.), esa consulta de unión se incluye en Theta join.

Equi Join: cuando realiza una consulta para unirse utilizando solo el operador de igualdad, esa consulta de unión se incluye en Equi join.

Ejemplo:

> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID;
> SELECCIONAR * DESDE Emp INNER JOIN Dept USANDO (DeptID)
Esto mostrará:
 _________________________________________________
| Emp.Name | Emp.DeptID | Dept.Name | Dept.DeptID |
| | | | |

Nota: ¡Equi join también es una combinación theta!

Natural Join: un tipo de Equi Join que se produce implícitamente al comparar todas las columnas con los mismos nombres en ambas tablas.

Nota: aquí, el resultado de la combinación tiene solo una columna para cada par de columnas del mismo nombre.

Ejemplo

 SELECCIONAR * DE Emp NATURAL JOIN Dept
Esto mostrará:
 _______________________________
| DeptID | Emp.Name | Dept.Name |
| | | |

1

El producto cartesiano de dos tablas da todas las posibles combinaciones de tuplas, como en el ejemplo de matemáticas, el producto cruzado de dos conjuntos. ya que muchas veces hay algunos valores basura que ocupan un espacio innecesario en la memoria también, así que aquí las uniones vienen al rescate que dan la combinación de solo aquellos valores de atributo que son requeridos y son significativos.

La unión interna da el campo repetido en la tabla dos veces, mientras que la unión natural aquí resuelve el problema simplemente filtrando las columnas repetidas y mostrándolas solo una vez. De lo contrario, ambos funcionan igual. La unión natural es más eficiente ya que conserva la memoria. Además, las redundancias se eliminan en la unión natural.

La combinación equi de dos tablas es tal que solo muestran las tuplas que coinciden con el valor de otra tabla. por ejemplo: sean dos tablas new1 y new2. si la consulta sql seleccione * de new1 únase a new2 en new1.id = new.id (id es la misma columna en dos tablas) entonces comience desde la tabla new2 y únase a la que coincida con la id en la segunda tabla. además, non equi join no tienen operador de igualdad tienen <,>, y entre operador.

theta join consta de todo el operador de comparación, incluido el operador de comparación igualdad y otros <,>. cuando usa el operador de igualdad (=) se conoce como equi join.


0

Unión natural: la unión natural puede ser posible cuando hay al menos un atributo común en dos relaciones.

Theta Join: Theta join puede ser posible cuando dos actúan en una condición particular.

Equi Join: Equi puede ser posible cuando dos actúan en condiciones de equidad. Es un tipo de unión theta.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.