Разница между тета-соединением, равным соединением и естественным соединением


98

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


Что касается рассматриваемой цитаты из награды ... он не цитирует Кодда, он цитирует мой ответ, под которым находится его комментарий.
heisenberg

Ответы:


144

Тета присоединиться допускает произвольные отношения сравнения (таких как ≥).

Эквисоединения является тэта присоединиться с помощью оператора равенства.

Естественное соединение является эквисоединением атрибутов , которые имеют такое же имя , в каждом отношениях.

Кроме того, естественное соединение удаляет повторяющиеся столбцы, участвующие в сравнении равенства, поэтому остается только 1 из каждого сравниваемого столбца; в грубых реляционно-алгебраических терминах: ⋈ = πR,S-as ○ ⋈aR=aS


13
естественное соединение удалит столбцы с тем же именем
Богдан Гаврил MSFT

2
Все или все, кроме одного?
Кристофер Шроба,

Equijoin также удалит столбец равенства, если они имеют одинаковое имя в обеих таблицах.
Vishal R

1
@outis, что значит "тета" в "тета-соединении"?
Pacerier

2
@Pacerier: Исторически сложилось так, что thetaтета-соединение относится к произвольному условию, используемому в качестве критерия для соединения. (см. «Системы баз данных: Полная книга» Гарсиа-Молина, Ульман, Уидом, глава 2, Тета
Джоин

59

Хотя ответы, объясняющие точные различия, прекрасны, я хочу показать, как реляционная алгебра преобразуется в 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

Декартово произведение Product x Component будет ниже или 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 |

Присоединяйтесь к нам, чтобы повысить ценность этих продуктов. На самом деле мы хотим «соединить» продукт со связанными с ним компонентами, потому что каждый компонент принадлежит продукту. Это можно сделать с помощью соединения:

Продукт 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, а у самолета - нет. Это намного полезнее.

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

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

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

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

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


1
Вы используете термин «декартово произведение» несколько вольно. Результатом реляционного оператора является отношение (как и все реляционные операторы!). CROSS JOINРезультатом операции в SQL является табличное выражение (строки столбцов). Операция над множеством Декартово произведение приводит к набору пар.
однажды, когда 06

1
Когда вы говорите «Базы данных», вы на самом деле имеете в виду «СУБД», что является решающим различием при рассмотрении «концепций».
однажды, когда 06

2
onedaywhen - спасибо за все полезные комментарии! похоже на обзор кода :). Исправил декартово произведение и проблемы с СУБД. Я придерживаюсь своего мнения, что естественные объединения представляют только академический интерес, а важные СУБД, такие как SQL Server, не реализуют это намеренно - добавление условия явно приводит к лучшему пониманию и обслуживанию кода. Связанный вопрос: stackoverflow.com/questions/4826613/natural-join-in-sql-server
Богдан Гаврил MSFT

1
@HLGEM: можно было бы привести аналогичные аргументы против SELECT * FROM... (и, возможно, вы это делаете). Но он есть в языке, он есть в каждой реализации SQL, и я часто его использую (и держу пари, что вы тоже!). Подсказка, не весь код является производственным.
однажды, когда

1
Настоящая проблема с «естественным» объединенным столбцом заключается не в изменении имен, а в добавлении новых, которые не должны конфликтовать между всеми возможно объединенными таблицами в системе. Возьмите очень распространенные столбцы, такие как «имя», «описание», ... Использование «естественного соединения» приведет к их объединению, тогда как это будет бессмысленно и не только противоречит бизнес-логике и приведет к ошибке. Так что да, «естественное соединение» опасно. Это заставляет вас иметь разные имена, за исключением столбцов (первичного / внешнего) ключа, и теряет «интервал между именами».
LoganMzz 08

13

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

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

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

SELECT * FROM S NATURAL JOIN SP;

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

SNO, SNAME, STATUS, CITY, PNO, QTY

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

Теперь рассмотрим theta 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. Я называю это набором результатов.


То же самое и с JOIN ... USING(...).
Бенуа,

Почему вы говорите: «Я не совсем понимаю, каков результат SELECT * FROM table_expression;» ?
Pacerier

@Pacerier: эээ, потому что я не знаю, что это такое! В прошлый раз, когда я смотрел, стандарт SQL избегал определения того, что это такое. Я знаю, чем это не является (не отношение, не набор, не таблица, не табличное выражение). Поэтому для удобства я использовал свой собственный термин «набор результатов». Обратите внимание, что в реляционной модели результатом операции с двумя отношениями является отношение. Эквивалентное утверждение не может быть выполнено для SQL AFAIK.
однажды,

11

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

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

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

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


Я подозреваю, что когда вы говорите «реляционные базы данных», я подозреваю, что вы имеете в виду что-то еще, например, «SQL».
однажды, когда

Не академическая работа с реляционными базами данных без SQL? Итак, какие продукты вы имеете в виду?
однажды, когда

3
В исходной алгебре Кодда естественное соединение является фундаментальным типом соединения, тогда как равноправное или тета- «соединение» является сокращением для NJ (например, перекрестное произведение), за которым следует ограничение. «Natural - это подмножество Equi, которое является подмножеством Theta», по- видимому, это означает, что каждый NJ также может быть выражен как EJ или TJ. Я полагаю, что это правда, если σ 1 = 1 (A x B) считается равным соединением, и в этом случае каждая операция реляционной алгебры может быть выражена как эквисоединение в этой форме. Неоднозначность здесь заключается в том, что существует более одного возможного набора фундаментальных операторов для RA.
nvogel

2
@EricFail: sqlvogel просто цитирует ответ Кекекелы, а не что-либо из Кодда. Если вам нужна дополнительная информация о работах Кодда о соединениях (θ или иначе), вы можете попробовать «Реляционную модель для управления базами данных» или пройтись по его библиографии .
outis 05

1
... На вопрос, на который вы ссылаетесь, есть ответ, который приближается к тому, что вы ищете, вероятно, настолько близко, насколько это возможно. Он связан с относительной полнотой подъязыков базы данных . На стр. 10 описана связь между θ, = и естественными соединениями (хотя в формулировке Кодда натуральные - это не строго подмножества =, а скорее проекция = -соединений).
outis 05

8

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

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

Пример:

> ВЫБРАТЬ * ИЗ Emp JOIN Dept ON Emp.DeptID = Dept.DeptID;
> ВЫБРАТЬ * ИЗ Emp INNER JOIN Dept USING (DeptID)
Это покажет:
 _________________________________________________
| Emp.Name | Emp.DeptID | Название отдела | Dept.DeptID |
| | | | |

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

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

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

пример

 ВЫБРАТЬ * ИЗ ОТДЕЛА Emp NATURAL JOIN
Это покажет:
 _______________________________
| DeptID | Emp.Name | Название отдела |
| | | |

1

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

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

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

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


0

Естественное соединение: естественное соединение возможно, когда в двух отношениях есть хотя бы один общий атрибут.

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.