Perbedaan antara gabungan theta, equijoin, dan gabungan alami


95

Saya mengalami kesulitan memahami aljabar relasional dalam hal gabungan theta, equijoins, dan gabungan natural. Bisakah seseorang membantu saya lebih memahaminya? Jika saya menggunakan tanda = pada gabungan theta apakah sama persis dengan hanya menggunakan gabungan alami?


re kutipan yang dipertanyakan dari bounty ... dia tidak mengutip Codd di sana, dia mengutip dari jawaban saya bahwa komentarnya muncul di bawah.
heisenberg

Jawaban:


141

Sebuah theta bergabung memungkinkan untuk hubungan perbandingan sewenang-wenang (seperti ≥).

Sebuah Equijoin adalah theta bergabung menggunakan operator kesetaraan.

Gabungan alami adalah equijoin pada atribut yang memiliki nama yang sama di setiap hubungan.

Selain itu, gabungan alami menghapus kolom duplikat yang terlibat dalam perbandingan kesetaraan sehingga hanya tersisa 1 dari setiap kolom yang dibandingkan; dalam istilah aljabar relasional kasar: ⋈ = πR,S-as ○ ⋈aR=aS


13
gabungan alami akan menghapus kolom dengan nama yang sama
Bogdan Gavril MSFT

2
Semuanya, atau semuanya kecuali satu?
Christopher Shroba

Equijoin juga akan menghapus kolom kesetaraan jika memiliki nama yang sama di kedua tabel.
Vishal R

1
@outis, Apa arti "theta" dalam "theta join"?
Pacerier

2
@Pacerier: Secara historis, thetagabungan in theta mengacu pada kondisi arbitrer yang digunakan sebagai kriteria untuk gabungan. (lihat Sistem Database: Buku Lengkap oleh Garcia-Molina, Ullman, Widom, bab 2, Theta Join)
Ram Rajamony

58

Meskipun jawaban yang menjelaskan perbedaan pastinya baik-baik saja, saya ingin menunjukkan bagaimana aljabar relasional diubah menjadi SQL dan berapa nilai sebenarnya dari 3 konsep tersebut.

Konsep kunci dalam pertanyaan Anda adalah gagasan bergabung. Untuk memahami gabungan, Anda perlu memahami Produk Cartesian (contoh didasarkan pada SQL di mana padanannya disebut gabungan silang seperti yang ditunjukkan onedaywhen);

Ini tidak terlalu berguna dalam praktiknya. Pertimbangkan contoh ini.

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

Produk Kartesius Produk x Komponen akan - di bawah atau sumbu sql . Bisa dilihat ada 12 baris = 3 x 4. Ternyata baris seperti "Laptop" dengan "roda" tidak ada artinya, inilah mengapa dalam prakteknya produk Cartesian jarang digunakan.

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

GABUNG di sini untuk menambah nilai lebih pada produk ini. Yang benar-benar kami inginkan adalah "menggabungkan" produk dengan komponen terkaitnya, karena setiap komponen adalah milik suatu produk. Cara melakukannya adalah dengan bergabung:

Produk GABUNG Komponen PADA Pname

Kueri SQL terkait akan seperti ini (Anda dapat bermain dengan semua contoh di sini )

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

dan hasilnya:

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

Perhatikan bahwa hasilnya hanya 4 baris, karena Laptop memiliki 3 komponen, Mobil memiliki 1 dan Airplane tidak ada. Ini jauh lebih berguna.

Kembali ke pertanyaan Anda, semua gabungan yang Anda tanyakan adalah variasi dari JOIN yang baru saja saya tunjukkan:

Natural Join = gabungan (klausa ON) dibuat pada semua kolom dengan nama yang sama; itu menghapus kolom duplikat dari hasil, sebagai lawan dari semua gabungan lainnya; kebanyakan DBMS (sistem database yang dibuat oleh berbagai vendor seperti Microsoft SQL Server, Oracle's MySQL, dll.) bahkan tidak perlu repot-repot mendukung ini, ini hanya praktik yang buruk (atau sengaja memilih untuk tidak mengimplementasikannya). Bayangkan seorang pengembang datang dan mengubah nama kolom kedua di Produk dari Harga menjadi Biaya. Kemudian semua gabungan natural akan dilakukan pada PName AND pada Cost, menghasilkan 0 baris karena tidak ada angka yang cocok.

Theta Join = ini adalah gabungan umum yang digunakan semua orang karena memungkinkan Anda untuk menentukan kondisi (klausa ON dalam SQL). Anda dapat bergabung dalam kondisi apa pun yang Anda suka, misalnya pada Produk yang memiliki 2 huruf pertama yang serupa, atau yang memiliki harga berbeda. Dalam praktiknya, ini jarang terjadi - dalam 95% kasus, Anda akan bergabung dalam kondisi kesetaraan, yang mengarahkan kami ke:

Equi Join = yang paling umum digunakan dalam latihan. Contoh di atas adalah equi join. Database dioptimalkan untuk jenis gabungan ini! Kebalikan dari gabungan eku adalah gabung non-eku, yaitu saat Anda bergabung pada kondisi selain "=". Database tidak dioptimalkan untuk ini! Keduanya adalah himpunan bagian dari gabungan theta umum. Gabungan alami juga merupakan gabungan theta tetapi kondisinya (theta) tersirat.

Sumber informasi: universitas + pengembang SQL Server bersertifikat + baru saja menyelesaikan MOO "Pengantar database" dari Stanford, jadi saya berani mengatakan bahwa saya memiliki aljabar relasional yang segar dalam pikiran.


1
Anda menggunakan istilah 'produk Cartesian' secara longgar. Produk operator relasional menghasilkan relasi (sama dengan semua operator relasional!) CROSS JOINOperasi dalam SQL menghasilkan ekspresi tabel (baris kolom). Operasi himpunan hasil produk Cartesian dalam satu set pasangan.
onedaywhen

1
Ketika Anda mengatakan "Database" yang Anda maksud adalah "DBMS", perbedaan penting saat membahas 'konsep'.
onedaywhen

2
onedaywhen - terima kasih atas semua komentar berguna! terasa seperti review kode :). Saya memperbaiki masalah produk cartesian dan DBMS. Saya mempertahankan pendapat saya bahwa gabungan alami hanya untuk kepentingan akademis dan DBMS penting seperti SQL Server tidak mengimplementasikan ini dengan sengaja - menambahkan kondisi secara eksplisit mengarah pada pemahaman dan pemeliharaan kode yang lebih baik. Pertanyaan terkait: stackoverflow.com/questions/4826613/natural-join-in-sql-server
Bogdan Gavril MSFT

1
@HLGEM: orang dapat membuat argumen serupa melawan SELECT * FROM...(dan mungkin Anda melakukannya). Tetapi dalam bahasa, itu ada dalam setiap implementasi SQL dan saya sering menggunakannya (dan saya yakin Anda juga melakukannya!). Petunjuk tidak semua kode adalah kode produksi.
onedaywhen

1
Masalah sebenarnya dengan kolom gabungan "natural" bukanlah tentang mengubah nama tetapi menambahkan yang baru yang tidak boleh konflik antara semua tabel yang mungkin digabungkan dalam sistem. Ambil kolom yang sangat umum seperti "nama", "deskripsi", ... Menggunakan "gabungan alami" akan membuat mereka bergabung sedangkan itu membuat omong kosong dan lebih banyak lagi bertentangan dengan logika bisnis dan menyebabkan kesalahan. Jadi ya, "gabungan alami" itu berbahaya. Ini memaksa Anda untuk memiliki nama yang berbeda kecuali untuk kolom kunci (utama / asing) dan kehilangan "spasi nama".
LoganMzz

14

Jawaban @ outis bagus: ringkas dan benar dalam hal relasi.

Namun, situasinya sedikit lebih rumit sehubungan dengan SQL.

Pertimbangkan pemasok biasa dan database suku cadang tetapi diimplementasikan dalam SQL:

SELECT * FROM S NATURAL JOIN SP;

akan mengembalikan kumpulan hasil ** dengan kolom

SNO, SNAME, STATUS, CITY, PNO, QTY

Gabungan dilakukan pada kolom dengan nama yang sama di kedua tabel SNO,. Perhatikan bahwa kumpulan hasil memiliki enam kolom dan hanya berisi satu kolom untuk SNO.

Sekarang pertimbangkan theta eqijoin, di mana nama kolom untuk gabungan harus ditentukan secara eksplisit (ditambah variabel rentang Sdan SPdiperlukan):

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

Kumpulan hasil akan memiliki tujuh kolom, termasuk dua kolom untuk SNO. Nama kumpulan hasil adalah apa yang disebut Standar SQL sebagai "dependen implementasi" tetapi bisa terlihat seperti ini:

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

atau mungkin ini

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

Dengan kata lain, NATURAL JOINdalam SQL dapat dianggap untuk menghapus kolom dengan nama digandakan dari ResultSet (tapi sayangnya tidak akan menghapus duplikat baris - Anda harus ingat untuk perubahan SELECTke SELECT DISTINCTdiri sendiri).


** Saya tidak begitu tahu apa hasilnya SELECT * FROM table_expression;. Saya tahu ini bukan relasi karena, di antara alasan lain, dapat memiliki kolom dengan nama duplikat atau kolom tanpa nama. Saya tahu ini bukan satu set karena, di antara alasan lain, urutan kolomnya signifikan. Ini bahkan bukan tabel SQL atau ekspresi tabel SQL. Saya menyebutnya kumpulan hasil.


Hal yang sama berlaku untuk JOIN ... USING(...).
Benoit

Mengapa Anda mengatakan "Saya tidak begitu tahu apa hasilnya SELECT * FROM table_expression;" ?
Pacerier

@Pacerier: erm, karena saya tidak tahu apa itu! Terakhir kali saya melihat, Standar SQL menghindari mendefinisikan apa itu. Saya tahu apa yang bukan (bukan relasi, bukan set, bukan tabel, bukan ekspresi tabel). Jadi untuk kemudahan referensi saya menggunakan istilah saya sendiri, 'resultset'. Perhatikan bahwa dalam model relasional hasil operasi yang melibatkan dua relasi adalah relasi. Pernyataan yang setara tidak dapat dibuat untuk SQL AFAIK.
onedaywhen

11

Natural adalah bagian dari Equi yang merupakan bagian dari Theta.

Jika saya menggunakan tanda = pada gabungan theta apakah sama persis dengan hanya menggunakan gabungan alami ???

Belum tentu, tapi itu akan menjadi Equi. Natural berarti Anda mencocokkan semua kolom dengan nama yang mirip, Equi berarti Anda menggunakan '=' secara eksklusif (dan tidak 'kurang dari', suka, dll.)

Ini murni akademisi, Anda dapat bekerja dengan database relasional selama bertahun-tahun dan tidak pernah mendengar siapa pun menggunakan istilah ini.


Saya menduga bahwa ketika Anda mengatakan "database relasional" Saya curiga yang Anda maksud adalah sesuatu yang lain, misalnya "SQL".
onedaywhen

Pekerjaan yang bukan akademisi dengan database relasional yang bukan SQL? Jadi, produk apa yang Anda maksud?
onedaywhen

3
Dalam aljabar asli Codd, gabungan alami adalah jenis gabungan dasar sedangkan "gabungan" atau ekuivalen adalah singkatan dari NJ (misalnya perkalian silang) diikuti oleh pembatasan. "Natural adalah bagian dari Equi yang merupakan bagian dari Theta" mungkin artinya bahwa setiap NJ juga dapat diekspresikan sebagai EJ atau TJ. Saya kira itu benar jika σ 1 = 1 (A x B) dihitung sebagai equijoin, dalam hal ini setiap operasi aljabar relasional dapat diekspresikan sebagai equijoin dalam bentuk tersebut. Kerancuan di sini adalah bahwa ada lebih dari satu kemungkinan set operator fundamental untuk RA.
nvogel

2
@EricFail: sqlvogel hanya mengutip jawaban kekekela, bukan apa pun dari Codd. Jika Anda ingin lebih banyak tentang tulisan Codd tentang join (θ atau sebaliknya), Anda dapat mencoba "Model Relasional untuk Manajemen Database", atau mempelajari bibliografinya .
outis

1
... Pertanyaan yang Anda tautkan memiliki jawaban yang mendekati apa yang Anda cari, mungkin sedekat mungkin. Ini menautkan ke Kelengkapan Relasional dari Bahasa Dasar Basis Data . P. 10 menjelaskan hubungan antara θ, = dan gabungan natural (meskipun natural tidak secara ketat merupakan himpunan bagian dari = dalam formulasi Codd, melainkan proyeksi dari = -joins).
outis

7

Theta Join: Ketika Anda membuat kueri untuk bergabung menggunakan operator apa pun, (misalnya, =, <,>,> = dll.), Maka kueri gabungan itu berada di bawah gabungan Theta.

Equi Join: Saat Anda membuat query untuk join menggunakan operator persamaan saja, maka query join tersebut berada di bawah Equi join.

Contoh:

> PILIH * DARI Emp JOIN Dept ON Emp.DeptID = Dept.DeptID;
> PILIH * DARI Emp INNER JOIN Dept USING (DeptID)
Ini akan menunjukkan:
 _________________________________________________
| Emp.Name | Emp.DeptID | Nama Departemen | Dept.DeptID |
| | | | |

Catatan: Equi join juga merupakan gabungan theta!

Natural Join: tipe Equi Join yang muncul secara implisit dengan membandingkan semua kolom nama yang sama di kedua tabel.

Catatan: di sini, hasil gabungan hanya memiliki satu kolom untuk setiap pasangan kolom bernama yang sama.

Contoh

 PILIH * DARI Emp NATURAL JOIN Dept
Ini akan menunjukkan:
 _______________________________
| DeptID | Emp.Name | Nama Dept |
| | | |

1

Hasil kali kartesius dari dua tabel memberikan semua kemungkinan kombinasi tupel seperti contoh dalam matematika hasil perkalian dua set. karena sering kali ada beberapa nilai sampah yang menempati ruang yang tidak perlu dalam memori juga, jadi di sini bergabung datang untuk menyelamatkan yang memberikan kombinasi hanya nilai atribut yang diperlukan dan bermakna.

Inner join memberikan field berulang dalam tabel dua kali sedangkan natural join memecahkan masalah dengan hanya menyaring kolom berulang dan menampilkannya hanya sekali. Lain, keduanya bekerja sama. gabungan alami lebih efisien karena mempertahankan memori. Selain itu, redundansi dihapus dalam gabungan alami.

Equi join dari dua tabel sedemikian rupa sehingga mereka hanya menampilkan tupel yang cocok dengan nilai di tabel lain. sebagai contoh: misalkan new1 dan new2 menjadi dua tabel. jika sql query pilih * dari new1 gabung new2 di new1.id = new.id (id adalah kolom yang sama di dua tabel) kemudian mulai dari tabel new2 dan gabung yang cocok dengan id di tabel kedua. Selain itu, gabungan non equi tidak memiliki operator persamaan yang dimiliki <,>, dan antar operator.

theta join terdiri dari semua operator pembanding termasuk persamaan dan lainnya <,> operator pembanding. jika menggunakan operator persamaan (=), ini dikenal sebagai gabungan eku.


0

Gabungan Alami: Gabungan alami dapat dimungkinkan bila ada setidaknya satu atribut umum dalam dua relasi.

Gabung Theta: Gabung Theta dapat dimungkinkan ketika dua orang bertindak pada kondisi tertentu.

Equi Join: Equi dapat dimungkinkan ketika dua bertindak dalam kondisi ekuitas. Ini adalah salah satu jenis gabungan theta.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.