Bir teta birleştirme, ekijoin ve doğal birleştirme arasındaki fark


98

Konu teta birleşimleri, eşitler ve doğal birleşimler söz konusu olduğunda ilişkisel cebiri anlamakta güçlük çekiyorum. Lütfen birisi bunu daha iyi anlamama yardım edebilir mi? Bir teta birleşiminde = işaretini kullanırsam, doğal birleşim kullanmakla tamamen aynı mıdır?


Ödülden söz konusu alıntı ... orada Codd'dan alıntı yapmıyor, cevabımdan onun yorumunun altında göründüğünü aktarıyor.
heisenberg

Yanıtlar:


145

Bir teta birleşimi , keyfi karşılaştırma ilişkilerine (örneğin ≥) izin verir.

Bir equijoin , eşitlik operatörünü kullanan bir teta birleştirmedir.

Bir katılmak Doğal Her ilişkide aynı ada sahip sıfatlara bir equijoin olduğunu.

Ek olarak, doğal bir birleştirme, eşitlik karşılaştırmasında yer alan yinelenen sütunları kaldırır, böylece karşılaştırılan her sütundan yalnızca 1 tanesi kalır; kabaca ilişkisel cebirsel terimlerle: ⋈ = πR,S-as ○ ⋈aR=aS


13
doğal birleştirme aynı ada sahip sütunları kaldıracak
Bogdan Gavril MSFT

2
Hepsi mi yoksa biri hariç hepsi mi?
Christopher Shroba

Equijoin, her iki tabloda da aynı ada sahiplerse eşitlik sütununu da kaldıracaktır.
Vishal R

1
@outis, "theta join" içindeki "theta" ne anlama geliyor?
Pacerier

3
@Pacerier: Tarihsel olarak, thetateta içi birleştirme, birleştirme ölçütü olarak kullanılan rastgele bir koşulu ifade eder. (bkz. Veritabanı Sistemleri: Tam Kitap, Garcia-Molina, Ullman, Widom, bölüm 2, Theta Join)
Ram Rajamony

59

Kesin farklılıkları açıklayan cevaplar güzel olsa da, ilişkisel cebirin nasıl SQL'e dönüştürüldüğünü ve 3 kavramın gerçek değerinin ne olduğunu göstermek istiyorum.

Sorunuzdaki anahtar kavram, bir birleştirme fikridir. Bir birleştirmeyi anlamak için bir Kartezyen Ürünü anlamanız gerekir (örnek, SQL'e dayanır, burada eşdeğer bir gün gösterildiğinde çapraz birleştirme olarak adlandırılır);

Bu pratikte pek kullanışlı değil. Bu örneği düşünün.

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

Kartezyen ürün Ürün x Bileşeni - feryat veya sql fiddle olacaktır . Gördüğünüz gibi 12 sıra = 3 x 4. Açıktır ki, "tekerlekli" gibi "Dizüstü Bilgisayar" gibi sıraların bir anlamı yoktur, bu yüzden pratikte Kartezyen ürünü nadiren kullanılır.

|    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'ler bu ürünlere daha fazla değer katmak için buradalar. Gerçekten istediğimiz şey, ürünü ilişkili bileşenleriyle "birleştirmektir", çünkü her bileşen bir ürüne aittir. Bunu yapmanın yolu bir birleştirmedir:

Ürün Pname ÜZERİNE BİRLEŞTİRİN

İlişkili SQL sorgusu şöyle olacaktır ( buradaki tüm örneklerle oynayabilirsiniz )

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

ve sonuç:

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

Sonuçta yalnızca 4 satır olduğuna dikkat edin, çünkü Dizüstü Bilgisayarda 3 bileşen vardır, Arabada 1 ve Uçakta hiçbir bileşen yoktur. Bu çok daha kullanışlıdır.

Sorularınıza geri dönersek, sorduğunuz tüm birleşimler az önce gösterdiğim JOIN'in varyasyonları:

Natural Join = birleştirme (ON cümlesi) aynı ada sahip tüm sütunlarda yapılır; diğer tüm birleştirmelerin aksine sonuçtan yinelenen sütunları kaldırır; Çoğu DBMS (Microsoft'un SQL Sunucusu, Oracle'ın MySQL'i gibi çeşitli satıcılar tarafından oluşturulan veritabanı sistemleri) bunu desteklemeye zahmet bile etmez, bu sadece kötü bir uygulamadır (veya kasıtlı olarak uygulamamayı seçmiştir). Bir geliştiricinin gelip Ürün'deki ikinci sütunun adını Fiyattan Maliyet olarak değiştirdiğini hayal edin. Daha sonra tüm doğal birleştirmeler PName VE Maliyet üzerinde yapılır ve hiçbir sayı eşleşmediği için 0 satırla sonuçlanır.

Theta Join = bu, koşulu belirlemenize izin verdiği için herkesin kullandığı genel birleşimdir (SQL'deki ON cümlesi). İstediğiniz hemen hemen her koşula katılabilirsiniz, örneğin ilk 2 harfi benzer olan veya farklı bir fiyatı olan Ürünler. Pratikte durum nadiren böyledir - vakaların% 95'inde eşitlik koşuluyla katılacaksınız ve bu da bizi şu noktalara götürüyor:

Equi Join = pratikte kullanılan en yaygın olanı. Yukarıdaki örnek bir eşit birleşmedir. Veritabanları bu tür birleştirmeler için optimize edilmiştir! Bir eşit birleşmenin zıttı, eşit olmayan bir birleşimdir, yani "=" dışında bir koşulda birleştiğinizde. Veritabanları bunun için optimize edilmemiştir! Her ikisi de genel teta birleşiminin alt kümeleridir. Doğal birleştirme aynı zamanda bir teta birleşimidir ancak koşul (teta) örtüktür.

Bilgi kaynağı: üniversite + sertifikalı SQL Server geliştiricisi + yakın zamanda Stanford'dan MOO "Veritabanlarına Giriş" i tamamladı, bu yüzden ilişkisel cebir aklımda yeni olduğunu söyleyebilirim.


1
'Kartezyen ürün' terimini biraz gevşek kullanıyorsunuz. İlişkisel işleç ürünü bir ilişki ile sonuçlanır (tüm ilişkisel işleçlerde ortak olan!) SQL'deki bir CROSS JOINişlem bir tablo ifadesi (sütun satırları) ile sonuçlanır. Set işlemi Kartezyen çarpımı bir dizi çiftle sonuçlanır.
birgün6

2
"Veritabanları" dediğinizde, aslında "DBMS" yi kastediyorsunuz, bu "kavramlar" ı ele alırken çok önemli bir fark.
birgün6

3
onedaywhen - tüm yararlı yorumlar için teşekkür ederim! bir kod incelemesi gibi geliyor :). Kartezyen ürünü ve DBMS sorunlarını düzelttim. Doğal birleştirmelerin yalnızca akademik ilgi olduğunu ve SQL Server gibi önemli DBMS'lerin bunu kasıtlı olarak uygulamadığını düşünüyorum - açıkça bir koşul eklemek kodun daha iyi anlaşılmasına ve bakımına yol açar. İlgili bir soru: stackoverflow.com/questions/4826613/natural-join-in-sql-server
Bogdan Gavril MSFT

1
@HLGEM: Biri aleyhine benzer tartışmalar yapabilir SELECT * FROM...(ve belki de yaparsınız). Ama bu dilde, her SQL uygulamasında var ve sık sık kullanıyorum (ve senin de yapacağına bahse girerim!) İpucu Tüm kodlar üretim kodu değildir.
2013

2
"Doğal" birleştirilmiş sütunla ilgili gerçek sorun, adların değiştirilmesi değil, sistemdeki tüm olası birleştirilmiş tablolar arasında çakışmaması gereken yenilerinin eklenmesi ile ilgilidir. "Ad", "açıklama", ... gibi çok yaygın sütunları ele alın ... "Doğal birleştirme" kullanmak onları birleştirir, ancak saçma ve daha fazlası iş mantığına aykırıdır ve hataya yol açar. Yani evet, "doğal birleşme" tehlikelidir. Sizi (birincil / yabancı) anahtar sözcükler dışında farklı adlara sahip olmaya ve "ad aralığını" kaybetmeye zorlar.
LoganMzz

13

@ outis'in cevabı iyi: ilişkiler açısından kısa ve doğru.

Ancak durum SQL konusunda biraz daha karmaşıktır.

Her zamanki tedarikçileri ve parça veritabanını göz önünde bulundurun, ancak SQL'de uygulandı:

SELECT * FROM S NATURAL JOIN SP;

sütunlarla bir sonuç kümesi ** döndürür

SNO, SNAME, STATUS, CITY, PNO, QTY

Birleştirme, her iki tabloda da aynı adı taşıyan sütunda gerçekleştirilir SNO. Sonuç kümesinin altı sütun içerdiğini ve için yalnızca bir sütun içerdiğini unutmayın SNO.

Şimdi, birleşim için sütun adlarının açıkça belirtilmesi gereken bir teta eqijoin düşünün (artı aralık değişkenleri Sve SPgereklidir):

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

Sonuç kümesinde iki sütun dahil olmak üzere yedi sütun olacaktır SNO. Sonuç kümesinin adları, SQL Standardının "uygulamaya bağlı" olarak adlandırdığı şeydir, ancak şöyle görünebilir:

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

ya da belki bu

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

Başka bir deyişle, NATURAL JOINSQL resultset çoğaltılamaz adlarla sütunları kaldırmak için kabul edilebilir (- Eğer değişikliğe unutmamalıyız ama ne yazık yinelenen satırları kaldırmaz SELECTiçin SELECT DISTINCTkendinize).


** Sonuçlarının ne olduğunu tam olarak bilmiyorum SELECT * FROM table_expression;. Bunun bir ilişki olmadığını biliyorum, çünkü diğer nedenlerin yanı sıra, aynı ada sahip sütunlar veya isimsiz bir sütun olabilir. Bunun bir küme olmadığını biliyorum çünkü diğer nedenlerin yanı sıra, sütun sırası önemlidir. Hatta bir SQL tablosu veya SQL tablosu ifadesi bile değil. Ben buna sonuç kümesi diyorum.


Aynısı için de geçerli JOIN ... USING(...).
Benoit

Neden "sonucunun ne olduğunu tam olarak bilmiyorum SELECT * FROM table_expression;" diyorsun?
Pacerier

@Pacerier: erm, çünkü ne olduğunu bilmiyorum! Son baktığımda, SQL Standard ne olduğunu tanımlamaktan kaçındı. Ne olmadığını biliyorum (bir ilişki değil, bir küme değil, bir tablo, bir tablo ifadesi değil). Bu yüzden referans kolaylığı için kendi terimim olan 'resultset' kullandım. İlişkisel modelde iki ilişkiyi içeren bir işlemin sonucunun bir ilişki olduğuna dikkat edin. Eşdeğer ifade SQL AFAIK için yapılamaz.
gün

11

Doğal, Theta'nın bir alt kümesi olan Equi'nin bir alt kümesidir.

Bir teta birleşiminde = işaretini kullanırsam, doğal bir birleşim kullanmakla tamamen aynı mı ???

Mutlaka değil, ancak bir Equi olacaktır. Doğal, benzer şekilde adlandırılmış tüm sütunlarda eşleştirme yaptığınız anlamına gelir, Equi yalnızca '=' kullandığınız anlamına gelir (ve 'küçüktür', vb.)

Bu tamamen akademi olsa da, yıllarca ilişkisel veri tabanlarıyla çalışabilir ve hiç kimsenin bu terimleri kullandığını duymazsınız.


"İlişkisel veritabanları" dediğinizde başka bir şeyi kastettiğinizi sanıyorum, örneğin "SQL".
07

SQL olmayan ilişkisel veritabanları ile akademi olmayan işler? Peki hangi ürünleri kastediyorsunuz?
onedaywhen

3
Codd'un orijinal cebirinde, doğal birleştirme temel birleştirme türüdür, oysa eşit veya teta "birleştirme" bir NJ için kısaltmadır (örneğin çapraz çarpım) ve ardından bir kısıtlama gelir. "Doğal, Theta'nın bir alt kümesi olan Equi'nin bir alt kümesidir" muhtemelen bunun anlamı, her NJ'nin ayrıca bir EJ veya TJ olarak ifade edilebileceğidir. Sanırım, eğer σ 1 = 1 (A x B) bir eşitlik olarak sayılırsa, bu durumda, ilişkisel cebirin her işlemi bu biçimde bir eşdeğeri olarak ifade edilebilir. Buradaki belirsizlik, RA için birden fazla olası temel operatör kümesinin olmasıdır.
nvogel

2
@EricFail: sqlvogel Codd'den değil, kekekela'nın cevabından alıntı yapıyor. Codd'un birleşimler hakkında (θ veya başka türlü) yazıları hakkında daha fazla bilgi istiyorsanız, "Veritabanı Yönetimi için İlişkisel Model" i deneyebilir veya onun bibliyografyasında ilerleyebilirsiniz .
outis

1
... Bağlandığınız sorunun aradığınız şeye, muhtemelen olabildiğince yakınlaşan bir cevabı var. Bu bağlantılar Veri Tabanı Sublanguages İlişkisel Bütünlük . P. 10, θ, = ve doğal birleşimler arasındaki bağlantıyı açıklar (ancak doğal, Codd'un formülasyonunda = 'nin tam olarak alt kümeleri değil, daha çok = -joins'in izdüşümüdür).
outis

8

Theta Join: Herhangi bir operatörü (örneğin, =, <,>,> = vb.) Kullanarak birleştirme sorgusu yaptığınızda, bu birleştirme sorgusu Theta birleştirme altına gelir.

Equi Join: Yalnızca eşitlik operatörünü kullanarak bir birleştirme sorgusu yaptığınızda, bu birleştirme sorgusu Equi birleştirme altına gelir.

Misal:

> Emp.DeptID ON Emp JOIN Dept'DEN SEÇ * * Dept.DeptID;
> Emp INNER JOIN Dept'DEN SEÇ * (DeptID)
Bu şunu gösterecektir:
 _________________________________________________
| Emp.Name | Emp.DeptID | Bölüm Adı | Dept.DeptID |
| | | | |

Not: Eşit birleştirme aynı zamanda bir teta birleşimidir!

Natural Join: Her iki tablodaki tüm aynı ad sütunlarını karşılaştırarak örtük olarak oluşan bir Equi Join türü.

Not: burada, birleştirme sonucu aynı adlandırılmış sütunların her çifti için yalnızca bir sütun içerir.

Misal

 Emp NATURAL JOIN Dept'DEN SEÇ *
Bu şunu gösterecektir:
 _______________________________
| DeptID | Emp.Name | Bölüm Adı |
| | | |

1

İki tablonun kartezyen çarpımı, matematikteki örnekte olduğu gibi tüm olası tuple kombinasyonlarını iki kümenin çapraz çarpımını verir. Çoğu zaman bellekte gereksiz yer kaplayan bazı önemsiz değerler olduğu için burada birleşmeler kurtarmaya gelir ve bu da yalnızca gerekli ve anlamlı olan öznitelik değerlerinin kombinasyonunu verir.

İç birleşim, tablodaki yinelenen alanı iki kez verirken, buradaki doğal birleşim sorunu yalnızca yinelenen sütunları filtreleyerek ve yalnızca bir kez görüntüleyerek çözer. başka, ikisi de aynı şekilde çalışır. doğal birleştirme, belleği koruduğu için daha etkilidir. Ayrıca, doğal birleşimde fazlalıklar kaldırılır.

İki tablonun eşit birleşimi, yalnızca diğer tablodaki değerle eşleşen tupleları görüntüleyecek şekildedir. örneğin: yeni1 ve yeni2 iki tablo olsun. sql sorgusu new1'den * 'yi seçin new1.id = new.id'de new2'yi seçin (id iki tablodaki aynı sütundur) sonra new2 tablosundan başlayın ve ikinci tablodaki id ile eşleşen join. ayrıca, eşit olmayan birleşim, sahip oldukları <,> ve arasında eşitlik operatörüne sahip değildir.

teta birleştirme, eşitlik ve diğerleri <,> karşılaştırma operatörü dahil olmak üzere tüm karşılaştırma operatörlerinden oluşur. eşitlik (=) operatörünü kullandığında, eşit birleştirme olarak bilinir.


0

Doğal Birleştirme: Doğal birleştirme, iki ilişkide en az bir ortak özellik olduğunda mümkün olabilir.

Theta Join: Theta Join, iki belirli koşulda hareket ettiğinde mümkün olabilir.

Equi Join: Equi, iki eşitlik koşuluna göre hareket ettiğinde mümkün olabilir. Bir tür teta birleşimidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.