थीटा ज्वाइन, इक्विजिन और नेचुरल जॉइन में अंतर


95

जब यह थीटा जुड़ने, समभुज और प्राकृतिक जुड़ने की बात आती है, तो मुझे संबंधिक बीजगणित को समझने में परेशानी हो रही है। क्या कोई मुझे बेहतर समझने में मदद कर सकता है? अगर मैं थीटा जॉइन पर = साइन का उपयोग करता हूं तो क्या यह बिल्कुल वैसा ही है जैसे किसी नेचुरल जॉइन का उपयोग करना?


प्रश्न का उद्धरण बाउंटी से लें ... वह वहां कॉड का उद्धरण नहीं दे रहा है, वह मेरे उत्तर से उद्धृत कर रहा है कि उसकी टिप्पणी के अंतर्गत आता है।
Heisenberg

जवाबों:


141

एक थीटा में शामिल होने के (जैसे ≥) मनमाने ढंग से तुलना संबंधों के लिए अनुमति देता है।

एक equijoin थीटा समानता ऑपरेटर का उपयोग शामिल होने के एक है।

एक प्राकृतिक जुड़ाव उन विशेषताओं पर एक समान है जिनका प्रत्येक रिश्ते में समान नाम है।

इसके अतिरिक्त, एक प्राकृतिक जुड़ाव समानता तुलना में शामिल डुप्लिकेट कॉलम को हटाता है, इसलिए प्रत्येक तुलना किए गए कॉलम में से केवल 1 ही रहता है; किसी न किसी संबंधपरक बीजगणितीय शब्दों में: ⋈ = πR,S-as ○ ⋈aR=aS


13
प्राकृतिक
जुड़ाव

2
उन सभी को, या सभी लेकिन एक?
क्रिस्टोफर श्रोबा

यदि वे दोनों तालिकाओं में समान नाम रखते हैं, तो इक्वाइजेन समानता स्तंभ को भी हटा देगा।
विशाल आर।

1
@outis, "थीटा जॉइन" में "थीटा" का क्या अर्थ है?
पचेरियर

2
@Pacerier: ऐतिहासिक रूप से, thetaथीटा जॉइन में शामिल होने के लिए मानदंड के रूप में उपयोग की जाने वाली एक मनमानी स्थिति को संदर्भित करता है। (डेटाबेस सिस्टम देखें: गार्सिया-मोलिना, उलमैन, विडोम, अध्याय 2, थीटा जॉइन द्वारा पूरी पुस्तक)
राम राजमणि

57

हालांकि सटीक अंतर बताने वाले उत्तर ठीक हैं, मैं बताना चाहता हूं कि रिलेशनल बीजगणित को एसक्यूएल में कैसे बदला जाता है और 3 अवधारणाओं का वास्तविक मूल्य क्या है।

आपके प्रश्न में मुख्य अवधारणा एक जुड़ने का विचार है। किसी ज्वाइन को समझने के लिए आपको कार्टेसियन प्रोडक्ट को समझने की जरूरत है (उदाहरण एसक्यूएल पर आधारित है जहां समतुल्य को क्रॉस ज्वाइन कहा जाता है जैसा कि ऑनएडवाइन बताते हैं);

यह व्यवहार में बहुत उपयोगी नहीं है। इस उदाहरण पर विचार करें।

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 घटक होगा - बेलो या स्क्वल फ़िडल । आप देख सकते हैं कि 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 यहां हैं। हम वास्तव में चाहते हैं कि उत्पाद अपने संबंधित घटकों के साथ "शामिल" हो, क्योंकि प्रत्येक घटक एक उत्पाद से संबंधित है। ऐसा करने का तरीका एक जुड़ाव के साथ है:

उत्पाद नाम पर घटक शामिल हैं

संबंधित 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 और हवाई जहाज कोई भी नहीं है। यह बहुत अधिक उपयोगी है।

अपने प्रश्नों पर वापस आते हुए, आपके द्वारा पूछे जाने वाले सभी योग जोइन के रूपांतर हैं जो मैंने अभी दिखाए हैं:

नैचुरल ज्वाइन = द ज्वाइन (ऑन क्लॉज) सभी कॉलम पर एक ही नाम से बना है; यह परिणाम से डुप्लिकेट कॉलम निकालता है, अन्य सभी जॉइन के विपरीत; अधिकांश DBMS (Microsoft के SQL Server, Oracle के MySQL आदि जैसे विभिन्न विक्रेताओं द्वारा बनाए गए डेटाबेस सिस्टम) भी इसका समर्थन करने से बाज नहीं आते हैं, यह सिर्फ बुरा व्यवहार है (या जानबूझकर इसे लागू नहीं करने के लिए चुना गया है)। कल्पना कीजिए कि एक डेवलपर आता है और उत्पाद में मूल्य से लागत तक के दूसरे कॉलम का नाम बदलता है। फिर सभी प्राकृतिक जुड़ाव PName और कॉस्ट पर किए जाएंगे, जिसके परिणामस्वरूप 0 नंबर्स बिना किसी नंबर के मेल खाते हैं।

थीटा ज्वाइन करें = यह सामान्य रूप से शामिल होने वाला हर व्यक्ति उपयोग करता है क्योंकि यह आपको स्थिति को निर्दिष्ट करने की अनुमति देता है (SQL में ON क्लाज)। आप अपनी पसंद के किसी भी हालत में शामिल हो सकते हैं, उदाहरण के लिए उन उत्पादों पर जिनमें पहले 2 अक्षर समान हैं, या जिनकी कीमत अलग है। व्यवहार में, यह शायद ही कभी होता है - 95% मामलों में आप एक समानता की स्थिति में शामिल होंगे, जो हमें निम्न की ओर ले जाता है:

इक्वि जॉइन = व्यवहार में प्रयुक्त सबसे आम। ऊपर दिया गया उदाहरण एक इक्वी जॉइन है। इस प्रकार के जॉइन के लिए डेटाबेस को ऑप्टिमाइज़ किया जाता है! एक इक्वी जॉइन का ओपोजिट एक नॉन-इक्वी जॉइन है, जब आप "=" के अलावा किसी अन्य कंडीशन में शामिल होते हैं। डेटाबेस इसके लिए अनुकूलित नहीं हैं! वे दोनों सामान्य थीटा में शामिल होते हैं। प्राकृतिक जुड़ना भी थीटा जुड़ना है लेकिन स्थिति (थीटा) निहित है।

जानकारी का स्रोत: यूनिवर्सिटी + प्रमाणित SQL सर्वर डेवलपर + ने हाल ही में स्टैनफोर्ड से "डेटाबेस का परिचय" पूरा किया है, इसलिए मैं कहता हूं कि मेरे मन में संबंधपरक बीजगणित ताजा है।


1
आप 'कार्टेशियन उत्पाद' शब्द का प्रयोग कुछ हद तक शिथिल करते हैं। संबंधपरक ऑपरेटर उत्पाद का संबंध सभी रिलेशनल ऑपरेटर्स के साथ सामान्य रूप से होता है!) CROSS JOINSQL ऑपरेशन में तालिका एक्सप्रेशन (कॉलम की पंक्तियों) में परिणाम होता है। सेट ऑपरेशन कार्टेशियन उत्पाद का परिणाम जोड़े के सेट में होता है।
onedaywhen

1
जब आप "डेटाबेस" कहते हैं, तो आप वास्तव में "डीबीएमएस" का अर्थ है, 'अवधारणाओं' को संबोधित करते समय एक महत्वपूर्ण अंतर।
onedaywhen

2
onedaywhen - सभी उपयोगी टिप्पणियों के लिए धन्यवाद! एक कोड की समीक्षा की तरह लगता है :)। मैंने कार्टेशियन उत्पाद और डीबीएमएस समस्याओं को ठीक किया। मैं अपनी राय रखता हूं कि प्राकृतिक जुड़ाव केवल अकादमिक रुचि और महत्वपूर्ण DBMS जैसे कि SQL सर्वर इस उद्देश्य पर लागू नहीं होता है - एक शर्त को स्पष्ट रूप से जोड़ने से बेहतर कोड समझ और रखरखाव होता है। एक संबंधित प्रश्न: stackoverflow.com/questions/4826613/natural-join-in-sql-server
Bogdan Gavril MSFT

1
@ एचएलजीईएम: कोई भी SELECT * FROM...(और शायद आप करते हैं) के खिलाफ समान तर्क दे सकता है। लेकिन यह भाषा में है, यह प्रत्येक एसक्यूएल कार्यान्वयन में है और मैं इसे अक्सर उपयोग करता हूं (और मैं दांव आप भी करते हैं!) संकेत सभी कोड उत्पादन कोड नहीं है।
onedaywhen

1
"नेचुरल" ज्वाइन कॉलम के साथ असली समस्या नाम बदलने के बारे में नहीं है, बल्कि उन नए को जोड़ना है जो सिस्टम में संभवतः सभी शामिल किए गए तालिकाओं के बीच संघर्ष नहीं करना चाहिए। बहुत सामान्य कॉलम लें जैसे "नाम", "विवरण", ... "नेचुरल ज्वाइन" का उपयोग करने से वे जुड़ जाएंगे, जबकि यह बकवास है और अधिक व्यावसायिक तर्क के खिलाफ है और त्रुटि की ओर जाता है। तो हाँ, "प्राकृतिक जुड़ाव" खतरनाक है। यह आपको (प्राथमिक / विदेशी) कुंजी कॉलुलम को छोड़कर अलग-अलग नाम रखने के लिए मजबूर करता है और "नाम रिक्ति" खो देता है।
LoganMzz

14

@ आउटिस का जवाब अच्छा है: संबंध के अनुसार संक्षिप्त और सही।

हालाँकि, SQL के संबंध में स्थिति थोड़ी अधिक जटिल है।

सामान्य आपूर्तिकर्ताओं और भागों डेटाबेस पर विचार करें लेकिन SQL में लागू किया गया:

SELECT * FROM S NATURAL JOIN SP;

कॉलम के साथ एक परिणामी ** लौटाएगा

SNO, SNAME, STATUS, CITY, PNO, QTY

शामिल होने पर स्तंभ को दोनों तालिकाओं में एक ही नाम से प्रदर्शित किया जाता है SNO। ध्यान दें कि परिणामसेट में छह कॉलम हैं और केवल एक कॉलम के लिए है SNO

अब थीटा एक्जीकॉइन पर विचार करें, जहां शामिल होने के लिए कॉलम के नाम स्पष्ट रूप से निर्दिष्ट होने चाहिए (प्लस रेंज चर 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एसक्यूएल में resultset से डुप्लिकेट किए गए नामों के साथ स्तंभों को निकालने के लिए विचार किया जा सकता है (लेकिन अफसोस डुप्लीकेट पंक्तियों को दूर नहीं होगा - आप परिवर्तन करने के लिए याद रखना चाहिए SELECTकरने के लिए SELECT DISTINCTअपने आप को)।


** मुझे पता नहीं है कि इसका परिणाम क्या SELECT * FROM table_expression;है। मुझे पता है कि यह एक संबंध नहीं है क्योंकि, अन्य कारणों के साथ, इसमें डुप्लिकेट नाम वाले कॉलम या बिना नाम वाले कॉलम हो सकते हैं। मुझे पता है कि यह एक सेट नहीं है क्योंकि, अन्य कारणों के बीच, स्तंभ क्रम महत्वपूर्ण है। यह SQL टेबल या SQL टेबल एक्सप्रेशन भी नहीं है। मैं इसे एक परिणाम कहता हूं।


उसी के लिए जाता है JOIN ... USING(...)
बेनोइट

आप क्यों कहते हैं "मुझे नहीं पता कि इसका परिणाम क्या SELECT * FROM table_expression;है" ?
पचेरियर

@Pacerier: erm, क्योंकि मुझे नहीं पता कि यह क्या है! पिछली बार जब मैंने देखा, तो SQL मानक ने परिभाषित करने से परहेज किया कि यह क्या है। मुझे पता है कि यह क्या है (संबंध नहीं, सेट नहीं, टेबल नहीं, टेबल एक्सप्रेशन नहीं)। इसलिए संदर्भ में आसानी के लिए मैंने अपना कार्यकाल 'परिणाम' दिया। ध्यान दें कि संबंधपरक मॉडल में दो संबंधों को शामिल करने वाले एक ऑपरेशन का परिणाम एक संबंध है। SQL AFAIK के लिए समकक्ष कथन नहीं किया जा सकता है।
onedaywhen

11

प्राकृतिक इक्वी का एक सबसेट है जो थीटा का सबसेट है।

अगर मैं थीटा जॉइन पर = साइन का उपयोग करता हूं तो क्या यह बिल्कुल वैसा ही है जैसे किसी नेचुरल जॉइन का उपयोग करना ???

जरूरी नहीं है, लेकिन यह एक इक्वी होगा। प्राकृतिक का मतलब है कि आप सभी समान नाम वाले कॉलम पर मेल कर रहे हैं, इक्वी का अर्थ है कि आप विशेष रूप से '=' का उपयोग कर रहे हैं (और 'से कम नहीं', जैसे, आदि)

यह शुद्ध शिक्षा है, हालांकि, आप वर्षों के लिए रिलेशनल डेटाबेस के साथ काम कर सकते हैं और कभी भी किसी को भी इन शर्तों का उपयोग करते हुए नहीं सुना होगा।


मुझे संदेह है कि जब आप "संबंधपरक डेटाबेस" कहते हैं, तो मुझे संदेह है कि आपका मतलब कुछ और है जैसे "एसक्यूएल"।
onedaywhen

कार्य जो संबंधपरक डेटाबेस के साथ अकादमिया नहीं है जो एसक्यूएल नहीं है? तो आपको किन उत्पादों से मतलब है?
onedaywhen

3
Codd के मूल बीजगणित में, प्राकृतिक जुड़ाव एक प्रकार का मूल प्रकार है, जबकि एक equi- या थीटा- "join" एक NJ (जैसे क्रॉस उत्पाद) के लिए शॉर्टहैंड होता है, जिसके बाद प्रतिबंध होता है। "प्राकृतिक समान का एक सबसेट है जो थीटा का एक सबसेट है" संभवतः इसका मतलब है कि प्रत्येक एनजे को ईजे या टीजे के रूप में भी व्यक्त किया जा सकता है। मुझे लगता है कि यह सच है अगर = 1 = 1 (ए एक्स बी) एक समतुल्य के रूप में गिना जाता है, तो उस स्थिति में संबंधपरक बीजगणित के प्रत्येक ऑपरेशन को उस रूप में एक समरूप के रूप में व्यक्त किया जा सकता है। यहां अस्पष्टता यह है कि आरए के लिए मौलिक ऑपरेटरों के एक से अधिक संभावित सेट हैं।
nvogel

2
@EricFail: sqlvogel सिर्फ कोडेकेला के जवाब को उद्धृत कर रहा है, बजाय कोडड के कुछ भी। यदि आप कॉड्स के लेखन में θ (या अन्यथा) के बारे में अधिक चाहते हैं, तो आप "डेटाबेस प्रबंधन के लिए संबंधपरक मॉडल" की कोशिश कर सकते हैं, या उसकी ग्रंथ सूची के माध्यम से अपना काम कर सकते हैं ।
आउट

1
... आपके द्वारा लिंक किए गए प्रश्न का उत्तर है कि आप जो खोज रहे हैं उसके करीब पहुंच जाता है, संभवतः जितना संभव हो उतना करीब है। यह डेटा बेस Sublanguages ​​के संबंधपरक पूर्णता से जोड़ता है । पी। 10 में θ, = और प्राकृतिक जुड़ावों के बीच संबंध का वर्णन किया गया है (हालांकि कोडड के निरूपण में स्वाभाविक रूप से = के सबसेट उपसमुच्चय नहीं हैं, बल्कि = -जांच के प्रक्षेपण) हैं।
आउट

7

थीटा ज्वाइन करें: जब आप किसी भी ऑपरेटर (जैसे, =, <,>,> = इत्यादि) का उपयोग करके जुड़ने के लिए एक क्वेरी बनाते हैं, तो उस ज्वाइन क्वेरी को थीटा जॉइन के अंतर्गत आता है।

इक्वी जॉइन: जब आप केवल समानता ऑपरेटर के उपयोग से जुड़ने के लिए एक क्वेरी बनाते हैं, तो वह ज्वाइन क्वेरी इक्वी जॉइन के अंतर्गत आती है।

उदाहरण:

> का चयन करें * महारानी विभाग से प्राप्त करें। विभाग = विभाग।
> चयन से * इनर जॉइन डेप यूटिंग (विभाग) से
यह दिखाएगा:
 _________________________________________________
| Emp.Name | Emp.DeptID | विभाग .नाम | विभाग
| | | | |

नोट: इक्वी जॉइन भी थीटा जॉइन है!

नेचुरल ज्वाइन: एक प्रकार का इक्वी ज्वाइन जो दोनों तालिकाओं में सभी समान नामों के कॉलम की तुलना करके निहित होता है।

नोट: यहां, ज्वाइन रिजल्ट में एक ही नाम वाले कॉलम की प्रत्येक जोड़ी के लिए केवल एक कॉलम है।

उदाहरण

 चयनित * प्राकृतिक जॉय विभाग से
यह दिखाएगा:
 _______________________________
| विभाग | Emp.Name | विभाग .नाम |
| | | |

1

दो टेबलों का कार्टेशियन उत्पाद टुपल्स के सभी संभावित संयोजनों को गणित में उदाहरण देता है जैसे दो सेटों का क्रॉस उत्पाद। चूँकि कई बार कुछ जंक मान होते हैं जो कि स्मृति में अनावश्यक स्थान पर कब्जा कर लेते हैं इसलिए यहाँ भी बचाव के लिए आते हैं जो केवल उन विशेषताओं मूल्यों का संयोजन देते हैं जो आवश्यक हैं और सार्थक हैं।

इनर ज्वाइन दो बार तालिका में दोहराए गए फ़ील्ड को देता है, जबकि यहाँ शामिल होने से बार-बार स्तंभों को फ़िल्टर करने और केवल एक बार प्रदर्शित करने से समस्या हल होती है। ठीक है, दोनों एक ही काम करते हैं। प्राकृतिक जुड़ाव अधिक कुशल है क्योंकि यह मेमोरी को संरक्षित करता है। इसके अलावा, प्राकृतिक जुड़ाव में अतिरेक को हटा दिया जाता है।

दो टेबलों में से एक समान जुड़ाव ऐसा है कि वे केवल उन टुपल्स को प्रदर्शित करते हैं जो अन्य तालिका में मान से मेल खाते हैं उदाहरण के लिए: new1 और new2 दो तालिकाओं को होने दें। यदि sql क्वेरी का चयन करें * new1 से new1 पर नए 2 से जुड़ें। new =id.id (आईडी दो तालिकाओं में एक ही स्तंभ है) तो new2 तालिका से प्रारंभ करें और शामिल हों जो दूसरे तालिका में आईडी से मेल खाती है। इसके अलावा, नॉन इक्वी जॉइन में समानता ऑपरेटर नहीं है, जिनके पास <,> और ऑपरेटर के बीच है।

थीटा जॉइन में समतुल्यता ऑपरेटर सहित समानता और अन्य <,> तुलना ऑपरेटर शामिल हैं। जब यह समानता (=) ऑपरेटर का उपयोग करता है तो इसे इक्वी जॉइन के रूप में जाना जाता है।


0

प्राकृतिक जुड़ाव: प्राकृतिक जुड़ाव तब संभव हो सकता है जब दो संबंधों में कम से कम एक सामान्य विशेषता हो।

थीटा ज्वाइन: थीटा जॉइन तब संभव हो सकता है जब किसी विशेष स्थिति पर दो कार्य करें।

इक्वी जॉइन: इक्विटी की स्थिति पर दो कार्य करने पर इक्विटी संभव हो सकती है। यह थीटा जॉइन का एक प्रकार है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.