ฉันมีปัญหาในการทำความเข้าใจเกี่ยวกับพีชคณิตเชิงสัมพันธ์เมื่อพูดถึงการรวมทีต้า, สมดุลและการรวมธรรมชาติ ใครช่วยกรุณาช่วยให้ฉันเข้าใจดีขึ้นได้ไหม ถ้าฉันใช้เครื่องหมาย = ในการเข้าร่วม theta จะเหมือนกับการใช้การเข้าร่วมแบบธรรมชาติหรือไม่?
ฉันมีปัญหาในการทำความเข้าใจเกี่ยวกับพีชคณิตเชิงสัมพันธ์เมื่อพูดถึงการรวมทีต้า, สมดุลและการรวมธรรมชาติ ใครช่วยกรุณาช่วยให้ฉันเข้าใจดีขึ้นได้ไหม ถ้าฉันใช้เครื่องหมาย = ในการเข้าร่วม theta จะเหมือนกับการใช้การเข้าร่วมแบบธรรมชาติหรือไม่?
คำตอบ:
การเข้าร่วม thetaช่วยให้สามารถเปรียบเทียบความสัมพันธ์โดยพลการ (เช่น≥)
equijoinเป็นทีเข้าร่วมโดยใช้ประกอบความเสมอภาค
การรวมตามธรรมชาติคือ Equijoin สำหรับแอตทริบิวต์ที่มีชื่อเดียวกันในแต่ละความสัมพันธ์
นอกจากนี้การรวมแบบธรรมชาติจะลบคอลัมน์ที่ซ้ำกันซึ่งเกี่ยวข้องกับการเปรียบเทียบความเท่าเทียมกันดังนั้นคอลัมน์ที่เปรียบเทียบแต่ละคอลัมน์จะเหลือเพียง 1 คอลัมน์ ในแง่พีชคณิตเชิงสัมพันธ์คร่าวๆ:
⋈ = πR,S-as ○ ⋈aR=aS
theta
เข้าร่วมใน theta หมายถึงเงื่อนไขโดยพลการที่ใช้เป็นเกณฑ์สำหรับการเข้าร่วม (ดูระบบฐานข้อมูล: หนังสือฉบับสมบูรณ์โดย Garcia-Molina, Ullman, Widom, ตอนที่ 2, Theta Join)
ในขณะที่คำตอบที่อธิบายความแตกต่างนั้นใช้ได้ดี แต่ฉันต้องการแสดงให้เห็นว่าพีชคณิตเชิงสัมพันธ์เปลี่ยนเป็น SQL ได้อย่างไรและค่าที่แท้จริงของ 3 แนวคิดคืออะไร
แนวคิดหลักในคำถามของคุณคือแนวคิดของการเข้าร่วม เพื่อให้เข้าใจถึงการเข้าร่วมคุณจำเป็นต้องเข้าใจผลิตภัณฑ์คาร์ทีเซียน (ตัวอย่างนี้ขึ้นอยู่กับ 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
ผลิตภัณฑ์ผลิตภัณฑ์ Cartesian x ตัวแทนจะได้รับ - ร้องหรือซอ SQL คุณจะเห็นว่ามี 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 |
เข้าร่วมเพื่อเพิ่มมูลค่าให้กับผลิตภัณฑ์เหล่านี้ สิ่งที่เราต้องการจริงๆคือ "เข้าร่วม" ผลิตภัณฑ์กับส่วนประกอบที่เกี่ยวข้องเนื่องจากส่วนประกอบแต่ละชิ้นเป็นของผลิตภัณฑ์ วิธีดำเนินการคือเข้าร่วม:
สินค้าเข้าร่วมส่วนประกอบบน 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 และเครื่องบินไม่มี สิ่งนี้มีประโยชน์กว่ามาก
กลับไปที่คำถามของคุณการเข้าร่วมทั้งหมดที่คุณถามเป็นรูปแบบของการเข้าร่วมที่ฉันเพิ่งแสดงให้เห็น:
Natural Join = การเข้าร่วม (ส่วนคำสั่ง ON) ถูกสร้างขึ้นในคอลัมน์ทั้งหมดที่มีชื่อเดียวกัน จะลบคอลัมน์ที่ซ้ำกันออกจากผลลัพธ์ซึ่งตรงข้ามกับการรวมอื่น ๆ ทั้งหมด DBMS ส่วนใหญ่ (ระบบฐานข้อมูลที่สร้างโดยผู้จำหน่ายหลายรายเช่น SQL Server ของ Microsoft, MySQL ของ Oracle เป็นต้น) ไม่ต้องกังวลกับการสนับสนุนสิ่งนี้ แต่เป็นการปฏิบัติที่ไม่ดี (หรือจงใจเลือกที่จะไม่ใช้งาน) ลองนึกภาพว่านักพัฒนาเข้ามาและเปลี่ยนชื่อของคอลัมน์ที่สองในผลิตภัณฑ์จากราคาเป็นต้นทุน จากนั้นการรวมแบบธรรมชาติทั้งหมดจะทำใน PName AND on Cost ทำให้เป็น 0 แถวเนื่องจากไม่มีตัวเลขที่ตรงกัน
Theta Join = นี่คือการเข้าร่วมทั่วไปที่ทุกคนใช้เพราะช่วยให้คุณสามารถระบุเงื่อนไข (ส่วนคำสั่ง ON ใน SQL) คุณสามารถเข้าร่วมได้ตามเงื่อนไขที่คุณต้องการตัวอย่างเช่นผลิตภัณฑ์ที่มีตัวอักษร 2 ตัวแรกคล้ายกันหรือมีราคาที่แตกต่างกัน ในทางปฏิบัติมักไม่ค่อยเกิดขึ้น - ใน 95% ของกรณีที่คุณจะเข้าร่วมในเงื่อนไขความเท่าเทียมกันซึ่งนำเราไปสู่:
Equi Join = สิ่งที่ใช้กันทั่วไปในทางปฏิบัติ ตัวอย่างด้านบนคือการเข้าร่วม equi ฐานข้อมูลได้รับการปรับให้เหมาะสมสำหรับการรวมประเภทนี้! oposite ของการรวม equi คือการเข้าร่วมที่ไม่ใช่ equi กล่าวคือเมื่อคุณเข้าร่วมในเงื่อนไขอื่นที่ไม่ใช่ "=" ฐานข้อมูลไม่เหมาะสำหรับสิ่งนี้! ทั้งสองเป็นส่วนย่อยของการเข้าร่วมทีต้าทั่วไป การเข้าร่วมตามธรรมชาติยังเป็นการเข้าร่วมทีต้า แต่เงื่อนไข (ทีต้า) เป็นนัย
ที่มาของข้อมูล: มหาวิทยาลัย + ผู้พัฒนา SQL Server ที่ได้รับการรับรอง + เพิ่งเสร็จสิ้น MOO "Introduction to databases" จาก Stanford ดังนั้นฉันกล้าพูดว่าฉันมีพีชคณิตเชิงสัมพันธ์อยู่ในใจ
CROSS JOIN
ดำเนินการใน SQL ส่งผลให้เกิดนิพจน์ตาราง (แถวของคอลัมน์) การดำเนินการตั้งค่าผลิตภัณฑ์คาร์ทีเซียนส่งผลให้เกิดชุดคู่
SELECT * FROM...
(และบางทีคุณอาจทำ) แต่มันเป็นภาษามันอยู่ในการใช้งาน SQL ทุกครั้งและฉันก็ใช้บ่อย (และฉันก็เดิมพันด้วย!) คำแนะนำไม่ใช่รหัสทั้งหมดที่เป็นรหัสการผลิต
คำตอบของ @ outis นั้นดี: กระชับและถูกต้องตามความสัมพันธ์
อย่างไรก็ตามสถานการณ์มีความซับซ้อนกว่าเล็กน้อยเกี่ยวกับ SQL
พิจารณาฐานข้อมูลซัพพลายเออร์และชิ้นส่วนตามปกติแต่ใช้ใน SQL:
SELECT * FROM S NATURAL JOIN SP;
จะส่งคืนชุดผลลัพธ์ ** พร้อมคอลัมน์
SNO, SNAME, STATUS, CITY, PNO, QTY
SNO
เข้าร่วมจะดำเนินการในคอลัมน์ที่มีชื่อเดียวกันในตารางทั้งสอง โปรดทราบว่า resultset SNO
มีหกคอลัมน์และมีเพียงหนึ่งคอลัมน์
ตอนนี้ให้พิจารณา theta eqijoin โดยที่ชื่อคอลัมน์สำหรับการเข้าร่วมจะต้องระบุอย่างชัดเจน (ตัวแปรช่วงบวกS
และSP
จำเป็น):
SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;
resultset SNO
จะมีเจ็ดคอลัมน์รวมทั้งสองคอลัมน์สำหรับ ชื่อของชุดผลลัพธ์คือสิ่งที่ SQL Standard อ้างถึงว่า "ขึ้นอยู่กับการนำไปใช้งาน" แต่อาจมีลักษณะดังนี้:
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;
มันคืออะไร" ?
Natural เป็นส่วนย่อยของ Equi ซึ่งเป็นส่วนย่อยของ Theta
ถ้าฉันใช้เครื่องหมาย = ในการเข้าร่วม theta มันเหมือนกับการใช้การเข้าร่วมแบบธรรมชาติทุกประการ ???
ไม่จำเป็น แต่มันจะเป็น Equi หมายถึงธรรมชาติที่คุณจับคู่กับคอลัมน์ที่มีชื่อคล้ายกันทั้งหมด Equi เพียงหมายความว่าคุณกำลังใช้ '=' เท่านั้น (และไม่ 'น้อยกว่า' เช่น ฯลฯ )
นี่เป็นสถาบันการศึกษาที่บริสุทธิ์คุณสามารถทำงานกับฐานข้อมูลเชิงสัมพันธ์ได้เป็นเวลาหลายปีและไม่เคยได้ยินใครใช้คำเหล่านี้
เข้าร่วม Theta:
เมื่อคุณสร้างแบบสอบถามสำหรับการเข้าร่วมโดยใช้ตัวดำเนินการใด ๆ (เช่น =, <,>,> = ฯลฯ ) แบบสอบถามการเข้าร่วมนั้นจะอยู่ภายใต้การเข้าร่วม Theta
Equi Join:
เมื่อคุณสร้างแบบสอบถามสำหรับการเข้าร่วมโดยใช้ตัวดำเนินการความเท่าเทียมกันเท่านั้นแบบสอบถามการเข้าร่วมนั้นจะอยู่ภายใต้การเข้าร่วม Equi
ตัวอย่าง:
> เลือก * จาก Emp JOIN Dept บน Emp.DeptID = Dept.DeptID; > เลือก * จาก Emp INNER JOIN Dept USING (DeptID)
สิ่งนี้จะแสดง: _________________________________________________ | Emp.Name | Emp.DeptID | ฝ่ายชื่อ | Dept.DeptID | | | | | |
หมายเหตุ: การเข้าร่วม Equi ยังเป็นการเข้าร่วม theta!
Natural Join:
Equi Join ประเภทหนึ่งซึ่งเกิดขึ้นโดยปริยายโดยการเปรียบเทียบคอลัมน์ชื่อเดียวกันทั้งหมดในทั้งสองตาราง
หมายเหตุ: ที่นี่ผลการรวมมีคอลัมน์เดียวสำหรับคอลัมน์ที่มีชื่อเดียวกันแต่ละคู่
ตัวอย่าง
เลือก * จาก Emp NATURAL JOIN Dept
สิ่งนี้จะแสดง: _______________________________ | DeptID | Emp.Name | ฝ่ายชื่อ | | | | |
ผลคูณคาร์ทีเซียนของตารางสองตารางให้การรวมกันของทูเปิลที่เป็นไปได้ทั้งหมดเช่นตัวอย่างในคณิตศาสตร์ผลคูณสองชุด เนื่องจากหลายครั้งมีค่าขยะบางอย่างที่ใช้พื้นที่ที่ไม่จำเป็นในหน่วยความจำด้วยดังนั้นการรวมเข้าด้วยกันจึงเข้ามาช่วยเหลือซึ่งจะรวมเฉพาะค่าแอตทริบิวต์ที่จำเป็นและมีความหมาย
การรวมภายในให้ฟิลด์ที่ซ้ำกันในตารางสองครั้งในขณะที่การรวมแบบธรรมชาติที่นี่จะช่วยแก้ปัญหาได้โดยเพียงแค่กรองคอลัมน์ที่ซ้ำแล้วแสดงเพียงครั้งเดียวจากนั้นทั้งสองจะทำงานเหมือนกัน การรวมแบบธรรมชาติมีประสิทธิภาพมากกว่าเนื่องจากรักษาหน่วยความจำนอกจากนี้ความซ้ำซ้อนจะถูกลบออกในการรวมตามธรรมชาติ
การรวม equi ของสองตารางคือการแสดงเฉพาะสิ่งที่ตรงกับค่าในตารางอื่น ตัวอย่างเช่นให้ new1 และ new2 เป็นสองตาราง ถ้า sql query เลือก * จาก new1 เข้าร่วม new2 บน new1.id = new.id (id คือคอลัมน์เดียวกันในสองตาราง) จากนั้นเริ่มจากตาราง new2 และเข้าร่วมซึ่งตรงกับ id ในตารางที่สอง นอกจากนี้การเข้าร่วมที่ไม่ใช่ equi ไม่มีตัวดำเนินการความเท่าเทียมกันที่พวกเขามี <,> และระหว่างตัวดำเนินการ
การเข้าร่วม theta ประกอบด้วยตัวดำเนินการเปรียบเทียบทั้งหมดรวมถึงความเท่าเทียมกันและตัวดำเนินการเปรียบเทียบอื่น ๆ <,> เมื่อใช้ตัวดำเนินการความเท่าเทียมกัน (=) จะเรียกว่าการเข้าร่วม equi
การเข้าร่วมตามธรรมชาติ: การเข้าร่วมตามธรรมชาติสามารถเกิดขึ้นได้เมื่อมีคุณสมบัติทั่วไปอย่างน้อยหนึ่งอย่างในสองความสัมพันธ์
การเข้าร่วม Theta: การเข้าร่วม Theta สามารถเกิดขึ้นได้เมื่อทั้งสองปฏิบัติตามเงื่อนไขเฉพาะ
การเข้าร่วม Equi: Equi สามารถเกิดขึ้นได้เมื่อทั้งสองดำเนินการตามเงื่อนไขความเป็นเจ้าของ เป็นการเข้าร่วมทีต้าประเภทหนึ่ง