Разница между тета-соединением, эквиджоин и естественным соединением - PullRequest
85 голосов
/ 24 октября 2011

У меня проблемы с пониманием реляционной алгебры, когда речь идет о тэта-соединениях, эквиджоинах и естественных соединениях.Может ли кто-нибудь помочь мне лучше понять это?Если я использую знак = на тэта-соединении, это точно так же, как просто использование естественного соединения?

Ответы [ 7 ]

127 голосов
/ 24 октября 2011

A тета-соединение допускает произвольные отношения сравнения (например, ≥).

equijoin - тета-соединение, использующее оператор равенства.

A естественное объединение - это эквивалентность атрибутов с одинаковыми именами в каждом отношении.

Кроме того, при естественном объединении удаляются дубликаты столбцов, участвующих в сравнении на равенство, поэтому остается только 1 из каждого сравниваемого столбца;в грубых алгебраических терминах: ⋈ = π<sub>R,S-<b>a</b><sub>s</sub></sub> ○ ⋈<sub><b>a</b><sub>R</sub>=<b>a</b><sub>S</sub></sub>

49 голосов
/ 06 марта 2013

Хотя ответы, объясняющие точные различия, хороши, я хочу показать, как реляционная алгебра преобразуется в SQL и какова действительная ценность этих трех концепций.

Ключевой концепцией в вашем вопросе является идея объединения. Чтобы понять объединение, вам нужно понять декартово произведение (пример основан на SQL, где эквивалент называется перекрестным соединением, как указывает один день);

Это не очень полезно на практике. Рассмотрим этот пример.

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

Декартово произведение Продукт x Компонент будет - ниже или sql fiddle . Вы можете видеть, что есть 12 рядов = 3 x 4. Очевидно, что строки типа «Ноутбук» с «колесами» не имеют значения, поэтому на практике редко используется декартово произведение.

|    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 |

СОЕДИНЕНИЯ здесь для того, чтобы повысить ценность этих продуктов. На самом деле мы хотим «объединить» продукт со связанными с ним компонентами, потому что каждый компонент принадлежит продукту. Это можно сделать с помощью соединения:

Product JOIN Component ON Pname

Соответствующий SQL-запрос будет выглядеть следующим образом (вы можете поиграть со всеми примерами здесь )

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

и результат:

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

Обратите внимание, что результат имеет только 4 строки, потому что у ноутбука 3 компонента, у автомобиля 1 и у самолета нет. Это гораздо полезнее.

Возвращаясь к вашим вопросам, все объединения, о которых вы спрашиваете, являются вариантами соединения, которое я только что показал:

Естественное объединение = объединение (предложение ON) выполняется для всех столбцов с одинаковым именем; он удаляет дубликаты столбцов из результата, в отличие от всех других объединений; большинство СУБД (систем баз данных, созданных различными поставщиками, такими как Microsoft SQL Server, Oracle MySQL и т. д.) даже не утруждают себя поддержкой, это просто плохая практика (или намеренно отказались от ее реализации). Представьте, что приходит разработчик и меняет имя второго столбца в разделе «Продукт» с «Цена на стоимость». Тогда все естественные объединения будут выполнены в PName AND на Cost, что приведет к 0 строкам, поскольку ни одно число не соответствует.

Theta Join = это общее объединение, которое используют все, потому что оно позволяет вам указать условие (предложение ON в SQL). Вы можете присоединиться практически к любым условиям, которые вам нравятся, например, к продуктам, которые имеют первые две одинаковые буквы или имеют другую цену. На практике это случается редко - в 95% случаев вы присоединитесь к условию равенства, что приводит нас к:

Equi Join = самый распространенный метод, используемый на практике. Пример выше - это равное соединение. Базы данных оптимизированы для этого типа соединений! Противоположность равноправного соединения - это неэквивалентное соединение, т. Е. Когда вы присоединяетесь при условии, отличном от «=». Базы данных не оптимизированы для этого! Они оба являются подмножествами общего тэта-соединения. Естественное соединение также является тета-соединением, но условие (тета) неявно.

Источник информации: университет + сертифицированный разработчик SQL Server + недавно завершил MOO "Введение в базы данных" из Стэнфорда, поэтому, смею сказать, у меня свежая реляционная алгебра.

14 голосов
/ 24 октября 2011

@ outis ответ хороший: лаконичный и правильный в отношении отношений.

Однако в отношении SQL ситуация несколько сложнее.

Рассмотрим обычную базу данных поставщиков и запчастей , но реализованную в SQL:

SELECT * FROM S NATURAL JOIN SP;

вернет набор результатов ** со столбцами

SNO, SNAME, STATUS, CITY, PNO, QTY

Объединение выполняется для столбца с одинаковым именем в обеих таблицах, SNO.Обратите внимание, что результирующий набор имеет шесть столбцов и содержит только один столбец для SNO.

Теперь рассмотрим тэта eqijoin, где имена столбцов для объединения должны быть явно указаны (плюс переменные диапазона S и SP обязательны):

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

В наборе результатов будет семь столбцов, включая два столбца для SNO.Имена набора результатов - это то, что стандарт SQL называет «зависимым от реализации», но может выглядеть так:

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

или, возможно, это

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

Другими словами, NATURAL JOIN в SQL может рассматриваться как удаление столбцов с дублированными именами из набора результатов (но, увы, не удалит дублирующиеся строки - вы должны помнить, чтобы изменить SELECT на SELECT DISTINCT самостоятельно).


** Я не совсем знаю, каков результат SELECT * FROM table_expression;.Я знаю, что это не отношение, потому что, среди других причин, в нем могут быть столбцы с повторяющимися именами или столбец без имени.Я знаю, что это не набор, потому что, среди прочих причин, порядок столбцов является значительным.Это даже не таблица SQL или выражение таблицы SQL.Я называю это набором результатов.

9 голосов
/ 24 октября 2011

Natural - это подмножество Equi, которое является подмножеством Theta.

Если я использую знак = на тэта-соединении, это точно так же, как просто используя естественное соединение ???

Не обязательно, но это будет Equi. Естественный означает, что вы сопоставляете все столбцы с одинаковыми именами, Equi просто означает, что вы используете исключительно '=' (а не 'меньше чем', например, и т. Д.)

Это чистая академия, хотя вы могли годами работать с реляционными базами данных и никогда не слышали, чтобы кто-либо использовал эти термины.

5 голосов
/ 02 марта 2017

Theta Join: Когда вы делаете запрос на объединение, используя любой оператор (например, =, <,>,> = и т. Д.), Тогда этот запрос присоединения относится к Theta join.

Equi Join: Когда вы создаете запрос на объединение, используя только оператор равенства, этот запрос присоединения относится к Equi join.

Пример:

> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID;
> SELECT * FROM Emp INNER JOIN Dept USING(DeptID)
This will show:
 _________________________________________________
| Emp.Name | Emp.DeptID | Dept.Name | Dept.DeptID |
|          |            |           |             |

Примечание: Equi-соединение также является тэта-соединением!

Natural Join: тип Equi-соединения, которое происходит неявно, сравнивая все столбцы с одинаковыми именами вобе таблицы.

Примечание: здесь результат объединения имеет только один столбец для каждой пары столбцов с одинаковыми именами.

Пример

SELECT * FROM Emp NATURAL JOIN Dept
This will show:
 _______________________________
| DeptID | Emp.Name | Dept.Name |
|        |          |           |
1 голос
/ 15 марта 2017

Декартово произведение двух таблиц дает все возможные комбинации кортежей, как пример в математике, перекрестное произведение двух множеств. поскольку много раз существуют некоторые ненужные значения, которые также занимают ненужное пространство в памяти, поэтому здесь выручают объединения, которые дают комбинацию только тех значений атрибута, которые являются обязательными и имеют смысл.

Внутреннее объединение дает повторное поле в таблице дважды, тогда как естественное объединение здесь решает проблему, просто фильтруя повторяющиеся столбцы и отображая его только один раз. Иначе, оба работают одинаково. естественное объединение является более эффективным, поскольку оно сохраняет память. Кроме того, избыточные соединения удаляются в естественном объединении.

равное объединение двух таблиц таково, что они отображают только те кортежи, которые соответствуют значению в другой таблице. например : пусть new1 и new2 будут двумя таблицами. если запрос sql выбрать * из new1, присоединить new2 к new1.id = new.id (id - это один и тот же столбец в двух таблицах), затем начать с таблицы new2 и выполнить соединение, соответствующее идентификатору во второй таблице. кроме того, неэквивалентное объединение не имеет оператора равенства, который они имеют <,> и между оператором.

тета-соединение состоит из всех операторов сравнения, включая оператор сравнения равенства и другие <,>. когда он использует оператор равенства (=), он называется equi join.

0 голосов
/ 21 сентября 2017

Естественное объединение: Естественное объединение возможно при наличии хотя бы одного общего атрибута в двух отношениях.

Тета-соединение: Тета-соединение возможно при двух действиях при определенных условиях.

Equi Join: Equi может быть возможным, когда два действуют на условие эквити.Это один из типов тета-соединения.

...