Unterschied zwischen einer Theta-Verbindung, einer Equijoin-Verbindung und einer natürlichen Verbindung


92

Ich habe Probleme, die relationale Algebra zu verstehen, wenn es um Theta-Verknüpfungen, Equijoins und natürliche Verknüpfungen geht. Könnte mir bitte jemand helfen, es besser zu verstehen? Wenn ich das = -Zeichen für einen Theta-Join verwende, ist es genau das Gleiche wie für einen natürlichen Join?


Zu dem fraglichen Zitat aus dem Kopfgeld ... er zitiert dort nicht Codd, er zitiert aus meiner Antwort, unter der sein Kommentar erscheint.
Heisenberg

Antworten:


138

Ein Theta-Join ermöglicht beliebige Vergleichsbeziehungen (z. B. ≥).

Ein Equijoin ist eine Theta-Verknüpfung mit dem Gleichheitsoperator.

Ein natürlicher Join ist ein Äquivalent zu Attributen, die in jeder Beziehung denselben Namen haben.

Zusätzlich entfernt eine natürliche Verknüpfung die doppelten Spalten, die am Gleichheitsvergleich beteiligt sind, sodass nur 1 von jeder verglichenen Spalte übrig bleibt. in groben relationalen algebraischen Begriffen: ⋈ = πR,S-as ○ ⋈aR=aS


13
Die natürliche Verknüpfung entfernt die gleichnamigen Spalten
Bogdan Gavril MSFT

2
Alle oder alle bis auf einen?
Christopher Shroba

Equijoin entfernt auch die Gleichheitsspalte, wenn sie in beiden Tabellen denselben Namen haben.
Vishal R

1
@outis, Was bedeutet "Theta" in "Theta Join"?
Pacerier

2
@Pacerier: Historisch gesehen thetabezieht sich der In-Theta-Join auf eine beliebige Bedingung, die als Kriterium für den Join verwendet wird. (Siehe Datenbanksysteme: Das vollständige Buch von Garcia-Molina, Ullman, Widom, Kapitel 2, Theta Join)
Ram Rajamony

55

Während die Antworten, die die genauen Unterschiede erklären, in Ordnung sind, möchte ich zeigen, wie die relationale Algebra in SQL umgewandelt wird und wie der tatsächliche Wert der drei Konzepte ist.

Das Schlüsselkonzept in Ihrer Frage ist die Idee eines Joins. Um einen Join zu verstehen, müssen Sie ein kartesisches Produkt verstehen (das Beispiel basiert auf SQL, wobei das Äquivalent als Cross-Join bezeichnet wird, wie an einem Tag, wenn darauf hingewiesen wird).

Dies ist in der Praxis nicht sehr nützlich. Betrachten Sie dieses Beispiel.

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

Das kartesische Produkt Product x Component ist unten oder SQL Geige . Sie können sehen, dass es 12 Zeilen = 3 x 4 gibt. Offensichtlich haben Zeilen wie "Laptop" mit "Rädern" keine Bedeutung, weshalb das kartesische Produkt in der Praxis selten verwendet wird.

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

JOINs sind hier, um diesen Produkten mehr Wert zu verleihen. Was wir wirklich wollen, ist, das Produkt mit den zugehörigen Komponenten zu "verbinden", da jede Komponente zu einem Produkt gehört. Der Weg, dies zu tun, ist mit einem Join:

Produkt JOIN-Komponente EIN Pname

Die zugehörige SQL - Abfrage wäre wie folgt aus (Sie mit allen Beispielen spielen hier )

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

und das Ergebnis:

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

Beachten Sie, dass das Ergebnis nur 4 Zeilen enthält, da der Laptop 3 Komponenten hat, das Auto 1 und das Flugzeug keine. Das ist viel nützlicher.

Zurück zu Ihren Fragen: Alle Joins, nach denen Sie fragen, sind Variationen des JOIN, den ich gerade gezeigt habe:

Natural Join = Der Join (die ON-Klausel) wird für alle Spalten mit demselben Namen ausgeführt. Im Gegensatz zu allen anderen Verknüpfungen werden doppelte Spalten aus dem Ergebnis entfernt. Die meisten DBMS (Datenbanksysteme, die von verschiedenen Anbietern wie Microsoft SQL Server, Oracle MySQL usw. erstellt wurden) unterstützen dies nicht einmal, es ist nur eine schlechte Praxis (oder sie haben sich absichtlich entschieden, sie nicht zu implementieren). Stellen Sie sich vor, ein Entwickler kommt und ändert den Namen der zweiten Spalte im Produkt von Preis zu Kosten. Dann würden alle natürlichen Verknüpfungen auf PName UND auf Kosten durchgeführt, was zu 0 Zeilen führt, da keine Zahlen übereinstimmen.

Theta Join = Dies ist der allgemeine Join, den jeder verwendet, da Sie damit die Bedingung angeben können (die ON-Klausel in SQL). Sie können unter so ziemlich jeder Bedingung beitreten, die Sie möchten, zum Beispiel bei Produkten, bei denen die ersten beiden Buchstaben ähnlich sind oder die einen anderen Preis haben. In der Praxis ist dies selten der Fall - in 95% der Fälle treten Sie unter der Bedingung der Gleichstellung bei, was uns zu folgenden Ergebnissen führt:

Equi Join = die in der Praxis am häufigsten verwendete. Das obige Beispiel ist ein Equi-Join. Datenbanken sind für diese Art von Joins optimiert! Das Gegenteil eines Equi-Joins ist ein Nicht-Equi-Join, dh wenn Sie unter einer anderen Bedingung als "=" beitreten. Datenbanken sind dafür nicht optimiert! Beide sind Teilmengen des allgemeinen Theta-Joins. Die natürliche Verbindung ist auch eine Theta-Verbindung, aber die Bedingung (die Theta) ist implizit.

Informationsquelle: Universität + zertifizierter SQL Server-Entwickler + hat kürzlich die MOO "Einführung in Datenbanken" von Stanford abgeschlossen, also wage ich zu sagen, dass ich die relationale Algebra im Auge habe.


1
Sie verwenden den Begriff "kartesisches Produkt" etwas locker. Das relationale Operatorprodukt führt zu einer Beziehung (gemeinsam mit allen relationalen Operatoren!). Eine CROSS JOINOperation in SQL führt zu einem Tabellenausdruck (Spaltenzeilen). Die Set-Operation Kartesisches Produkt führt zu einer Menge von Paaren.
Tag, wenn

1
Wenn Sie "Datenbanken" sagen, meinen Sie tatsächlich "DBMS", ein entscheidender Unterschied bei der Behandlung der "Konzepte".
Tag, wenn

2
onedaywhen - danke für all die nützlichen Kommentare! fühlt sich an wie eine Codeüberprüfung :). Ich habe die kartesischen Produkt- und DBMS-Probleme behoben. Ich bin der Meinung, dass natürliche Verknüpfungen nur von akademischem Interesse sind und wichtige DBMS wie SQL Server dies nicht absichtlich implementieren. Das Hinzufügen einer Bedingung führt explizit zu einem besseren Verständnis und einer besseren Wartung des Codes. Eine verwandte Frage: stackoverflow.com/questions/4826613/natural-join-in-sql-server
Bogdan Gavril MSFT

1
@HLGEM: Man könnte ähnliche Argumente dagegen vorbringen SELECT * FROM...(und vielleicht auch Sie). Aber es ist in der Sprache, es ist in jeder SQL-Implementierung und ich benutze es oft (und ich wette, dass Sie es auch tun!). Hinweis: Nicht jeder Code ist Produktionscode.
Tag, wenn

1
Das eigentliche Problem bei "natürlichen" verknüpften Spalten besteht nicht darin, Namen zu ändern, sondern neue hinzuzufügen, die nicht zwischen allen möglicherweise verknüpften Tabellen im System in Konflikt stehen dürfen. Nehmen Sie sehr gebräuchliche Spalten wie "Name", "Beschreibung", ... Wenn Sie "Natural Join" verwenden, werden sie verbunden, während dies Unsinn macht und mehr gegen die Geschäftslogik verstößt und zu Fehlern führt. Also ja, "natürliche Verbindung" ist gefährlich. Es zwingt Sie dazu, eindeutige Namen mit Ausnahme von (Primär- / Fremd-) Schlüsselspalten zu haben und den "Namensabstand" zu verlieren.
LoganMzz

14

Die Antwort von @ outis ist gut: prägnant und korrekt in Bezug auf die Beziehungen.

In Bezug auf SQL ist die Situation jedoch etwas komplizierter.

Betrachten Sie die übliche Lieferanten- und Teiledatenbank, die jedoch in SQL implementiert ist:

SELECT * FROM S NATURAL JOIN SP;

würde eine Ergebnismenge ** mit Spalten zurückgeben

SNO, SNAME, STATUS, CITY, PNO, QTY

Der Join wird für die gleichnamige Spalte in beiden Tabellen ausgeführt SNO. Beachten Sie, dass die Ergebnismenge sechs Spalten enthält und nur eine Spalte für enthält SNO.

Betrachten Sie nun ein Theta-Äquivalent, bei dem die Spaltennamen für den Join explizit angegeben werden müssen (plus Bereichsvariablen Sund SPerforderlich):

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

Die Ergebnismenge enthält sieben Spalten, darunter zwei Spalten für SNO. Die Namen der Ergebnismenge werden vom SQL-Standard als "implementierungsabhängig" bezeichnet, könnten jedoch folgendermaßen aussehen:

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

oder vielleicht das hier

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

Mit anderen Worten NATURAL JOINkann in SQL betrachtet werden Spalten mit duplizierten Namen aus dem Suchresultates entfernen (aber leider nicht entfernen doppelte Zeilen - Sie müssen Änderungen erinnern SELECTan SELECT DISTINCTsich selbst).


** Ich weiß nicht genau, was das Ergebnis SELECT * FROM table_expression;ist. Ich weiß, dass es sich nicht um eine Beziehung handelt, da sie unter anderem Spalten mit doppelten Namen oder eine Spalte ohne Namen enthalten kann. Ich weiß, dass es sich nicht um eine Menge handelt, da unter anderem die Spaltenreihenfolge von Bedeutung ist. Es ist nicht einmal eine SQL-Tabelle oder ein SQL-Tabellenausdruck. Ich nenne es eine Ergebnismenge.


Gleiches gilt für JOIN ... USING(...).
Benoit

Warum sagst du "Ich weiß nicht genau, was das Ergebnis SELECT * FROM table_expression;ist" ?
Pacerier

@ Pacerier: ähm, weil ich nicht weiß was es ist! Beim letzten Mal hat der SQL-Standard vermieden, zu definieren, was es ist. Ich weiß, was es nicht ist (keine Beziehung, keine Menge, keine Tabelle, kein Tabellenausdruck). Zur Vereinfachung der Bezugnahme habe ich meinen eigenen Begriff "Ergebnismenge" verwendet. Beachten Sie, dass im relationalen Modell das Ergebnis einer Operation mit zwei Beziehungen eine Beziehung ist. Die entsprechende Aussage kann für SQL AFAIK nicht gemacht werden.
Tag, wenn

11

Natürlich ist eine Teilmenge von Equi, die eine Teilmenge von Theta ist.

Wenn ich das = -Zeichen für einen Theta-Join verwende, ist es genau das gleiche wie für einen natürlichen Join?

Nicht unbedingt, aber es wäre ein Equi. Natürlich bedeutet, dass Sie mit allen ähnlich benannten Spalten übereinstimmen. Equi bedeutet nur, dass Sie ausschließlich '=' verwenden (und nicht 'kleiner als', wie usw.).

Dies ist jedoch eine reine akademische Angelegenheit. Sie könnten jahrelang mit relationalen Datenbanken arbeiten und nie jemanden hören, der diese Begriffe verwendet.


Ich vermute, wenn Sie "relationale Datenbanken" sagen, meinen Sie etwas anderes, z. B. "SQL".
Tag, wenn

Arbeiten, die keine Wissenschaft sind, mit relationalen Datenbanken, die nicht SQL sind? Also, welche Produkte meinst du?
Tag, wenn

3
In Codds ursprünglicher Algebra ist die natürliche Verknüpfung die grundlegende Art der Verknüpfung, während eine gleich- oder theta- "Verknüpfung" eine Abkürzung für ein NJ (z. B. ein Kreuzprodukt) ist, gefolgt von einer Einschränkung. "Natürlich ist eine Teilmenge von Equi, die eine Teilmenge von Theta ist", was vermutlich bedeutet, dass jeder NJ auch als EJ oder TJ ausgedrückt werden könnte. Ich nehme an, dass dies wahr ist, wenn σ 1 = 1 (A x B) als Äquijoin zählt. In diesem Fall könnte jede Operation der relationalen Algebra als Equijoin in dieser Form ausgedrückt werden. Die Mehrdeutigkeit besteht darin, dass es mehr als einen möglichen Satz grundlegender Operatoren für die RA gibt.
Nvogel

2
@EricFail: sqlvogel zitiert nur Kekekelas Antwort und nicht irgendetwas von Codd. Wenn Sie mehr über Codds Schriften über Joins (θ oder anders) erfahren möchten, können Sie "Das relationale Modell für die Datenbankverwaltung" ausprobieren oder sich durch seine Bibliographie arbeiten .
Outis

1
... Die Frage, auf die Sie verlinken, hat eine Antwort, die dem nahe kommt, wonach Sie suchen, wahrscheinlich so nah wie möglich. Es verweist auf die relationale Vollständigkeit von Datenbanksprachen . S. 10 beschreibt die Verbindung zwischen θ, = und natürlichen Verknüpfungen (obwohl natürliche nicht streng Teilmengen von = in Codds Formulierung sind, sondern die Projektion von = -verbindungen).
Outis

7

Theta-Join: Wenn Sie mit einem beliebigen Operator (z. B. =, <,>,> = usw.) eine Abfrage für den Join durchführen, fällt diese Join-Abfrage unter den Theta-Join.

Equi Join: Wenn Sie eine Abfrage für den Join nur mit dem Gleichheitsoperator durchführen, wird diese Join-Abfrage unter Equi Join angezeigt.

Beispiel:

> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID;
> SELECT * FROM Emp INNER JOIN Abteilung USING (DeptID)
Dies wird zeigen:
 _________________________________________________
| Emp.Name | Emp.DeptID | Dept.Name | Dept.DeptID |
| | | | |

Hinweis: Equi Join ist auch ein Theta Join!

Natürlicher Join: Ein Typ von Equi Join, der implizit durch Vergleichen aller Spalten mit denselben Namen in beiden Tabellen erfolgt.

Hinweis: Hier enthält das Verknüpfungsergebnis nur eine Spalte für jedes Paar gleichnamiger Spalten.

Beispiel

 SELECT * FROM Emp NATURAL JOIN Dept.
Dies wird zeigen:
 _______________________________
| DeptID | Emp.Name | Dept.Name |
| | | |

1

Das kartesische Produkt zweier Tabellen gibt allen möglichen Kombinationen von Tupeln wie im Beispiel in der Mathematik das Kreuzprodukt zweier Mengen. da es oft einige Junk-Werte gibt, die auch unnötigen Speicherplatz im Speicher belegen, kommen hier Joins zur Rettung, die nur die Kombination der Attributwerte ergeben, die erforderlich und sinnvoll sind.

Inner Join gibt das wiederholte Feld in der Tabelle zweimal an, während Natural Join hier das Problem löst, indem nur die wiederholten Spalten gefiltert und nur einmal angezeigt werden. Andernfalls funktionieren beide gleich. Natural Join ist effizienter, da der Speicher erhalten bleibt. Außerdem werden Redundanzen bei Natural Join entfernt.

Die Equi-Verknüpfung zweier Tabellen ist so, dass nur die Tupel angezeigt werden, die dem Wert in einer anderen Tabelle entsprechen. Beispiel: Lassen Sie new1 und new2 zwei Tabellen sein. Wenn die SQL-Abfrage * aus new1 auswählen, verbinden Sie new2 mit new1.id = new.id (ID ist dieselbe Spalte in zwei Tabellen), beginnen Sie mit der Tabelle new2 und verbinden Sie sich mit der ID in der zweiten Tabelle. Außerdem haben Nicht-Equi-Joins keinen Gleichheitsoperator, den sie <,> und zwischen Operatoren haben.

Der Theta-Join besteht aus allen Vergleichsoperatoren einschließlich Gleichheit und anderen <,> Vergleichsoperatoren. Wenn der Gleichheitsoperator (=) verwendet wird, spricht man von Equi Join.


0

Natürliche Verknüpfung: Natürliche Verknüpfung kann möglich sein, wenn in zwei Beziehungen mindestens ein gemeinsames Attribut vorhanden ist.

Theta-Join: Theta-Join kann möglich sein, wenn zwei unter bestimmten Bedingungen agieren.

Equi Join: Equi kann möglich sein, wenn zwei unter Eigenkapitalbedingungen handeln. Es ist eine Art von Theta-Join.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.