การดำเนินการ 'ความแตกต่าง' เพิ่มความหมายให้กับภาษาคิวรีที่มี 'เข้าร่วม' อยู่แล้วหรือไม่?


19

ตัวดำเนินการที่ตั้งค่าความแตกต่าง (เช่นEXCEPTในตัวแปร SQL บางตัว) เป็นหนึ่งในตัวดำเนินการพื้นฐานจำนวนมากของพีชคณิตเชิงสัมพันธ์ อย่างไรก็ตามมีฐานข้อมูลบางอย่างที่ไม่สนับสนุนตัวดำเนินการความแตกต่างโดยตรง แต่การสนับสนุนLEFT JOIN(ชนิดของการรวมภายนอก) และในทางปฏิบัติสามารถใช้แทนการตั้งค่าความแตกต่างเพื่อให้ได้ผลเช่นเดียวกัน

สิ่งนี้หมายความว่าพลังการแสดงออกของภาษาแบบสอบถามเหมือนกันแม้ว่าจะไม่มีตัวดำเนินการความแตกต่างที่กำหนดไว้ตราบใดที่LEFT JOINยังคงมีการใช้งานตัวดำเนินการอยู่ เราจะพิสูจน์ความจริงข้อนี้ได้อย่างไร?


1
เพื่อแสดงให้เห็นว่าพวกเขามีพลังการแสดงออกที่เหมือนกันคือการแสดงให้เห็นว่าการดำเนินการที่แตกต่างสามารถสร้างขึ้นด้วยการดำเนินการเข้าร่วมด้านซ้าย (และการดำเนินการอื่น ๆ ใน RA)
sxd

คำตอบ:


14

ในพีชคณิตเชิงสัมพันธ์อันดับแรกเราจะต้องให้คำจำกัดความอย่างไม่เป็นทางการของการเข้าร่วมด้านนอก (ด้านนอก) และดำเนินการต่อเพื่อพิสูจน์ว่าการเปลี่ยนชื่อการเลือกการเข้าร่วมและการฉายภาพสามารถสร้างความแตกต่างได้ เข้าร่วมด้านซ้าย (ด้านนอก) ที่จริงแล้วเราจะทำตามลำดับย้อนกลับ: เราจะแสดงวิธีสร้างการรวมซ้ายโดยใช้ความแตกต่างจากนั้นเราจะแสดงวิธีการสร้างความแตกต่างโดยใช้การรวมซ้าย

ให้และมี schemataและตามลำดับโดยที่และเป็นชุดของคุณลักษณะในหนึ่ง schema แต่ไม่ใช่ที่อื่นและคือชุดของคุณลักษณะทั่วไปRS(R,T)(T,S)RST

Letเป็น tuple ว่างสำหรับสคีS'นั่นคือมันเป็น tuple ประกอบด้วยค่า null ทั้งหมดสำหรับแอตทริบิวต์ของแต่ละS'จากนั้นเราจะนิยามการรวมภายนอกด้านซ้ายดังนี้: คือชุดของ tuples ทั้งหมดที่เป็นของ schemaโดยที่ ...w=(ϵ,ϵ,...,ϵ)SSR LEFT JOIN S(r,t,s)(R,T,S)

  1. (r,t) เป็น tuple ใน ;R
  2. (a)คือ tuple ของหรือ (b)(t,s)Ss=w ;
  3. หากอยู่ในชุดสำหรับs wแล้ว( r , t , w )ไม่ได้อยู่ในชุด(r,t,s)sw(r,t,w)

ตัวอย่าง: 's คีมาคือ( 1 , 2 , 3 ) , S ' คีมาคือ( 2 , 3 , 4 )และเรามีที่R = { ( 1 , 2 , 3 ) , ( 4 , 5 , 6 ) }และS = { ( 2 , 3 , 4 )R(A1,A2,A3)S(A2,A3,A4)R={(1,2,3),(4,5,6)} } โดย (1) และ (2) เราได้ผลลัพธ์ระดับกลาง { ( 1 , 2 , 3 , 4 ) , ( 1 , 2 , 3 , 6 ) , ( 1 , 2 , 3 , ϵ ) , ( 4 , 5 , 6 , ε ) } ภายใน (3) เราจะต้องลบ ( 1 , 2S={(2,3,4),(2,3,6)}{(1,2,3,4),(1,2,3,6),(1,2,3,ϵ),(4,5,6,ϵ)}เนื่องจากเรามี (ตัวอย่างเช่น) ( 1 , 2 , 3 , 4 )และ s = 4 ε = W เราจะเหลือจึงมี { ( 1 , 2 , 3 , 4 ) , ( 1 , 2 , 3 , 6 ) , ( 4 , 5 , 6 , ε ) }(1,2,3,ϵ)(1,2,3,4)s=4ϵ=w{(1,2,3,4),(1,2,3,6),(4,5,6,ϵ)}ผลลัพธ์ที่คาดไว้สำหรับการเข้าร่วมด้านซ้าย

ทฤษฎีบท: เทียบเท่ากับR LEFT JOIN S(R EQUIJOIN S) UNION ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)

หลักฐาน: (R EQUIJOIN S)ให้ทุกสิ่งที่เราต้องการโดย (1) และ (2a) เราอ้างว่า((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)ให้ทุกสิ่งในแบบฟอร์มที่(r, t, w)กำหนดโดย (2b) และ (3)

หากต้องการดูนี้แจ้งให้ทราบล่วงหน้าแรกที่(((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R)เป็นชุดของ tuples ทั้งหมดในซึ่งไม่มี tuple ที่สอดคล้องกันในS เพื่อดูว่ามันพอเพียงที่จะทราบว่าโดยการฉายคุณลักษณะทั่วไปออกจากRและS (ชุดคุณลักษณะT ) และรับความแตกต่างหนึ่งที่เหลืออยู่ทั้งหมดและเพียงสิ่งอันดับ (กับสคีมาT ) ซึ่งจะแสดงในRแต่ ไม่ใช่เอส โดยด้วยRเราจะกู้คืน tuples ทั้งหมดในRที่มีค่าสำหรับคุณลักษณะในTซึ่งมีอยู่ในRแต่ไม่ใช่ในSRSRSTTRSEQUIJOINRRTRS; คือชุดของ tuples ที่เราได้อ้างไว้อย่างแม่นยำ

ถัดไปแจ้งให้ทราบว่าสคีของ(((PROJECT_T R) DIFFERENCE (PROJECT_T S))เป็นเช่นเดียวกับที่ (กล่าวคือ( R ' , T ) ) ในขณะที่คีมาของWคือS ' การดำเนินงานจึงเป็นผลิตภัณฑ์ Cartesian เราที่เราได้รับ tuples ทุกรูปแบบ( R , T , W )ที่ไม่มี( T , s )ในSสอดคล้องกับ( R , T )ในRR(R,T)wSJOIN(r,t,w)(t,s)S(r,t)R

หากต้องการดูว่านี่เป็นชุดของสิ่งอันดับที่เราต้องการเพิ่มR EQUIJOIN Sในการสร้างR LEFT JOIN Sให้พิจารณาต่อไปนี้: จากการสร้าง (3) เป็นที่พอใจเนื่องจากR EQUIJOIN Sไม่สามารถมีหากมี( r , t , w ) (ถ้าเป็นเช่นนั้นส่วนที่สองที่มี( r , t , w )จะขัดแย้งกัน); ถ้าเราจะเพิ่มอีก( r , t , w )ไม่ได้อยู่ในนั้นก็จะมี((r,t,s)((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)(r,t,w)(r,t,w)(r,t,w)((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)ใน S ที่สอดคล้องกับ ( r , t )ใน R , และตามคำนิยามของ, ( r , t , s )ก็จะอยู่ใน, ความขัดแย้งของ (3) นี่เป็นการพิสูจน์ที่สมบูรณ์(t,s)S(r,t)REQUIJOIN(r,t,s)R LEFT JOIN S

ตอนนี้เราแสดงให้เห็นว่าการเข้าร่วมด้านซ้ายสามารถใช้เพื่อสร้างความแตกต่าง:

ทฤษฎีบท: R DIFFERENCE Sเทียบเท่าPROJECT_T(SELECT_{t'=w}(R LEFT JOIN (SELECT_{s=s'}(((S JOIN RENAME_{T->T'}(S)))))))

พิสูจน์: ขอให้สังเกตว่าที่นี่และS 'ที่ว่างเปล่าเนื่องจากคุณลักษณะทั้งหมดที่ใช้ร่วมกันสำหรับการที่จะทำให้ความรู้สึก อันดับแรกเราสร้างความสัมพันธ์ใหม่จากSโดยทำซ้ำชุดแอตทริบิวต์ในS (จัดการโดยและ) เพื่อให้ประกอบด้วย tuples ( t , t )ในชุดแอตทริบิวต์( T , T )โดยที่t = t (จัดการโดย) การเข้าร่วมทางซ้ายทำให้เรามีสิ่งอันดับ( t , t )RSDIFFERENCESSRENAMEJOIN(t,t)(T,T)t=tSELECT(t,t)ที่หรือT ' = W ตอนนี้ที่จะได้รับการกำจัดของรายการซึ่งไม่ปรากฏในSเราจะต้องเก็บเฉพาะ tuples ของฟอร์ม( T , W )ซึ่งจะถูกจัดการโดยนอกสุด สุดท้ายได้รับการกำจัดของชุดคุณลักษณะชั่วคราวT และทำให้เรามีความแตกต่างในแง่ของสคีมาเดิมt=tt=wS(t,w)SELECTPROJECTT

ตัวอย่าง: Let และS = { ( 3 , 4 ) , ( 5 , 6 ) , ( 7 , 8 ) } ก่อนอื่นเราจะได้Sกับชุดของคุณสมบัติ d T : { ( 3 , 4 )R={(1,2),(3,4),(5,6)}S={(3,4),(5,6),(7,8)}SRENAMET } การดำเนินการให้ผลิตภัณฑ์คาร์ทีเซียนกับการจับคู่ที่เป็นไปได้ทั้งหมดเก้ารายการ ชุดนี้ไม่ได้เขียนไว้ที่นี่เพื่อเหตุผลในการจัดรูปแบบ แล้ว pares ลงนี้เพื่อ { ( 3 , 4 , 3 , 4 ) , ( 5 , 6 , 5 , 6 ) , ( 7 , 8 , 7 , 8 ) } การด้วย{(3,4),(5,6),(7,8)}JOINSELECT{(3,4,3,4),(5,6,5,6),(7,8,7,8)}LEFT JOINให้ { ( 1 , 2 , ε , ε ) , ( 3 , 4 , 3 , 4 ) , ( 5 , 6 , 5 , 6 ) } ให้ { ( 1 , 2 , ε , ε ) } ให้ { ( 1 , 2 ) }คำตอบที่ต้องการR{(1,2,ϵ,ϵ),(3,4,3,4),(5,6,5,6)}SELECT{(1,2,ϵ,ϵ)}PROJECT{(1,2)}


(1,2)SELECT

@ ราฟาเอลขอบคุณที่ชี้ให้เห็นว่าฉันควรจะใช้ LaTeX สำหรับสิ่งนี้ ฉันพยายาม LaTeX อย่างสุจริตโดยใช้คณิตศาสตร์และทำการ backtick'ing รหัส ... โปรดแจ้งให้เราทราบหากมีสิ่งอื่นที่ฉันควรทำ ขอบคุณอีกครั้ง!
Patrick87

เยี่ยมมากขอบคุณ! คุณอาจต้องการพิจารณา$ $ ... $ $เพื่อสร้างส่วนของการเยื้อง (ไม่ใช่แบบอินไลน์) ของคณิตศาสตร์ สิ่งนี้สามารถปรับปรุงความสามารถในการอ่านได้หากใช้อย่างถูกต้อง MathJax ยังสนับสนุนสมการตัวเลข แต่ฉันไม่แน่ใจว่าจะทำอย่างไร
Raphael

ฉันคิดว่าตรรกะของคุณผิดพลาดที่นี่ คุณกำลังใช้DIFFERENCEเพื่อกำหนดLEFT JOINและจากนั้นคุณใช้LEFT JOINในการแสดงDIFFERENCEสรุปว่า SQL สามารถทำได้โดยไม่ต้อง เพื่อให้สิ่งนี้ถูกต้องคุณควรแสดงLEFT JOINในรูปของตัวดำเนินการอื่นที่ไม่ใช่DIFFERENCEแล้วพิสูจน์ว่าDIFFERENCEเทียบเท่า
Janoma

@ Janoma ฉันไม่คิดว่าจำเป็นต้องใช้ ... เรากำลังพยายามแสดงให้เห็นว่าสามารถแสดงความแตกต่างในแง่ของการเข้าร่วมด้านซ้ายดังนั้นการเข้าร่วมการทำงานที่เหลือจะถือว่า ลองคิดดูสิถ้าสิ่งที่คุณพูดมีข้อดีฉันสามารถอ้างว่า LEFT JOIN เป็นการดำเนินการ "พื้นฐาน" หรือ "จำเป็น" และต้องการให้คุณกำหนดความแตกต่างในแง่ของผู้ให้บริการรายอื่น แต่ไม่ใช่ LEFT JOIN ฉันได้แสดงให้เห็นแล้วว่าแต่ละคนสามารถจำลองสิ่งอื่น ๆ ได้ดังนั้น "พื้นฐาน" ไม่มากไปกว่าสิ่งอื่น ๆ ... อะไรที่ทำให้ความแตกต่างพิเศษ? ในเสา ตรรกะไม่ใช่และและเสร็จสมบูรณ์เช่นเดียวกับ OR และไม่ใช่; คุณไม่ต้องการทั้งสาม
Patrick87

-1

LEFT JOIN ที่ใช้โดย SQL ไม่ได้สร้างความสัมพันธ์ตามผลลัพธ์ (เนื่องจากคุณลักษณะบางอย่างของผลลัพธ์จะไม่มีค่า)

Ergo, LEFT JOIN ที่ถูกใช้งานโดย SQL ไม่ได้เป็นคู่โดยตรงของตัวดำเนินการพีชคณิตเชิงสัมพันธ์

Ergo ตัวดำเนินการความแตกต่างเชิงสัมพันธ์ไม่สามารถแสดงในรูปของ LEFT JOIN (เนื่องจากซ้ายเข้าร่วมไม่สามารถเป็นส่วนหนึ่งของพีชคณิตเชิงสัมพันธ์ได้เนื่องจากสิ่งนี้เป็นเพราะ LEFT JOIN สร้างสิ่งที่ไม่ใช่ความสัมพันธ์

ชุดของตัวดำเนินการดั้งเดิมของพีชคณิตเชิงสัมพันธ์ที่ตรงกับการปิดที่ฉันรู้นั้นรวมถึงความแตกต่างเชิงสัมพันธ์หรือความสัมพันธ์เชิงเส้นกึ่งกลางอื่นเสมอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.