LC238D http://www.aitel.hist.no/fag/_dmdb/ Databaser: Relasjonsmodellen, del I En relasjon er en matematisk mengde side 2 Egenskaper ved relasjoner side 3 Entitetsintegritet side 4-5 Referanseintegritet side 6-7 Å definere entitetsregler i SQL side 8 Autogenererte løpenummer som primærnøkkel side 9 Basisreferansen er: E.F. Codd (IBM): A Relational Model of Data for Large Shared Data Banks Comm. ACM, juni 1970 Se ellers læreboka, side 43-58, 104-114, august 2012 Forelesning 2, uke 35 En relasjon er en matematisk mengde En mengde er en samling dataverdier som kan være enkeltverdier eller sammensatte verdier. Ingen av verdiene kan forekomme mer enn én gang i mengden og verdiene er ikke ordnet på noen bestemt måte. Det kartesiske produktet av to mengder A og B, A x B, er mengden av alle ordnede par <a, b> hvor a є A og b є B. En relasjon mellom A og B er den delmengden av det kartesiske produktet AxB slik at <a,b> er sann. Den mengden av verdier som et attributt kan anta, kalles attributtets domene. Tabellformen er en måte å presentere relasjonen på. Vis på tavla side 2 1
Egenskaper ved relasjoner Tabeller som framstiller relasjoner har en del egenskaper som vanlige tabeller ikke har. Disse egenskapene følger av at relasjonene er matematiske mengder. Egenskaper ved slike tabeller: A. Duplikater eksisterer ikke (ingen like rader) B. Tuplene (radene) er uordnet C. Attributtene (kolonnene) er uordnet D. Verdiene er atomiske (relasjonen kalles normalisert) Relasjonens grad = antall attributter (kolonner) (binær, trinær, n-ær) Relasjonens kardinalitet = antall tupler (relasjonens tilstand, varierer over tid) En relasjonsdatabase er en samling navngitte, normaliserte relasjoner (kun atomiske verdier) med forskjellige navn. Relasjonsmodellen har innebygd to integritetsregler integritet = korrekthet entitetsintegritet, som er knyttet til primærnøkkelen referanseintegritet, som er knyttet til fremmednøkkelen side 3 Entitetsintegritet En entitet i databaseverden svarer til et objekt uten operasjoner i objektorientert tankegang. Hver tuppel i en relasjon inneholder data om en entitet. På samme måte som entiteter (objekter) i den virkelige verden er identifiserbare, skal også den enkelte tuppel i en relasjon være identifiserbar. En mengde attributter som gjør en tuppel entydig kalles en supernøkkel. En kandidatnøkkel er en minimal supernøkkel. En primærnøkkel er den kandidatnøkkelen vi velger til å identifisere en tuppel. Hele eller deler av denne kan ikke være NULL (det betyr at verdien mangler, det er ikke det samme som en tekststreng som består av blanke tegn, og heller ikke tallverdien 0). Kandidatnøkler som ikke velges til primærnøkkel, kalles alternative nøkler. En surrogatnøkkel er ofte et godt alternativ til en informasjonsbærende primærnøkkel. Gjerne løpenummer generert av databasesystemet. side 4 2
Eksempler på forskjellige typer nøkler ansatt(ansnr, fnr, navn, postnr, adr) En mengde attributter som gjør en tuppel entydig kalles en supernøkkel. Fnr Ansnr Fnr, navn Fnr, navn, adr Fnr, navn, adr, postnr, ansnr Alle mulige kombinasjoner som inneholder fnr og/eller ansnr En kandidatnøkkel er en minimal supernøkkel. Fnr Ansnr En primærnøkkel er den kandidatnøkkelen vi velger til å identifisere en tuppel. Hele eller deler av denne kan ikke være NULL (det betyr at verdien mangler, det er ikke det samme som en tekststreng som består av blanke tegn, og heller ikke tallverdien 0). Ansnr defineres som primærnøkkel i SQL Kandidatnøkler som ikke velges til primærnøkkel, kalles alternative nøkler. Fnr alternative nøkler bør settes UNIQUE i SQL En surrogatnøkkel er ofte et godt alternativ til en informasjonsbærende primærnøkkel. Gjerne løpenummer generert av databasesystemet. side 5 Tilbake til eksemplet fra forrige gang Lag database: studnr, navn, adresse, postnr, poststed, fagkode, fagnavn, karakter (kun én karakter pr. student og fag) Hvilke tabeller? Prøv! forslag fra salen: to tabeller, fungerte ikke riktig svar er fire tabeller Tenk objektorientert, finn objekter (klasser) og fordel attributtene. Tegn klassediagram uten operasjoner («datamodell») En student bor på min.1, max 1 poststed. På ett poststed bor min. 0, maks. mange (*) studenter. side 6 3
studnr, navn, adresse, postnr, poststed, fagkode, fagnavn, karakter (kun én karakter pr. student og fag) En student følger min 0, maks. mange fag Ett fag følges av min 0, maks. mange studenter side 7 Tillitsvalgt Marie Nilsson Vara: Glenn Skår side 8 4
Fra datamodell til tabeller, første intro. studnr, navn, adresse, postnr, poststed, fagkode, fagnavn, karakter (kun én karakter pr. student og fag) Lag tabellene. Primærnøkler Student: studnr Poststed: postnr Fag: fagkode Resultat: (studnr, fagkode) side 9 Referanseintegritet Fremmednøkler brukes til å kople sammen tabeller. En fremmednøkkel er et attributt (eller en kombinasjon av attributter) i en relasjon R2 (student) med verdier som skal eksistere som primærnøkkel i en relasjon R1 (poststed). Fremmednøkkelen i R2 og primærnøkkelen i R1 må være definert på samme domene (i praksis samme datatype). Fremmednøkler (men ikke deler av fremmednøkler) kan ha verdien NULL. R1 og R2 kan være samme relasjon. Eksempel på tavla side 10 5
Et eksempel til Fremmednøkkelen refererer til primærnøkkel i samme relasjon side 11 Å definere integritetsregler i SQL CREATE TABLE student( studnr INTEGER, fornavn VARCHAR(30) NOT NULL, ettenavn VARCHAR(30) NOT NULL, adresse VARCHAR(30) NOT NULL, postnr SMALLINT NOT NULL, CONSTRAINT student_pk PRIMARY KEY(studnr)); CREATE TABLE poststed( postnr SMALLINT, sted VARCHAR(20) NOT NULL, CONSTRAINT poststed_pk PRIMARY KEY(postnr)); CREATE TABLE ansatt( idnr INTEGER, fornavn VARCHAR(30) NOT NULL, ettenavn VARCHAR(30) NOT NULL, leder INTEGER, CONSTRAINT ansatt_pk PRIMARY KEY(idnr)); CREATE TABLE fag( fagkode CHAR(6), fagnavn VARCHAR(30) NOT NULL, CONSTRAINT fag_pk PRIMARY KEY(fagkode)); CREATE TABLE studerer( studnr INTEGER, fagkode CHAR(6), karakter CHAR(1), CONSTRAINT studerer_pk PRIMARY KEY(studnr, fagkode)); ALTER TABLE student ADD CONSTRAINT student_fk1 FOREIGN KEY (postnr) REFERENCES poststed; ALTER TABLE studerer ADD CONSTRAINT studerer_fk1 FOREIGN KEY (studnr) REFERENCES student; ALTER TABLE studerer ADD CONSTRAINT studerer_fk2 FOREIGN KEY (fagkode) REFERENCES fag; ALTER TABLE ansatt ADD CONSTRAINT ansatt_fk1 FOREIGN KEY (leder) REFERENCES ansatt; Prøv enkle SQL-setninger, også for å teste integritetsreglene side 12 6
Autogenererte løpenummer som primærnøkkel Oracle-syntaks: CREATE SEQUENCE person_sekvens; CREATE TABLE person( pnr INTEGER NOT NULL, andre attributter... INSERT INTO person VALUES( person_sekvens.nextval,... andre data...); Java DB CREATE TABLE bok( bok_id INTEGER GENERATED ALWAYS AS IDENTITY, andre attributter... CONSTRAINT bok_pk PRIMARY KEY(bok_id)); INSERT INTO bok VALUES(DEFAULT,... andre data...); Drøft fordeler og ulemper med informasjonsbærende nøkler side 13 7