Relasjonsalgebra – Eksempler

For eksemplene under antar vi at vi har følgende tabeller:

Sportslag:

navn land gren etablert ireg
Manchester United England Fotball 1878 23419
Manchester City England Fotball 1894 23421
AC Milan Italia Fotball 1899 11382
Chicago Bulls USA Basketball 1966 4881
FaZe Clan USA Esport 2010 81124
Vålerenga Norge Fotball 1913 31309
Vålerenga Norge Ishockey 1913 356

Utøvere:

navn lag id født
Lee Grant 23419 13 1983-01-27
David de Gea 23419 1 1990-11-07
Håvard Nygaard 81124 rain 1994-08-27
Steffen Søberg 356 70 1993-08-06

Projeksjon (π)

Projekson er en operator som uttrykkes med π, og tar en relasjon og returnerer en relasjon med en delmengde av den originale relasjonens attributter. De attributtene man ønsker å ha med skriver man med subskript, f.eks. vil

πnavn(Sportslag)

gi:

navn
Manchester United
Manchester City
AC Milan
Chicago Bulls
FaZe Clan
Vålerenga

Merk at vi her har fjernet duplikatet av Vålerenga, siden en relasjon er en mengde med tupler og skal derfor ikke ha noen duplikate tupler i seg.

Videre vil

πnavn, født(Utøvere)

gi:

navn født
Lee Grant 1983-01-27
David de Gea 1990-11-07
Håvard Nygaard 1994-08-27
Steffen Søberg 1993-08-06

Seleksjon (σ)

Seleksjon er en operator som uttrykkes med σ, og tar en relasjon og returnerer en relasjon med en delmengde av tuplene fra den originale relasjonen. Seleksjons-operatoren tar et uttrykk hvor attributt-navnene behandles som variable, og som returnerer alle rader hvor uttrykket evaluerer til sant. F.eks. vil

σnavn = ′LeeGrant(Utøvere)

gi:

navn lag id født
Lee Grant 23419 13 1983-01-27

Vi kan bruke ulike relasjoner, slik som <, , , osv. Vi kan også kombinere utsagn med (“and”) og (“or”). F.eks., for å finne alle utøvere født mellom 1991-01-01 og 1995-01-01 kan vi skrive

σfødt ≥ ′1991 − 01 − 01′ ∧ født ≤ ′1995 − 01 − 01′(Utøvere)

som vil gi:

navn lag id født
Håvard Nygaard 81124 rain 1994-08-27
Steffen Søberg 356 70 1993-08-06

Omdøping (ρ)

Omdøping er en operator som skrives ρ, og tar en relasjon og returnerer en relasjon som inneholder akkurat de samme tuplene og attributtene som argument-relasjonen, men hvor en eller flere attributter har byttet navn. F.eks. vil

ρfødt → fødselsdato(Utøvere)

bli:

navn lag id fødselsdato
Lee Grant 23419 13 1983-01-27
David de Gea 23419 1 1990-11-07
Håvard Nygaard 81124 rain 1994-08-27
Steffen Søberg 356 70 1993-08-06

mens

ρnavn → lagnavn, land → nasjonalitet(Sportlag)

blir:

lagnavn nasjonalitet gren etablert ireg
Manchester United England Fotball 1878 23419
Manchester City England Fotball 1894 23421
AC Milan Italia Fotball 1899 11382
Chicago Bulls USA Basketball 1966 4881
FaZe Clan USA Esport 2010 81124
Vålerenga Norge Fotball 1913 31309
Vålerenga Norge Ishockey 1913 356

Denne operatoren er ikke så nyttig i seg selv, men den blir nyttig når vi ønsker å kombinere data fra flere tabeller i én relasjon. Da vil vi måtte omdøpe attributter fra forskjellige relasjoner som har like navn (slik som de to navn-attributtene i de to eksempel-relasjonene våre).

Kryssprodukt (×)

Kryssprodukt, eller kartesisk produkt, skrives × og er en operator som kombinerer to relasjoner. Resultatet er en relasjon som har alle attributtene til de to argument-relasjonene, og inneholder alle kombinasjoner av tupler fra de to relasjonene.

F.eks. dersom vi har relasjonene

Person:

id navn jobb
1 Ole 2
2 Kari 3
3 Hanne 2
4 Nils 1

Firma:

orgnr firmanavn
1 DNB
2 Nordea
3 Finn

så vil

Firma × Person

bli:

orgnr firmanavn id navn jobb
1 DNB 1 Ole 2
1 DNB 2 Kari 3
1 DNB 3 Hanne 2
1 DNB 4 Nils 1
2 Nordea 1 Ole 2
2 Nordea 2 Kari 3
2 Nordea 3 Hanne 2
2 Nordea 4 Nils 1
3 Finn 1 Ole 2
3 Finn 2 Kari 3
3 Finn 3 Hanne 2
3 Finn 4 Nils 1

Som sagt over, kan vi ikke ta kryssprodukt mellom to relasjoner som har attributter med samme navn. Så f.eks. Utøvere × Sportslag. Vi kan derimot omdøpe et av disse attributtene til noe annet, f.eks. omdøpe navn i Utøver til unavn.

Vi kan da gjøre

ρnavn → unavn(Utøvere) × Sportslag

som blir:

unavn lag id født navn land gren etablert ireg
Lee Grant 23419 13 1983-01-27 Manchester United England Fotball 1878 23419
Lee Grant 23419 13 1983-01-27 Manchester City England Fotball 1894 23421
Lee Grant 23419 13 1983-01-27 AC Milan Italia Fotball 1899 11382
Lee Grant 23419 13 1983-01-27 Chicago Bulls USA Basketball 1966 4881
Lee Grant 23419 13 1983-01-27 FaZe Clan USA Esport 2010 81124
Lee Grant 23419 13 1983-01-27 Vålerenga Norge Fotball 1913 31309
Lee Grant 23419 13 1983-01-27 Vålerenga Norge Ishockey 1913 356
David de Gea 23419 1 1990-11-07 Manchester United England Fotball 1878 23419
David de Gea 23419 1 1990-11-07 Manchester City England Fotball 1894 23421
David de Gea 23419 1 1990-11-07 AC Milan Italia Fotball 1899 11382
David de Gea 23419 1 1990-11-07 Chicago Bulls USA Basketball 1966 4881
David de Gea 23419 1 1990-11-07 FaZe Clan USA Esport 2010 81124
David de Gea 23419 1 1990-11-07 Vålerenga Norge Fotball 1913 31309
David de Gea 23419 1 1990-11-07 Vålerenga Norge Ishockey 1913 356
Håvard Nygaard 81124 rain 1994-08-27 Manchester United England Fotball 1878 23419
Håvard Nygaard 81124 rain 1994-08-27 Manchester City England Fotball 1894 23421
Håvard Nygaard 81124 rain 1994-08-27 AC Milan Italia Fotball 1899 11382
Håvard Nygaard 81124 rain 1994-08-27 Chicago Bulls USA Basketball 1966 4881
Håvard Nygaard 81124 rain 1994-08-27 FaZe Clan USA Esport 2010 81124
Håvard Nygaard 81124 rain 1994-08-27 Vålerenga Norge Fotball 1913 31309
Håvard Nygaard 81124 rain 1994-08-27 Vålerenga Norge Ishockey 1913 356
Steffen Søberg 356 70 1993-08-06 Manchester United England Fotball 1878 23419
Steffen Søberg 356 70 1993-08-06 Manchester City England Fotball 1894 23421
Steffen Søberg 356 70 1993-08-06 AC Milan Italia Fotball 1899 11382
Steffen Søberg 356 70 1993-08-06 Chicago Bulls USA Basketball 1966 4881
Steffen Søberg 356 70 1993-08-06 FaZe Clan USA Esport 2010 81124
Steffen Søberg 356 70 1993-08-06 Vålerenga Norge Fotball 1913 31309
Steffen Søberg 356 70 1993-08-06 Vålerenga Norge Ishockey 1913 356

Hvorfor er dette nyttig? Jo, fordi vi nå har én tabell med alle mulige kombinasjoner av tuplene i de to relasjonene kan vi nå bruke π og σ til å velge ut interessant rader og attributter. F.eks. er det jo en fremmednøkkel mellom de to tabellene, hvor lag-attributten refererer til ireg-attributten. Vi kan nå velge ut de tuplene hvor disse to verdiene er like for å få en relasjon som inneholder all informasjon om utøvere og lag, men kun hvor utøveren spiller for laget på samme rad. Altså, vi bare omslutter uttrykket over med σlag = ireg, slik:

σlag = ireg(ρnavn → unavn(UtøvereSportslag)

som gir:

unavn lag id født navn land gren etablert ireg
Lee Grant 23419 13 1983-01-27 Manchester United England Fotball 1878 23419
David de Gea 23419 1 1990-11-07 Manchester United England Fotball 1878 23419
Håvard Nygaard 81124 rain 1994-08-27 FaZe Clan USA Esport 2010 81124
Steffen Søberg 356 70 1993-08-06 Vålerenga Norge Ishockey 1913 356

Videre kan vi så bruke projeksjon til å velge ut de attributtene vi er interessert i. F.eks. om vi er interessert i navn på utøver og laget utøveren spiller for, kan vi omslutte uttrykket over med πunavn, navn slik:

πunavn, navn(σlag = ireg(ρnavn → unavn(UtøvereSportslag))

som gir:

unavn navn
Lee Grant Manchester United
David de Gea Manchester United
Håvard Nygaard FaZe Clan
Steffen Søberg Vålerenga

Join (⋈)

Join er en operator som skrives ⋈ og er en slags kombinasjon av kryssprodukt og seleksjon. Den tar en formell, akkurat som seleksjon, og to relasjoner, akkurat som kryssprodukt, og returnerer alle tupler i kryssproduktet hvor formelen er sann. F.eks. vil

Firma ⋈orgnr = jobb Person

gi oss:

orgnr firmanavn id navn jobb
1 DNB 4 Nils 1
2 Nordea 1 Ole 2
2 Nordea 3 Hanne 2
3 Finn 2 Kari 3

Altså er det det samme som σorgnr = jobb(Firma×Person).

Tilsvarende kunne vi også forenklet uttrykket vi skrev over for å finne navn på alle spillere og laget de spiller på slik:

πunavn, navn(ρnavn → unavn(Utøvere) ⋈lag = ireg Sportslag).

Joins som har en formel som kun bruker likhet kalles ofte en equi-join.

Naturlig join

Det finnes en egen type join, som heter naturlig join, som er relativt lik join-operatoren vi så over, men hvor man ikke oppgir noen formel. Resultatet er alle tupler som har like verdier i attributtene som har likt navn i de to relasjonene. Resultat-relasjonen inneholder kun én attributt for hvert attributt-navn, og fjerner dermed duplikate attributter.

F.eks. la oss si vi hadde følgende relasjoner, som er helt like de over, men hvor vi har endret navnet på jobb-attributten til å heller hete orgnr:

Person:

id navn orgnr
1 Ole 2
2 Kari 3
3 Hanne 2
4 Nils 1

Firma:

orgnr firmanavn
1 DNB
2 Nordea
3 Finn

Vi kan nå bruke en naturlig-join for å kombinere de to relasjonene direkte slik:

Firma ⋈ Person

og vi får da:

orgnr firmanavn id navn
1 DNB 4 Nils
2 Nordea 1 Ole
2 Nordea 3 Hanne
3 Finn 2 Kari

Merk at orgnr kun forekommer én gang, og at vi kun har tuplene hvor orgnr-verdiene er like i de to originale relasjonene.

Av og til bruker man heller symbolet * for naturlig join.

Merk at dersom to relasjoner ikke har noen like attributt-navn vil resultatet av en naturlig join mellom dem bli det samme som kryssproduktet. Merk også at naturlig join kan joine på ting om ikke gir mening i det hele tatt! Dersom vi tar en naturlig join mellom Utøvere og Sportslag vil vi få en relasjon som inneholder alle tupler hvor utøveren har likt navn som sportslaget, som jo i vårt tilfelle ville gitt en tom relasjon som svar.