Det här är ett avsnitt i en webbkurs om databaser som finns fritt tillgänglig på adressen http://www.databasteknik.se/webbkursen/. Senaste ändring: 18 juli 2005.

Av Thomas Padron-McCarthy. Copyright, alla rättigheter reserverade, osv. Skicka gärna kommentarer till webbkursen@databasteknik.se.

Relationsmodellen

Relationsmodellen är en av flera olika datamodeller, dvs sätt att organisera sina data, som används i databaser. Det är den vanligaste modellen. Den går, enkelt uttryckt, ut på att man lagrar data i tabeller.

Varför ska jag lära mig det här?

Relationsmodellen är den helt dominerande datamodellen i dagens databashanterare. Om du någon gång kommer i kontakt med databaser, vilket är ganska troligt, är chansen därför stor att det är just relationsdatabaser det rör sig om.

Relationer

Relationsmodellen går ut på att data lagras i relationer. En relation är samma sak som en tabell, med rader och namngivna kolumner, även om den sortens tabeller som används här har en del speciella egenskaper.

Raderna brukar kallas tupler. Kolumnerna brukar kallas attribut.

Titta på den här tabellen, som vi kan kalla Medlem (tabell 1), och som innehåller data om medlemmarna i en klubb:

Medlemsnummer Namn Telefonnummer
2 Stina 282677
3 Saddam 260088
4 Lotta 174590
1 Olle 260088

Varje tupel (rad) innehåller data om en medlem i klubben. Varje attribut (kolumn) anger en viss egenskap som medlemmarna kan ha.

Tuplerna (raderna) i en relation utgör en mängd. Det betyder att tuplerna (raderna) inte har någon speciell ordning, utan de kan skrivas i vilken ordning som helst. Det kan inte heller förekomma några dubletter, dvs flera tupler med samma värde på alla attributen (kolumnerna).

Ibland definierar man en eller flera nycklar. En nyckel är ett attribut, eller en kombination av attribut, vars värden är unika. Om man har en nyckel i en relation, så kan det inte finnas flera tupler med samma värde på alla attribut som ingår i nyckeln. Nyckeln kan därför användas för att ange eller "peka ut" en viss tupel (rad), så att man inte blandar ihop den med de andra tuplerna. I tabellen Medlem ovan är attributet Medlemsnummer en nyckel, om vi antar att medlemsnummer är unika. Attributen Namn och Telefonnummer kan vi inte använda som nycklar, eftersom vi vet att namn på personer inte brukar vara unika, och eftersom flera medlemmar kan bo på samma ställe och ha samma telefonnummer.

Relationen innehåller bara enkla och atomära värden. Att värdena är enkla betyder att man inte kan ha mer än ett enda värde per ruta. Om en person, i relationen Medlem ovan, har två olika telefonnummer, kan vi alltså inte skriva in båda telefonnumren på samma rad. Vi måste använda två olika rader för att lagra detta. Att värdena är atomära betyder att vi (normalt) bara arbetar med hela telefonnumret, och inte tittar på delar av det. Att relationen har enkla och atomära värden kallas också första normalformen.

Det finns också något som kallas null-värden. Om en person inte har någon telefon, eller om vi inte vet telefonnumret, kan vi skriva värdet null i det attributet. Null är inte samma sak som 0. Om till exempel en temperaturangivelse satts till null betyder det att det inte finns någon temperatur, och det är ju inte samma sak som en temperatur på 0 grader.

Schema och innehåll

I databassammanhang brukar man skilja på schemat, som beskriver vad som kan finnas i databasen, och det innehåll som råkar finnas där vid ett visst tillfälle.

Därför talar vi om relationens schema (även kallat intension) och relationens innehåll (även kallat instans eller extension). I schemat ingår bland annat vilka attribut som relationen har, deras domäner (dvs vilka värden de kan innehålla), och vilka nycklar som finns.

Olika sorters nycklar

Här ovan sa vi att en nyckel är ett attribut, eller en kombination av attribut, vars värden garanterat är unika. Det är inte riktigt sant. Med den definitionen på nyckel skulle till exempel attributkombinationen Medlemsnummer + Namn vara en nyckel. Om Medlemsnummer är unikt, så blir det ju inte mindre unikt om man stoppar dit Namn också! Men det verkar ju ganska dumt. Vi har också slarvat lite med terminologin, och det ska vi åtgärda nu.

Vi börjar med att kalla ett attribut, eller en kombination av attribut, vars värden garanterat är unika, för en supernyckel. En supernyckel kan innehålla "onödigt" många attribut. I relationen Medlem finns fyra supernycklar:

En kandidatnyckel är en minimal supernyckel, dvs en supernyckel där man inte kan ta bort några attribut om den fortfarande ska vara garanterat unik. I relationen Medlem finns bara en kandidatnyckel, nämligen attributet Medlemsnummer. (Men en kandidatnyckel kan vara sammansatt av flera attribut, om alla behövs för att den ska bli unik.)

Det finns alltid minst en supernyckel och minst en kandidatnyckel i varje relation. Samtliga attribut tillsammans utgör alltid en supernyckel, för vi har ju sagt tidigare att det inte kan finnas två rader med samma värde på alla attribut. Alltså är kombinationen av alla attributen garanterat unik, och därför en supernyckel. (Att bevisa att det finns minst en kandidatnyckel lämnas som övning till den intresserade läsaren. [Svar]) Kandidatnycklarna heter kandidatnycklar eftersom det är bland dessa kandidater som vi väljer en primärnyckel. Vi väljer alltid en primärnyckel i varje relation, och det är primärnyckeln som oftast används för att identifiera tupler i tabellen.

De övriga kandidatnycklarna, som inte valdes som primärnyckel, kallas alternativnycklar.

Språkförbistring: När man säger nyckel, som i att "den här kolumnen är en nyckel", brukar man för det mesta mena kandidatnyckel: "den här kolumnen är en kandidatnyckel". Om man säger nyckeln, i bestämd form, brukar man mena primärnyckeln.

Kopplingar mellan relationer

Låt oss utvidga vår exempeldatabas, som än så länge bara innehåller relationen Medlem (tabell 1), med ytterligare två relationer. Först skapar vi relationen Sektion (tabell 2) som innehåller data om olika sektioner i klubben (som nu visar sig vara en sportklubb):

Sektionskod Namn Ledare
A Bowling 4
C Konstsim 2
B Kickboxing 4

Vi antar att Sektionskod är primärnyckel, med Namn som alternativnyckel.

Attributet Ledare är ett referensattribut, även kallat främmande nyckel, till relationen Medlem. Ett referensattribut refererar alltid till primärnyckeln i en annan (eller samma!) relation. Vi ser till exempel att ledaren för bowlingsektionen är medlem nummer 4. Alltså går vi till relationen Medlem, letar rätt på medlem nummer 4, och ser att det är Lotta.

Namnet främmande nyckel på referensattribut beror på att referensattributets domän, dvs vilka värden det kan ha, är samma som primärnyckeln i den relation som det refererar till.

Om det står att medlem nummer 4 leder en sektion, så måste det också finnas en medlem nummer 4 i medlemstabellen. Detta villkor kallas referensintegritet.

Sedan relationen Deltar (tabell 3), som anger vilka medlemmar som deltar i vilka sektioner:

Medlem Sektion
1 A
1 B
1 C
2 C
3 A

Medlem är referensattribut till relationen Medlem, och Sektion är referensattribut till relationen Sektion. Medlem och Sektion utgör tillsammans den enda kandidatnyckeln, och blir därför automatiskt primärnyckel.

De viktigaste begreppen

De viktigaste begreppen från det här avsnittet finns också med i ordlistan:

relationsmodellen, relationsdatabas, relation (eller tabell), tupel (eller rad), attribut (eller kolumn), primärnyckel, kandidatnyckel, supernyckel, referensattribut (eller främmande nyckel), referensintegritet

Litteratur


Webbkursen om databaser av Thomas Padron-McCarthy.