INF1300 Introduksjon til databaser

Like dokumenter
INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser

Dagens tema: Relasjonsmodellen (funksjonelle avhengigheter og nøkler, integritetsregler) Realisering: Fra ORM til relasjoner

INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser

INF212 - Databaseteori. Kursinnhold

Dagens tema: Ekvivalente stier og joinskranker Ringskranker Informasjonsbærende representasjoner Behandling av tid

INF3100 Databasesystemer

INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser

IN2090 Introduksjon til databaser

INF3100 Databasesystemer

INF1300 Introduksjon til databaser

Integritetsregler i SQL

Informasjonssystemer, DBMSer og databaser

INF1300 Introduksjon til databaser

Integritetsregler i SQL. Primærnøkler

Repetisjon: (nesten) alt du trenger å kunne om ORM og realisering

Repetisjon: (nesten) alt du trenger å kunne om ORM og realisering

Dagens tema: Begrepsdannelse Eksterne entydighetsskranker Verdiskranker Mengdeskranker

Dagens tema: Begrepsdannelse Eksterne entydighetsskranker Representasjon n-1-regelen Verdiskranker Mengdeskranker

Repetisjon: (nesten) alt du trenger å kunne om ORM og realisering

INF1300 Introduksjon til databaser

Realiseringsalgoritmen fra ORM til relasjoner Intro til mengdeskranker i ORM

Integritetsregler i SQL

INF1300 Introduksjon til databaser

Flere skranker i ORM Integritetsregler med «CHECK» i SQL

INF1300 Introduksjon til databaser

UNIVERSITETET I OSLO INF1300 Introduksjon til databaser

UNIVERSITETET I OSLO INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser

UNIVERSITETET I OSLO

SQL: Datatyper m.m. Evgenij Thorstensen V18. Evgenij Thorstensen SQL: Datatyper m.m. V18 1 / 12

SQL Structured Query Language. Definere tabeller Skranker Fylle tabeller med data

INF1300 SQL Structured Query Language del 1. Stoff som blir/ble forelest i oktober 2013

Dagens tema: Begrepsdannelse Eksterne entydighetsskranker Representasjon n-1-regelen

SQL: Integritetsregler, triggere og views

INF1300 Introduksjon til databaser: SQL Structured Query Language. En første introduksjon Lysark til forelesning onsdag 22.

INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser: SQL Structured Query Language. En første introduksjon Lysark til forelesning mandag 14.

INF1300 Introduksjon til databaser

Datamodellering og databaser SQL, del 2

Dagens tema: Relasjonsmodellen Funksjonelle avhengigheter og nøkler Realisering: Fra ORM til relasjoner

INF 329: Web-Teknologier. Dataimplementasjon. Fra Kapittel 11 i «Designing Data-Intensive Web Applications» Presentasjonsdato: 17/10/2004

Databaser: Relasjonsmodellen, del I

Sensorveiledning for IN2090 og INF desember :30 18:30 (4 timer)

Datamodellering og databaser SQL, del 2

Utvikling fra kjernen og ut

INF1300 Introduksjon til databaser

1. SQL datadefinisjon og manipulering

UNIVERSITETET I OSLO

Notater: INF1300. Veronika Heimsbakk 8. januar 2013

Ekvivalente stier (Equivalence of Path, EOP) i storm

Språk for dataorientert modellering

IN2090 Databaser og datamodellering ORM 1

Oppgaver Oppgave a: Sett opp mulige relasjoner

Dagens tema: Begrepsdannelse Eksterne entydighetsskranker

Datamodellering og databaser SQL, del 2

INF1300 Introduksjon til databaser

UNIVERSITETET I OSLO INF1300 Introduksjon til databaser

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) Institutt for Informatikk. INF Ragnar Normann 1

Normalisering. Hva er normalisering?

Skranker og avledninger

Ekstramateriale: Eksempel på PostgreSQL 8.4 og SQL:1999 (ikke pensum 2012)

SQL 3: Opprette tabeller, datainnsetting og utsnitt

Informasjonsbærende representasjoner

Tilkobling og Triggere

Løsningsforslag til eksamen i IN2090 Databaser og datamodellering og INF1300 Introduksjon til databaser 6. desember :30 18:30 (4 timer)

SQL Structured Query Language

UNIVERSITETET I OSLO SQL. Structured Query Language. (forts.) Institutt for Informatikk. INF Ragnar Normann 1

INF3100 Databasesystemer

Dataorientert modellering

Repetisjon: Normalformer og SQL

INF1300 Introduksjon til databaser: SQL Structured Query Language

Dagens tema: Begrepsdannelse Eksterne entydighetsskranker Verdiskranker Mengdeskranker Underbegreper og underbegrepsskranker Kombinerte totale roller

Normalisering. Hva er normalisering?

IN2090 Introduksjon til databaser

VÆRSTASJONER Obligatorisk oppgave nr. 2 i INF1300 høsten 2011

UNIVERSITETET. triggere og views. Institutt for Informatikk. INF Arne Maus 1

INF1300 Introduksjon til databaser

UNIVERSITETET I OSLO

Ekvivalente stier (Equivalence of Path, EOP) i storm

MATOPPSKRIFTER Obligatorisk oppgave nr. 2 i INF1300 høsten 2010

UNIVERSITETET SQL. Structured Query Language (forts.) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

Dette er vår første obligatoriske oppgave i kurset Moderne Databaseteknologi.

Utvikling fra kjernen og ut

Databaser. Relasjonsmodellen 1 Læreboka: Kap. 2 Relasjonsmodellen Faglærere: Tore Mallaug, Kjell Toft Hansen

INF Introduksjon til databaser ORM I

IN2090 Databaser og datamodellering 07 Datamanipulering

Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

*UXSSHULQJ IRU JUDXWVNDOOHU (QYLVXHOOJXLGHJMHQQRPQRHQ DY1,$0JUXSSHULQJHQV XQGHUIXQGLJKHWHU

Dagens tema: Realiseringsalgoritmen (også kalt "grupperingsalgoritmen") fra ORM-diagram til relasjonsskjema

DBMS Database Management System (repetisjon) Programmeringsgrensesnitt. Serialiserbarhet

Miniverden og ER- modell

INF1300 Introduksjon til databaser

Gruppeøvelse 20/ Dagens tema: - Gruppering/realisering

Transkript:

UNIVERSITETET I OSLO INF1300 Introduksjon til databaser Dagens tema: Fra skranker til integritetsregler (restriksjoner) Klassifisering av integritetsregler Forekomstrestriksjoner Realisering av integritetsregler i SQL ORM som analysemetode Kvalitetssikring av ORM-modeller INF1300-17.11.2008 - Ragnar Normann 1

Fra skranker til integritetsregler Ved gruppering fra en ORM modell til et relasjonsdatabaseskjema blir skrankene i modellen omformet til integritetsregler i skjemaet De aller fleste skrankene overføres direkte til skjemaet Noen få ganger kan det være fornuftig å la være å håndheve en skranke i databasen, men dette er unntak Vi kan aldri ha en integritetsregel i skjemaet som ikke kommer fra en skranke i modellen Det betyr at skjemaet aldri kan være strengere enn modellen INF1300-17.11.2008 - Ragnar Normann 2

Håndtering av verdiskranker En verdiskranke begrenser domenet for et attributt Eksemplet ovenfor gir følgende definisjon av Medaljeutbytte: CREATE TABLE Medaljeutbytte( land_navn CHAR(20) NOT NULL REFERENCES Land(navn), med_kode CHAR(1) NOT NULL CHECK(med_kode IN ( G, S, B )), antall INTEGER CHECK( (0 < antall) AND (antall < 70) ), CONSTRAINT med_utb_pk PRIMARY KEY(land_navn,med_kode) ); INF1300-17.11.2008 - Ragnar Normann 3

Gruppererroller og referanseroller I grupperingen vil en mange-til-én setningstype fra A til B bli til en fremmednøkkel til B-relasjonen i A-relasjonen En én-til-én setningstype mellom B og C hvor bare B-rollen er total, blir til en entydig fremmednøkkel til C-relasjonen i B-relasjonen Rollen til det begrepet som får fremmednøkkelen, kalles gruppererrollen i setningen (rolle 1 og 3 i eksemplet) Rollen som blir til en fremmednøkkel, kalles referanserollen i setningstypen (rolle 2 og 4 i eksemplet) INF1300-17.11.2008 - Ragnar Normann 4

Håndtering av én-til-én setningstyper uten totale roller Her har vi et valg: Vi kan velge å peke ut en av rollene som gruppererrolle, dvs. hvilken relasjon som skal få fremmednøkkelen Vi kan velge å danne et begrep av setningstypen Det grupperte resultatet blir en relasjon som består av to kandidatnøkler som er fremmednøkler til de to relasjonene som stammer fra de to begrepene som inngår i setningstypen Merk: I storm må vi selv foreta denne begrepsdannelsen INF1300-17.11.2008 - Ragnar Normann 5

Håndtering av én-til-én setningstyper med to totale roller Slike setningstyper forekommer sjelden Ett eksempel er en setningstype som kobler sammen hovedsteder med sine land Vi må da velge en av rollene som gruppererrolle Dersom ett av de involverte begrepene bruker denne setningstypen som sin prefererte referansemåte, har vi gjort en analysefeil De to begrepene skal da slåes sammen til ett begrep, og setningstypen skal fjernes fra ORM-modellen INF1300-17.11.2008 - Ragnar Normann 6

Gruppering vs modellering Valg av gruppererroller er en del av grupperingsprosessen, og ikke av modelleringsprosessen Det samme gjelder valg av hvilke referanserelasjoner som skal undertrykkes, og hvilke som skal beholdes Resten av grupperingsprosessen er automatiserbar og kan gjøres av en datamaskin INF1300-17.11.2008 - Ragnar Normann 7

Navn på attributter 1 I eksemplet ovenfor vil A-relasjonen få en fremmednøkkel til B-relasjonen bestående av to attributter: ett C-attributt og ett D-attributt Ved maskinell gruppering vil navnene på disse attributtene bli C_rolle2 og D_rolle2 (evt. c_rolle2 og d_rolle2 hvor c og d er representasjonene til hhv C og D) INF1300-17.11.2008 - Ragnar Normann 8

Navn på attributter 2 Ved manuell gruppering kan dere velge navnene på de to attributtene i fremmednøkkelen fritt Det kan dere forøvrig gjøre for alle andre attributter også INF1300-17.11.2008 - Ragnar Normann 9

Forekomstrestriksjoner En integritetsregel som kan håndheves lokalt i en enkelt forekomst i en tabell, kalles en forekomstrestriksjon På engelsk kalles den en «intra record constraint» En integritetsregel som ikke er en forekomstrestriksjon, har ikke noen egen betegnelse på norsk På engelsk kalles den en «inter record constraint» Forekomstrestriksjoner er billige å håndheve fordi vi ikke trenger å lese noen andre forekomster enn den vi holder på med Forekomstrestriksjoner kan bare brytes ved innlegging og endring, aldri ved sletting INF1300-17.11.2008 - Ragnar Normann 10

Ulikhet i referanseroller Gruppert skjema: Person personnavn {pk} gren_blir_saget gren_blir_sittet_på Her sammenligner vi to referanseroller til Gren, og disse skal ikke ha noen felles forekomst Når vi legger inn en ny forekomst av Person, må vi kontrollere at 1) verdien i gren_blir_saget ikke må finnes som verdi i gren_blir_sittet_på i noen tidligere forekomster 2) verdien i gren_blir_sittet_på ikke må finnes som verdi i gren-blir-saget i noen tidligere forekomster INF1300-17.11.2008 - Ragnar Normann 11

Ulikhet i gruppererroller Gruppert skjema: Person personnavn {pk} gren_blir_saget gren_blir_sittet_på Her sammenligner vi to gruppererroller for Person, og disse skal ikke ha noen felles forekomst Det betyr at ingen forekomst av Person skal finnes både i rollen sitter-på og i rollen sager Når vi legger inn en ny forekomst av Person, må vi altså kontrollere at minst ett av attributtene gren_blir_sittet_på og gren_blir_saget er NULL Dette er en forekomstrestriksjon hvor vi bare ser på NULLverdier INF1300-17.11.2008 - Ragnar Normann 12

Dobbeltrolleulikhet Gruppert skjema: Person personnavn {pk} gren_blir_saget gren_blir_sittet_på Dette er en dobbeltrolleskranke hvor vi sammenligner de to gruppererrollene Den sier at ingen forekomstpar av Person og Gren skal ha samme verdi i rolleparene (sager, blir saget) og (sitter på, blir sittet på) Når vi legger inn en ny forekomst av Person, må vi altså kontrollere at minst ett av attributtene gren_blir_saget og gren_blir_sittet_på er NULL, eller at de har forskjellig verdi I denne forekomstrestriksjonen sammenligner vi verdier INF1300-17.11.2008 - Ragnar Normann 13

Mengdekranker som blir forekomstrestriksjoner Enkeltrolleskranker som bare går mellom gruppererroller, blir til forekomstrestriksjoner som bare ser på NULL (Dette gjelder også påkrevde rollekombinasjoner) Dobbeltrolleskranker hvor gruppererrollene sammenlignes, blir til forekomstrestriksjoner hvor verdiene i attributtene sammenlignes Ingen andre mengdeskranker blir til forekomstrestriksjoner En generell påkrevd rollekombinasjon som involverer flere referanseroller, er svært dyr å håndheve, og den er derfor kandidat til en skranke vi velger å neglisjere INF1300-17.11.2008 - Ragnar Normann 14

Håndtering av andre skranker Håndtering av delmengde- og likhetsskranker blir helt tilsvarende håndteringen av ulikhetsskranker Ekvivalente stier blir en slags likhetsskranke I tilfellet fra Oblig3 der Billett arver én båt fra Avreise og én båt fra Køye, og verdien av de to båtene må være like i hver Billett-forekomst, ordner vi det enklest ved å slå de to båt-attributtene sammen til ett Fremmednøkler er spesialtilfeller av delmengdeskranker At A har en fremmednøkkel til B håndheves som to integritetsregler: Ved INSERT på A må vi sjekke at fremmednøkkelen har en lovlig verdi (peker på en forekomst av B) Ved DELETE av en B må vi sjekke at ingen A har en fremmednøkkel til denne forekomsten av B INF1300-17.11.2008 - Ragnar Normann 15

Forekomstrestriksjoner i SQL Gruppert skjema: Person personnavn {pk} gren_blir_saget gren_blir_sittet_på Alle forekomstrestriksjoner kan i SQL uttrykkes ved hjelp av CHECK() Eksempel: Når vi legger inn en ny forekomst i Person, må minst ett av attributtene gren_blir_saget og gren_blir_sittet_på være NULL, eller de må ha forskjellig verdi I SQL uttrykkes dette slik: CHECK( (gren_blir_saget IS NULL) OR (gren_blir_sittet_på IS NULL) OR (gren_blir_saget <> gren_blir_sittet_på) ) INF1300-17.11.2008 - Ragnar Normann 16

Andre integritetsregler i SQL Av andre integritetsregler (de som ikke er forekomstrestriksjoner) har vi tidligere sett hvordan vi definerer Primærnøkler Andre entydighetsrestriksjoner Fremmednøkler De øvrige må vi programmere selv som databasefunksjoner som kalles fra triggere En trigger utløses av en hendelse som INSERT, DELETE eller UPDATE i databasen Hvordan man programmerer triggere og databasefunksjoner er svært DBMS-avhengig INF1300-17.11.2008 - Ragnar Normann 17

Triggere og databasefunksjoner i Postgres NB Dette er kursorisk pensum Dere skal vite hva triggere og databasefunksjoner er, men dere vil ikke bli bedt om å programmere slike De som ønsker å lære mer om dette, kan lese kapittel 10 i en av pensumbøkene i INF1300 i 2007: Neil Matthew, Richard Stones: Beginning databases with PostgreSQL (Second edition) Apress 2005, ISBN 1-59059-478-9 INF1300-17.11.2008 - Ragnar Normann 18

PostgreSQL-funksjoner I Postgres 8.0 eller høyere lages funksjoner slik: CREATE FUNCTION fnavn ( [par1 type1 [, par2 type2]... ] ) RETURNS returtype AS $$ programtekst $$ LANGUAGE programmeringsspråk Blant de lovlige programmeringsspråkene er plpgsql (Postgres eget PL/pgSQL) sql (PostgreSQL) perl (PL/Perl) python (PL/Python) Med unntak av sql må språkene lastes inn av superbruker, vanligvis som en del av installasjonen INF1300-17.11.2008 - Ragnar Normann 19

Eksempel på PL/pgSQL CREATE FUNCTION fakturasum ( fakturanr integer ) RETURNS trigger AS $$ DECLARE faktsum NUMERIC(9,2); BEGIN SELECT SUM(belop) INTO faktsum FROM Fakturalinje fl WHERE fl.faktura = fakturanr ; UPDATE Faktura SET belop = faktsum WHERE Faktura.faktnr = fakturanr ; RETURN NULL; END; $$ LANGUAGE plpgsql ; INF1300-17.11.2008 - Ragnar Normann 20

Triggere i PostgreSQL Syntaks for triggerdefinisjoner: CREATE TRIGGER navn { BEFORE AFTER } hendelse1 [ OR hendelse2 [ OR hendelse3 ] ] ON tabell FOR EACH { ROW STATEMENT } EXECUTE PROCEDURE funksjon ( parameterliste ) Hendelsene kan være INSERT, DELETE og UPDATE FOR EACH ROW betyr at funksjon kalles en gang for hver forekomst FOR EACH STATEMENT betyr at funksjon kalles bare en gang INF1300-17.11.2008 - Ragnar Normann 21

Eksempel på trigger CREATE TRIGGER sett_fakturabelop AFTER INSERT OR UPDATE OR DELETE ON Fakturalinje FOR EACH ROW EXECUTE PROCEDURE fakturasum ( Fakturalinje.faktura ) ; Slutt på Postgres-spesifikt kursorisk stoff INF1300-17.11.2008 - Ragnar Normann 22

Sterk gruppering 1 Ved vanlig gruppering vil ikke-totale gruppererroller gi attributter hvor NULL er tillatt Det å gruppere sterkt betyr at nullverdier aldri er tillatt Resultatet blir at relasjonene må splittes/fragmenteres: Vi får én relasjon med de attributtene som kommer fra setningstyper med total gruppererrolle Setningstyper hvor gruppererrollen ikke er total, blir til en egen relasjon bestående av primærnøkkelen og attributtet fra denne setningstypen Likhetsskranke mellom gruppererroller gjør at attributtene fra disse setningstypene kan legges i samme relasjon INF1300-17.11.2008 - Ragnar Normann 23

Sterk gruppering 2 Sterk gruppering er det samme som å opprette en subtype hver gang vi får en ikke-total gruppererrolle Dermed vil alle gruppererroller bli totale Resultatet blir en relasjonsdatabase hvor ingen attributter kan være NULL INF1300-17.11.2008 - Ragnar Normann 24

Beskrivelse (deskripsjon) av virkeligheten/interesseområdet (Universe of Discourse = UoD) Interesseområdet (UoD) Begrepsdannelse og idealisert representasjon Beskrivelse av interesseområdet INF1300-17.11.2008 - Ragnar Normann 25

ORM og 100%-prinsippet En fullstendig beskrivelse av interesseområdet kalles en informasjonsmodell 100%-prinsippet sier at det er mulig å lage en (endelig) informasjonsmodell på norsk (eller et annet naturlig språk som engelsk eller japansk) Hvorvidt dette er riktig, er et filosofisk spørsmål I ORM tas 100%-prinsippet som et aksiom (Det vi ikke kan beskrive med ord, kan vi heller ikke lage et informasjonssystem for) INF1300-17.11.2008 - Ragnar Normann 26

Skranker Beskrivelsen av forretningsreglene kalles skranker Statiske skranker beskriver begrensninger på mulige tilstander i interesseområdet Dynamiske skranker beskriver begrensninger på mulige forandringer i interesseområdet Den ferdige ORM-modellen er en beskrivelse av de statiske skrankene i vårt UoD For å beskrive de dynamiske skrankene i UoD må vi bruke en annen modelleringsteknikk, f.eks. UMLs sekvensdiagrammer INF1300-17.11.2008 - Ragnar Normann 27

Det begrepsmessige skjema Informasjonsmodellen brukt som regelverk (preskripsjon) for hvordan informasjonssystemet skal oppføre seg, kalles det begrepsmessige skjema Det begrepsmessige skjema uttrykkes i et språk som passer for den databaseteknologien vi skal bruke For relasjonsdatabaser bruker vi SQL INF1300-17.11.2008 - Ragnar Normann 28

Forretningregler, skranker og integritetsregler Reglene som gjelder i UoD kaller vi forretningsregler Beskrivelsen av forretningsreglene i informasjonsmodellen (ORM-modellen) kaller vi skranker I det begrepsmessige skjemaet kaller vi skrankene for integritetsregler Integritetsreglene bestemmer hva som er lovlig å lagre i informasjonssystemet, dvs. hva som er lovlige tilstander i databasen hva som er lovlige forandringer dvs. hva som er lovlige transisjoner/transaksjoner Det er umulig for en bruker av informasjonssystemet å gjøre noe som strider mot integritetsreglene INF1300-17.11.2008 - Ragnar Normann 29

3-skjemaarkitekturen for databaser Presentasjonslaget beskrives med eksterne skjemaer ( views ) hvordan informasjon skal presenteres for ulike brukere Det konseptuelle (eller logiske) laget beskrives i det begrepsmessige skjemaet hva som kan lagres, og hva som er lovlige forandringer Det fysiske laget beskrives i det interne skjemaet hvordan informasjon lagres, forandres og behandles INF1300-17.11.2008 - Ragnar Normann 30

ORM som metode 1 ORM (Object-Role Modelling) er en analysemetode for å lage et begrepsmessig skjema for et gitt UoD Resultatet kan tegnes som et klassisk ORM-diagram (storm), som et ORM2-diagram (Visio/NORMA), eller med en annen passende tegneteknikk Når dere bruker metoden i jobbsammenheng, så husk: Det er ikke dere som er eksperter på UoD Ekspertene på UoD kan normalt ikke forventes å forstå deres diagrammer Kommunikasjonen med ekspertene skal foregå på vanlig norsk (eller et annet naturlig språk) og med forekomstdiagrammer for elementære setninger INF1300-17.11.2008 - Ragnar Normann 31

ORM som metode 2 Hensikten med analysen er å gi dere tilstrekkelig kunnskap om UoD slik at dere kan lage en korrekt informasjonsmodell Ansvaret for at dere har forstått ekspertene riktig, er fullt og helt deres (det er dere som er informatikere) Det kan være vanskelig å få UoD-ekspertene til å forstå at det er de som skal forklare deg hva UoD er («Her betaler vi for en datakonsulent, og så må vi lære ham/henne jobben sin» er en ikke ukjent reaksjon) Det å innføre et nytt informasjonssystem må være godt forankret i organisasjonen (både i ledelsen og hos brukerne) INF1300-17.11.2008 - Ragnar Normann 32

Modellmakt Begrepet modellmakt ble introdusert av professor i sosiologi Stein Bråten i 1973 Det at dere behersker modelleringsmetoden ORM og har trening i å lese ORM-diagrammer, gjør at dere har et «overtak» på UoD-ekspertene Denne modellmakten gjør det farlig å bruke ORMdiagrammer som argumentasjon i diskusjoner med brukere og UoD-eksperter Faren ligger i at UoD-ekspertene bekrefter at modellen er riktig uten egentlig å ha forstått den INF1300-17.11.2008 - Ragnar Normann 33

Kvalitetssikring Kvalitetssikringen av modellen gjøres ved å oversette modellen tilbake til de elementære setningene den uttrykker For en stor analyse kan dette være en tidkrevende (og derfor dyr) prosess Så i praksis bør dere konsentrere dere om de UoD-spesifikke delene av modellen og hoppe over ORM-klisjeene (for der gjør dere vel ikke feil?) INF1300-17.11.2008 - Ragnar Normann 34

Noen eksamensråd for ORM Lillebjørn Nilsen er alltid optimist og løser kryssord med kulepenn Men han tegner ikke ORM-modeller med kulepenn Så det viktigste dere tar med dere på eksamen er blyant og viskelær (og kanskje en blyantspisser) Tegn og skriv tydelig Sensor er ikke tankeleser! Det er både lurt og lov å spre modellen over flere ark Lykke til med ORM-eksamen på onsdag om to uker! (og med relasjonsdatabaseeksamen onsdagen etter) INF1300-17.11.2008 - Ragnar Normann 35