L'operazione "differenza" aggiunge espressività a un linguaggio di query che include già "join"?


19

L'operatore differenza set (ad esempio, EXCEPTin alcune varianti SQL) è uno dei tanti operatori fondamentali dell'algebra relazionale. Tuttavia, ci sono alcuni database che non supportano direttamente l'operatore di differenza impostata, ma che supportano LEFT JOIN(una sorta di join esterno), e in pratica questo può essere usato al posto di un'operazione di differenza impostata per ottenere lo stesso effetto.

Ciò significa che la potenza espressiva di un linguaggio di query è la stessa anche senza l'operatore di differenza impostata, purché l' LEFT JOINoperatore sia mantenuto? Come si dimostrerebbe questo fatto?


1
Mostrare che hanno lo stesso potere espressivo sta dimostrando che l'operazione di differenza può essere costruita con l'operazione di join di sinistra (e possibilmente altre operazioni in RA).
sxd

Risposte:


14

Nell'algebra relazionale, forniremo innanzitutto una definizione informale di join (esterno) sinistro e procederemo a dimostrare che, rinominazione, selezione, unione e proiezione possono costruire la differenza, così come la differenza, la selezione e l'unione possono essere utilizzate per costruire join sinistro (esterno). In realtà, finiremo per farlo nell'ordine inverso: mostreremo come costruire join a sinistra usando le differenze, e poi mostreremo come costruire differenze usando i join a sinistra.

Sia che S abbiano schemi ( R , T ) e ( T , S ) , rispettivamente, dove R e S sono gli insiemi di attributi in uno schema ma non l'altro, e T è l'insieme di attributi comuni.RS(R,T)(T,S)RST

Lasciate sia la tupla nulla per lo schema S ' . Cioè, è la tupla composta da tutti i valori null per ogni attributo di S . Quindi, definiamo il join esterno sinistro come segue: è l'insieme di tutte le tuple ( r , t , s ) appartenenti allo schema ( R , T , S ) dove ...w=(ϵ,ϵ,...,ϵ)SSR LEFT JOIN S(r,t,s)(R,T,S)

  1. è una tupla in R ;(r,t)R
  2. (a) è una tupla di S o (b) s = w ;(t,s)Ss=w
  3. Se è nell'insieme per s w , allora ( r , t , w ) non è nell'insieme.(r,t,s)sw(r,t,w)

Esempio: lo schema di è ( AR, loschema diSè( A 2 , A 3 , A 4 )e abbiamo cheR={(1,2,3),(4,5,6)}eS={(2,3,4)(A1,A2,A3)S(A2,A3,A4)R={(1,2,3),(4,5,6)} . Con (1) e (2) otteniamo il risultato intermedio { ( 1 , 2 , 3 , 4 ) , ( 1 , 2 , 3 , 6 ) , ( 1 , 2 , 3 , ϵ ) , ( 4 , 5 , 6 , ϵ ) } . Di (3) dobbiamo rimuovere ( 1 , 2S={(2,3,4),(2,3,6)}{(1,2,3,4),(1,2,3,6),(1,2,3,ϵ),(4,5,6,ϵ)} , poiché abbiamo (per esempio) ( 1 , 2 , 3 , 4 ) e s = 4 ϵ = w . Ci rimane quindi { ( 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,ϵ)}, il risultato previsto per un join sinistro.

Teorema: R LEFT JOIN Sè equivalente a (R EQUIJOIN S) UNION ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w).

Prova: (R EQUIJOIN S)ci dà tutto il necessario per (1) e (2a). Sosteniamo che ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)ci fornisce tutto il modulo (r, t, w)richiesto da (2b) e (3).

Per vedere questo, primo avviso che (((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R)è l'insieme di tutte le tuple in per i quali non corrisponde alcun tupla in S . Per vederlo, è sufficiente notare che proiettando gli attributi comuni su R e S (l'attributo set T ) e prendendo la differenza, si rimane con tutte e solo quelle tuple (con schema T ) che sono rappresentate in R ma non S . Dalla con R , si recupera tutte e sole le tuple in R che hanno valori per gli attributi a T che sono presenti in R ma non in SRSRSTTRSEQUIJOINRRTRS; vale a dire, precisamente l'insieme di tuple che abbiamo rivendicato finora.

Successivamente, si noti che lo schema di (((PROJECT_T R) DIFFERENCE (PROJECT_T S))è uguale a quello di (ovvero, ( R , T ) ), mentre lo schema di w è S . L' operazione è quindi un prodotto cartesiano, che si ottengono tutti tuple nella forma ( r , t , w ) dove non c'è ( t , s ) in S corrispondente ad ( r , t ) in R .R(R,T)wSJOIN(r,t,w)(t,s)S(r,t)R

Per vedere che questo è precisamente l'insieme di tuple che dovevamo aggiungere per R EQUIJOIN Scostruire R LEFT JOIN S, considera quanto segue: per costruzione, (3) è soddisfatto, poiché R EQUIJOIN Snon può contenere se contiene ( r , t , w ) (se così fosse, allora la seconda parte contenente ( r , t , w ) sarebbe una contraddizione); se dovessimo aggiungere un altro ( r , t , w ) non in , allora ci sarebbe un ((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) in S corrispondente a ( r , t ) in R , e dalla definizione di, ( r , t , s ) sarebbe ancheuna contraddizione di (3). Questo completa la prova.(t,s)S(r,t)REQUIJOIN(r,t,s)R LEFT JOIN S

Ora mostriamo che il join sinistro può essere usato per costruire la differenza:

Teorema: R DIFFERENCE Sè equivalente aPROJECT_T(SELECT_{t'=w}(R LEFT JOIN (SELECT_{s=s'}(((S JOIN RENAME_{T->T'}(S)))))))

Prova: si noti che qui, e S ' sono vuote, in quanto tutti gli attributi sono condivise perdare un senso. Innanzitutto, creiamo una nuova relazione da S duplicando l'attributo set in S (gestito dae) in modo che sia composto da tuple ( t , t ) sul set di attributi ( T , T ) dove t = t (gestito da il). L'unione sinistra ci lascia con le tuple della forma ( t , t )RSDIFFERENCESSRENAMEJOIN(t,t)(T,T)t=tSELECT(t,t)dove o t = w . Ora, per sbarazzarci delle voci che compaiono anche in S , dobbiamo mantenere solo le tuple del modulo ( t , w ) , che è gestito dal più esterno . L'ultimo elimina l'attributo temporaneo impostato T e ci lascia con la differenza in termini di schema originale.t=tt=wS(t,w)SELECTPROJECTT

Esempio: Let e S = { ( 3 , 4 ) , ( 5 , 6 ) , ( 7 , 8 ) } . Prima otteniamo S con l'attributo d impostato T : { ( 3 , 4 ), ( 5 R{ ( 1 , 2 , ϵ , ϵ ) , ( 3 ,R={(1,2),(3,4),(5,6)}S={(3,4),(5,6),(7,8)}SRENAMET . L'operazione ci dà il prodotto cartesiano con tutti e nove i possibili abbinamenti; questo set non è scritto qui per motivi di formattazione. L'analisi quindi si riduce a { ( 3 , 4 , 3 , 4 ) , ( 5 , 6 , 5 , 6 ) , ( 7 , 8 , 7 , 8 ) } . Ilcon{(3,4),(5,6),(7,8)}JOINSELECT{(3,4,3,4),(5,6,5,6),(7,8,7,8)}LEFT JOINR . Ildà { ( 1 , 2 , ε , ε ) } . Ildà { ( 1 , 2 ) } , la risposta desiderata.{(1,2,ϵ,ϵ),(3,4,3,4),(5,6,5,6)}SELECT{(1,2,ϵ,ϵ)}PROJECT{(1,2)}


Modifica il tuo post per utilizzare la sintassi LaTeX. Inizia racchiudendo tutta la tua formula in $ simboli (ad esempio, $ (1,2) $ diventa ). Parole chiave come select dovrebbero essere inserite in `(ad esempio,` SELECT` diventa ). (1,2)SELECT
Raffaello

@Raphael Grazie per aver sottolineato che dovrei usare LaTeX per questo. Ho fatto un tentativo in buona fede di LaTeX 'in matematica e backtick' il codice ... per favore fatemi sapere se c'è qualcos'altro che dovrei fare. Grazie ancora!
Patrick87

Grazie mille! Potresti prendere in considerazione $ $ ... $ $ per creare elementi matematici rientrati (non in linea). Questo può spesso migliorare la leggibilità se usato correttamente. MathJax supporta anche equazioni numerate ma non sono sicuro di come farlo.
Raffaello

Penso che la tua logica sia difettosa qui. Stai usando DIFFERENCEper definire LEFT JOIN, e poi usi LEFT JOINper esprimere DIFFERENCE, concludendo che SQL può farne a meno. Affinché ciò sia valido, è necessario esprimere LEFT JOINin termini di operatori diversi daDIFFERENCE , e quindi dimostrare che DIFFERENCEè equivalente ad esso.
Janoma

@Janoma Non credo sia necessario ... stiamo cercando di dimostrare che la differenza può essere espressa in termini di join di sinistra, quindi si presuppone un join di sinistra funzionante. Pensaci: se ciò che stai dicendo avesse un merito, potrei affermare che LEFT JOIN è l'operazione "fondamentale" o "necessaria", e chiedere che tu definisca DIFFERENCE in termini di altri operatori, ma non LEFT JOIN. Ho dimostrato che ciascuno può simulare l'altro, quindi nessuno dei due è più o meno "fondamentale" dell'altro ... cosa rende speciale DIFFERENCE? In prop. la logica, NOT e AND sono complete, così come OR e NOT; non hai bisogno di tutti e tre.
Patrick87

-1

LEFT JOIN come implementato da SQL, non produce relazioni come risultato (perché alcuni attributi del risultato non avranno un valore).

Ergo, LEFT JOIN implementato da SQL, non è una controparte diretta di nessun operatore di algebra relazionale.

Ergo, l' operatore di differenza relazionale non può essere espresso in termini di LEFT JOIN (perché LEFT JOIN non può far parte dell'algebra relazionale, poiché LEFT JOIN produce qualcosa che non è una relazione, violando così la chiusura dell'algebra).

Qualsiasi insieme di operatori primitivi di un'algebra relazionale che soddisfa la chiusura di cui io sia a conoscenza, include sempre la differenza relazionale o la semidifferenza relazionale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.