Czy operacja „różnica” dodaje wyrazistości do języka zapytań, który już zawiera „dołącz”?

19

Operator różnicy zbiorów (np. EXCEPTW niektórych wariantach SQL) jest jednym z wielu podstawowych operatorów algebry relacyjnej. Istnieją jednak bazy danych, które nie obsługują bezpośrednio operatora różnicy setów, ale które obsługują LEFT JOIN(rodzaj połączenia zewnętrznego), aw praktyce można tego użyć zamiast operacji ustawiania różnicy, aby osiągnąć ten sam efekt.

Czy to oznacza, że ​​moc ekspresyjna języka zapytań jest taka sama, nawet bez operatora różnicy, o ile LEFT JOINoperator jest utrzymywany? Jak udowodnić ten fakt?

Ken Li
źródło
1
Aby pokazać, że mają taką samą moc ekspresyjną, pokazuje, że operację różnicową można skonstruować za pomocą operacji lewego połączenia (i ewentualnie innych operacji w RA).
sxd

Odpowiedzi:

14

W algebrze relacyjnej najpierw przedstawimy nieformalną definicję lewego (zewnętrznego) złączenia i przejdziemy do udowodnienia, że ​​to zmiana nazwy, selekcji, łączenia i rzutowania może tworzyć różnicę, a także, że różnicę, selekcję i łączenie można wykorzystać do zbudowania różnicy lewe (zewnętrzne) połączenie. W rzeczywistości skończymy w odwrotnej kolejności: pokażemy, jak konstruować lewe złączenia za pomocą różnic, a następnie pokażemy, jak konstruować różnice za pomocą lewych złączeń.

Niech i mają odpowiednio schematy i , gdzie i są zestawami atrybutów w jednym schemacie, ale nie drugim, a jest zbiorem wspólnych atrybutów.RS(R,T)(T,S)RST

Niech będzie krotką zerową dla schematu . Oznacza to, że jest to krotka składająca się ze wszystkich wartości zerowych dla każdego atrybutu . Następnie definiujemy lewe łączenie zewnętrzne w następujący sposób: jest zbiorem wszystkich krotek należących do schematu gdzie ...w=(ϵ,ϵ,...,ϵ)SSR LEFT JOIN S(r,t,s)(R,T,S)

  1. (r,t) oznacza krotkę w ;R
  2. (a) oznacza krotkę S lub (b) s = w ;(t,s)Ss=w
  3. Jeśli jest w zestawie dla s w , to ( r , t , w ) nie jest w zestawie.(r,t,s)sw(r,t,w)

Przykład: schemat to ( A 1 , A 2 , A 3 ) , schemat S to ( A 2 , A 3 , A 4 ) , a my mamy ten R = { ( 1 , 2 , 3 ) , ( 4 , 5 , 6 ) } i S = { ( 2 , 3 , 4 )R(A1,A2,A3)S(A2,A3,A4)R={(1,2,3),(4,5,6)} . Przez (1) i (2) otrzymujemy wynik pośredni { ( 1 , 2 , 3 , 4 ) , ( 1 , 2 , 3 , 6 ) , ( 1 , 2 , 3 , ϵ ) , ( 4 , 5 , 6 , ϵ ) } . Do (3) musimy usunąć ( 1 , 2S={(2,3,4),(2,3,6)}{(1,2,3,4),(1,2,3,6),(1,2,3,ϵ),(4,5,6,ϵ)} , ponieważ mamy (na przykład), ( 1 , 2 , 3 , 4 ) , a y = 4 ε = wag . Pozostaje nam zatem { ( 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,ϵ)}, oczekiwany wynik dla lewego złączenia.

Twierdzenie: R LEFT JOIN Sjest równoważne z (R EQUIJOIN S) UNION ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w).

Dowód: (R EQUIJOIN S)daje nam wszystko, czego wymagają (1) i (2a). Twierdzimy, że ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)daje nam to wszystko w formie (r, t, w)wymaganej przez (2b) i (3).

To zobaczyć pierwszy uwagę, że (((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R)jest to zbiór wszystkich krotki w , dla którego nie ma odpowiadającej krotka w S . Aby to zobaczyć, wystarczy zauważyć, że rzutując wspólne atrybuty z R i S (zestaw atrybutów T ) i biorąc pod uwagę różnicę, pozostaje jeden i wszystkie krotki (ze schematem T ), które są reprezentowane w R, ale nie S . Przez z R odzyskujemy wszystkie i tylko te krotki w R, które mają wartości atrybutów w T, które są obecne w R, ale nie w SRSRSTTRSEQUIJOINRRTRS; a mianowicie dokładnie zestaw krotek, które do tej pory twierdziliśmy.

Następnie zauważ, że schemat (((PROJECT_T R) DIFFERENCE (PROJECT_T S))jest taki sam jak dla (mianowicie ( R ' , T ) ), podczas gdy schemat w jest S ' . Działanie jest zatem iloczyn, że możemy uzyskać wszystkie krotki postaci ( R , T , W ), w których nie ma ( t , y ) w S odpowiadającego ( r , t ) w R .R(R,T)wSJOIN(r,t,w)(t,s)S(r,t)R

Aby zobaczyć, że jest to dokładnie zestaw krotek, które musieliśmy dodać R EQUIJOIN Sw celu skonstruowania R LEFT JOIN S, rozważ następujące kwestie: z uwagi na konstrukcję (3) jest spełniony, ponieważ R EQUIJOIN Snie może zawierać jeśli zawiera ( r , t , w ) (gdyby tak się stało, wówczas druga część zawierająca ( r , t , w ) byłaby sprzecznością); jeśli było dodać kolejną ( r , T , W ) nie , to nie będzie to ((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) w S odpowiadające ( r , t ) w R , a według definicji, ( r , t , s ) również byłoby wsprzeczności (3). To kończy dowód.(t,s)S(r,t)REQUIJOIN(r,t,s)R LEFT JOIN S

Teraz pokazujemy, że lewe łączenie może być użyte do skonstruowania różnicy:

Twierdzenie: R DIFFERENCE Sjest równoważne zPROJECT_T(SELECT_{t'=w}(R LEFT JOIN (SELECT_{s=s'}(((S JOIN RENAME_{T->T'}(S)))))))

Dowód: zauważ, że tutaj i S są puste, ponieważ wszystkie atrybuty są wspólne, aby miały sens. Najpierw tworzymy nową relację z S poprzez duplikowanie zestawu atrybutów w S (obsługiwane przez i ), tak aby zawierała krotki ( t , t ) w zestawie atrybutów ( T , T ), gdzie t = t (obsługiwane przez ). Lewe złączenie pozostawia nam krotki formy ( t , t )RSDIFFERENCESSRENAMEJOIN(t,t)(T,T)t=tSELECT(t,t)gdzie lub t = w . Teraz, aby pozbyć się wpisów, które również pojawiają się w S , musimy zachować tylko krotki formy ( t , w ) , która jest obsługiwana przez najbardziej zewnętrzne . Ostatnim pozbywa tymczasowego zestawu atrybutów T ' i pozostawia nas z różnicy pod względem pierwotnego schematu.t=tt=wS(t,w)SELECTPROJECTT

R={(1,2),(3,4),(5,6)}S={(3,4),(5,6),(7,8)}SRENAMET{(3,4),(5,6),(7,8)}JOINSELECT{(3,4,3,4),(5,6,5,6),(7,8,7,8)}LEFT JOINR{(1,2,ϵ,ϵ),(3,4,3,4),(5,6,5,6)}SELECT{(1,2,ϵ,ϵ)}PROJECT{(1,2)}

Patrick87
źródło
(1,2)SELECT
@Raphael Dzięki za wskazanie, że powinienem do tego używać LaTeXa. Podjąłem w dobrej wierze próbę LaTeX'u w obliczeniach matematycznych i sprawdzeniu kodu wstecz ... daj mi znać, czy jest coś jeszcze, co powinienem zrobić. Dzięki jeszcze raz!
Patrick87,
Wielkie dzięki! Możesz rozważyć użycie $ $ ... $ $ do tworzenia wciętych (nie wbudowanych) kawałków matematyki. Może to często poprawić czytelność, jeśli jest używane prawidłowo. MathJax obsługuje również numerowane równania, ale nie jestem pewien, jak to zrobić.
Raphael
Myślę, że twoja logika jest tutaj błędna. Używasz DIFFERENCEdo definiowania LEFT JOIN, a następnie LEFT JOINdo wyrażania DIFFERENCE, co oznacza, że ​​SQL może się bez niego obejść. Aby było to ważne, należy wyrazić LEFT JOINw kategoriach operatorów innych niżDIFFERENCE , a następnie udowodnić, że DIFFERENCEjest to równoważne.
Janoma
@Janoma Nie sądzę, że jest to wymagane ... staramy się pokazać, że różnicę można wyrazić w postaci lewych złączeń, więc zakłada się funkcjonujące lewe złączenie. Pomyśl o tym: jeśli to, co mówisz, miało sens, mógłbym twierdzić, że LEFT JOIN jest operacją „fundamentalną” lub „konieczną” i żądać, abyś zdefiniował RÓŻNICĘ w kategoriach innych operatorów, ale nie LEFT JOIN. Pokazałem, że każda z nich może symulować drugą, więc ani nie jest bardziej ani mniej „fundamentalna” od drugiej… co czyni RÓŻNICĘ wyjątkową? W prop. logika, NOT i AND są kompletne, podobnie jak OR i NOT; nie potrzebujesz wszystkich trzech.
Patrick87,
-1

LEFT JOIN zaimplementowany przez SQL, nie tworzy relacji jako wyniku (ponieważ niektóre atrybuty wyniku nie będą miały wartości).

Ergo, LEFT JOIN implementowany przez SQL, nie jest bezpośrednim odpowiednikiem żadnego operatora algebry relacyjnej.

Ergo, Operator różnicy relacyjnej nie może być wyrażony jako LEWE DOŁĄCZENIE (ponieważ LEFT JOIN nie może być częścią algebry relacyjnej, ponieważ LEFT JOIN tworzy coś, co nie jest relacją, co narusza zamknięcie algebry).

Każdy zestaw prymitywnych operatorów algebry relacyjnej, który spełnia kryteria zamknięcia , o których wiem, zawsze zawiera albo relacyjną różnicę, albo relacyjną półjednoznaczność.

Erwin Smout
źródło