Det kan vara bra att läsa kursavsnittet om ER-modellering först, och kanske också avsnittet om relationsmodellen.
Översättning, med några inlagda exempel på hur data kan komma att se ut:
Person
Nummer | Namn | Telefon |
---|---|---|
17 | Hjalmar | 174590 |
4711 | Hulda | 019-94639 |
42 | Hjalmar | 070-7347013 |
Entitetstypens nyckel blir primärnyckel i tabellen. Om det finns flera kandidatnycklar, så väljer man en av dem som primärnyckel. Välj i så fall hellre en numerisk nyckel än ett strängfält, för tänk på att andra tabeller kanske ska ha referensattribut till primärnyckeln i den här tabellen.
Egentligen ska det alltid finnas en nyckel angiven för varje vanlig entitetstyp i ER-diagrammet, men om vi glömt nyckeln (till exempel för ett samband som objektifierats) så måste vi hitta på en nu. Ett enkelt löpnummer i form av ett heltal brukar fungera bra.
De två entitetstyperna blir förstås två tabeller. Äger-sambandstypen blir ett referensattribut i Bil-tabellen:
Person
|
Bil
|
BMW-bilen har ingen ägare, så det står null i kolumnen Ägare. (Den bara står där och väntar på att någon ska hitta den!) ER-diagrammet säger inget om att alla bilar måste ha en ägare. Om Bil hade varit markerat som fullständigt deltagande, alltså med ett dubbelstreck till Äger-sambandet, så kan vi lägga på integritetsvillkoret not null när vi skapar tabellen.
Det finns alltså tre olika sätt att göra översättningen:
De två entitetstyperna blir förstås två tabeller. Sen ska vi översätta Har-sambandstypen, och vi börjar med ett första, rättframt, försök:
Person
|
Näsa
|
Sambandstypen Har blir attributet Näsa i Person-tabellen. Som vi ser har den ene Hjalmar (person 17) en ganska normal näsa, medan Hulda har en ovanligt lång näsa. Den andre Hjalmar (person nummer 42) har ingen näsa alls. Den stackarn.
Men förmodligen (gissar vi) finns det fler personer i databasen som inte har någon näsa, än det finns lösa näsor utan personer. Därför är det kanske bättre att placera referensattributet i den andra tabellen. Dels slipper vi en del null-värden, och dels känns det (åtminstone för den som hållit på en del med databasdesign) naturligare att näsan refererar till den person den hör till:
Person
|
Näsa
|
Man vill helst undvika null-värden. Om den ena entitetstypen har fullständigt deltagande, dvs är ansluten med ett dubbelstreck till sambandstypen, så bör man placera referensattributet på den sidan. I annat fall bör man välja den entitetstyp som har störst ("mest fullständigt") deltagande, i det här fallet alltså Näsa.
Ett tredje sätt är att slå ihop tabellerna. I så fall bör bör (åtminstone nästan) alla personer ha näsor, och (åtminstone nästan) alla näsor ha personer, annars blir det en massa null-värden.
Person
Nummer | Namn | Telefon | Näsnummer | Näslängd |
---|---|---|---|---|
17 | Hjalmar | 174590 | 1 | 5 cm |
4711 | Hulda | 019-94639 | 2 | 14 cm |
42 | Hjalmar | 070-7347013 | null | null |
Alla tre översättningarna fungerar, men i det här exemplet skulle jag förmodligen välja mittenalternativet, alltså att ha ett referensattribut SitterPå i tabellen Näsa.
De två entitetstyperna blir förstås två tabeller. Äger-sambandstypen blir en "mellantabell" som kopplar ihop dem:
Person
|
Äger
|
Hus
|
Tabellen Äger har en primärnyckel som består av både Person och Hus. Dessutom är Person referensattribut till tabellen Person, och Hus är referensattribut till tabellen Hus.
Person 42 äger inget hus, och hus 4 har ingen ägare. Hus 3 ägs gemensamt av två personer.
Tekniken med en mellantabell kan användas också när man översätter 1:1-samband och 1:N-samband. Det kan vara bra till exempel om deltagandet är väldigt lågt på båda sidor om sambandstypen, så att det skulle blir många null-värden med de vanliga lösningarna. För 1:1- och 1:N-samband blir primärnyckeln i mellantabellen inte sammansatt av primärnycklarna från båda de hopkopplade tabellerna.
Översätt alltså sambandstypen Sett med en egen tabell, som har en sammansatt primärnyckel bestående av primärnycklarna från de tre hopkopplade tabellerna:
Sett
Person | Film | Biograf |
---|---|---|
17 | 1 | 1 |
17 | 1 | 2 |
17 | 2 | 1 |
42 | 2 | 2 |
Person
|
Film
|
Biograf
|
Samma exempel på 1:N-samband som förut, men med ett attribut på sambandet:
Vi översätter precis som vi gjorde förut, men lägger till kolumnen Inköpsår bredvid referensattributet Ägare:
Person
|
Bil
|
Samma exempel på N:M-samband som förut, men med ett attribut på sambandet:
Vi översätter precis som vi gjorde förut, men lägger till kolumnen Andel i tabellen Äger:
Person
|
Äger
|
Hus
|
Exempel:
Lägenhet
|
Rum
|
Tabellen Rum har en primärnyckel som består av både Lägenhet och Namn. Dessutom är Lägenhet referensattribut till tabellen Lägenhet.
Exempel:
Person
Nummer | Namn | Riktnummer | Lokalnummer |
---|---|---|---|
17 | Hjalmar | null | 174590 |
4711 | Hulda | 019 | 94639 |
42 | Hjalmar | 070 | 7347013 |
Exempel:
Person
|
Telefonnummer
|
Behövs det verkligen ett exempel på hur man struntar i ett attribut? Men okej då:
Person
|
Hus
|
Notera att jag snikade in ett exempel på ett N:1-samband här. Förut har vi bara sett 1:N-samband, men ett N:1-samband hanteras precis likadant, fast förstås spegelvänt. Dessutom ser vi att man kan ha en tabell som bara består av en enda kolumn. Det är inget konstigt med det.
Ett exempel med personer, som (förutom att de är personer) också kan vara studenter och lärare:
Varje entitetstyp blir en tabell:
Person
|
Student
|
Lärare
|
Förklaring:
Den förste Hjalmar (person 17) är student. Nykomlingen Bengt är lärare. Hulda är både student och lärare. Den andre Hjalmar (person 42) är varken lärare eller student, utan bara en person.
För att få fram all information om en viss entitetsinstans, till exempel Hulda, måste man alltså titta i flera olika tabeller.
Sambandstyper ärvs också, och de hanteras på samma sätt som attribut. Anta att personer kan bo i hus, och studenter kan läsa program:
När vi översätter till tabeller så bli sambandet Bor i ett referensattribut i tabellen Person, och sambandet Läser ett referensattribut i tabellen Student:
Person
|
Student
|
Lärare
|
Hus
|
Program
|
Vi ser till exempel att Hulda bor i hus nummer 1, och att hon läser Datavetenskapliga programmet.