Løsningsforslag matoppskrifter modellering Oppgave 1 Det beste er å ha et felles løpenummer på alle oppskrifter, uavhengig av hvor de stammer fra, og heller ha ekstraopplysninger som avhenger av om oppskriften er i en kokebok eller i utklippsboken. Ekstraopplysninger er her organisert ved underbegreper. Det er ikke tatt hensyn til at noen bøker er bind i et leksikon. Det viktigste i denne oppgaven er hvordan oppskriftene er representert. Det vil bli dårlig modellering om man har forskjellig representasjon for utklipp og bokoppskrifter. 49
Oppgave 2 Det viktige her er at en oppskrift kan ha mange ingredienser og at en matvare kan inngå i flere oppskrifter. Legg merke til hvordan mengdeangivelse og målangivelse er knyttet til begrepet Ingrediens, som her betegner en matvare brukt i en oppskrift. Dermed gis mengde og måleenhet relativt til hvilken oppskrift matvaren brukes i. Oppgave 3 Her er det antatt at det gjøres maksimalt ett forsøk pr. oppskrift pr. dag. Om det er fornuftig eller ikke, kan man jo diskutere. Det går an å gjøre mye mer ut av oppgave 3 hvis man vil; jeg tror imidlertid at det eneste praktiske er å ha en tekstlig forklaring som sier alternative mengder brukt, kryddere benyttet og mengden av hvert krydder, beskrivelse av de forskjellige fasene osv. 50
Oppgave 4 Her har vi tenkt oss at en meny kan gjenbrukes i flere selskaper. Det er maksimalt ett selskap pr. dato, så vi bruker datoen som referansemåte for selskapene. Menyen er organisert i form av nummererte linjer. Hver linje angir en rett/oppskrift. Linjenumrene sier i hvilken rekkefølge rettene serveres. Dersom man glemmer den eksterne entydigheten mellom Meny_med og Linje_for, må systemet generere nye linjenumre på tvers av menyer, f.eks. kan første meny ha linjenumrene 1-3, men da må andre meny ha linjenumre soms tarter på 4, osv. Det blir helt feil. Siden en rett/oppskrift neppe serveres mer enn én gang pr. meny, er det en ekstern entydighet mellom Meny_med og Oppskrift_er_rett_i også. Man kan jo derfor velge å sløyfe begrepet Linje, men vanligvis vil man nok gjerne vite i hvilken rekkefølge rettene er servert, og ikke bare hvilken oppskrift som ble benyttet til de enkelte rettene. Det er lagt inn en mulighet til å angi en drikkevare pr. rett og/eller å angi alle under ett på menynivå. 51
Oppgave 5 Denne kan sikkert gjøres mye bedre og mer detaljert, men her er det mest vesentlige tatt med, nemlig hvordan omregningsfaktoren mellom to enheter er. F.eks. kan vi da ha med fakta av formen 1 lb = 0,45 kg. 52
Oppgave 1-5, referanser 53
Oppgave 6 Vi viser først hvordan grupperingen kan presenteres på eksamen: Oppskrift (Oppskriftsid, Tittel, Tekst) Bokoppskrift (Oppskriftsid, Boktittel, Sidenr) Utklipp (Oppskriftsid, Løpenr, Dato, Kildenavn, Navn_gitt_av) Person (Navn) Ingrediens (Oppskriftsid, Matvarenavn, Måleenhet, Mengde) Tilberedningsforsøk (Oppskriftsid, Dato, Forklaring) Selskap (Dato, Menyid) PersoniSelskap (Dato, Navn) Menylinje (Menyid, Linjenr, Oppskriftsid, Drikkevare) DrikkevareiMeny (Menyid, Drikkevare) Omregning (Måleenhet_fra, Måleenhet_til, Faktor) I Utklipp er (Løpenr, Dato) kandidatnøkkel i tillegg til primærnøkkelen (Oppskriftsid). I Menylinje er (Menyid, Oppskriftsid) kandidatnøkkel i tillegg til primærnøkkelen (Menyid, Linjenr). Kandidatnøklene kan godt markeres med to streker i skjemaet, men skriv i såfall i tillegg hva de to strekene betyr. (Det er litt vanskelig å lage de to strekene typografisk, særlig for Menylinje, derfor er dette ikke gjort her.) Vi har valgt å undertrykke de fleste referansebegrepene. Unntaket er Person. Tre fremmednøkler: Fra (Oppskriftsid) i Menylinje til (Oppskriftsid) i Oppskrift Fra (Dato) i PersoniSelskap til (Dato) i Selskap Fra (Navn) i PersoniSelskap til (Navn) i Person Kommentarer: Relasjonene PersoniSelskap og DrikkevareiMeny stammer fra lange piler i ORM-diagrammene. Merk at underbegrepene Bokoppskrift og Utklipp har samme referansemåte som hovedbegrepet Oppskrift. 54
Under har vi også tatt med SQL-skjemaet slik det blir generert med storm. I storm markerte vi at alle referansebegrepene unntatt Person skulle undertrykkes. (Dette må gjøres før gruppering.) /******************************************************************* * PostgreSQL Database Description File for oppskrifter * Generated by storm Norsync AS 2008 * Generation Date is 2010/10/25 * Model Number is 3 * Version Checksum is 34622 /******************************************************************* * Table Definitions CREATE TABLE Bokoppskrift ( Oppskriftsid_for VARCHAR(20) NOT NULL, Boktittel_har_oppskrift VARCHAR(20) NOT NULL, Sidenr_har_oppskrift VARCHAR(20) NOT NULL CREATE TABLE Ingrediens ( Oppskriftsid_med VARCHAR(20) NOT NULL, Matvarenavn_er VARCHAR(20) NOT NULL, Maaleenhet_for VARCHAR(20) NOT NULL, Mengde_av VARCHAR(20) NOT NULL CREATE TABLE Meny_Drikkevare ( Menyid_har_tilbehoer VARCHAR(20) NOT NULL, Drikkevarenavn_er_tilbeh VARCHAR(20) NOT NULL CREATE TABLE Menylinje ( Linjenr_for VARCHAR(20) NOT NULL, Menyid_med VARCHAR(20) NOT NULL, Oppskriftsid_er_rett_i VARCHAR(20) NOT NULL, Drikkevarenavn_er_tilbeh VARCHAR(20) CREATE TABLE Omregning ( Maaleenhet_omregning_fra VARCHAR(20) NOT NULL, Maaleenhet_omregning_til VARCHAR(20) NOT NULL, Stoerrelse_er_for VARCHAR(20) NOT NULL 55
CREATE TABLE Oppskrift ( Oppskriftsid_for VARCHAR(20) NOT NULL, Tekst_for VARCHAR(20) NOT NULL, Tittel_er_tittel_paa VARCHAR(20) NOT NULL CREATE TABLE Person ( Navn_paa VARCHAR(20) NOT NULL CREATE TABLE Selskap ( Dato_for_selskap VARCHAR(20) NOT NULL, Menyid_ble_servert VARCHAR(20) NOT NULL CREATE TABLE Selskap_Person ( Dato_med_gjest VARCHAR(20) NOT NULL, Navn_er_gjest_i VARCHAR(20) NOT NULL CREATE TABLE Tilberedningsforsoek ( Oppskriftsid_i VARCHAR(20) NOT NULL, Dato_for VARCHAR(20) NOT NULL, Tekst_for VARCHAR(20) CREATE TABLE Utklipp ( Oppskriftsid_for VARCHAR(20) NOT NULL, Loepenr_for VARCHAR(20) NOT NULL, Dato_for VARCHAR(20) NOT NULL, Kildenavn_kilde_for VARCHAR(20), Navn_gitt_av VARCHAR(20) /******************************************************************* * SERIAL columns /******************************************************************* * Primary and Unique Key Definitions ALTER TABLE Bokoppskrift ADD PRIMARY KEY (Oppskriftsid_for ALTER TABLE Ingrediens ADD PRIMARY KEY (Oppskriftsid_med,Matvarenavn_er ALTER TABLE Meny_Drikkevare ADD PRIMARY KEY (Menyid_har_tilbehoer,Drikkevarenavn_er_tilbeh 56
ALTER TABLE Menylinje ADD PRIMARY KEY (Linjenr_for,Menyid_med ALTER TABLE Menylinje ADD UNIQUE (Oppskriftsid_er_rett_i,Menyid_med ALTER TABLE Omregning ADD PRIMARY KEY (Maaleenhet_omregning_fra,Maaleenhet_omregning_til ALTER TABLE Oppskrift ADD PRIMARY KEY (Oppskriftsid_for ALTER TABLE Person ADD PRIMARY KEY (Navn_paa ALTER TABLE Selskap ADD PRIMARY KEY (Dato_for_selskap ALTER TABLE Selskap_Person ADD PRIMARY KEY (Dato_med_gjest,Navn_er_gjest_i ALTER TABLE Tilberedningsforsoek ADD PRIMARY KEY (Oppskriftsid_i,Dato_for ALTER TABLE Utklipp ADD PRIMARY KEY (Oppskriftsid_for ALTER TABLE Utklipp ADD UNIQUE (Loepenr_for,Dato_for /******************************************************************* * Foreign Key Constraints ALTER TABLE Bokoppskrift ADD CONSTRAINT Oppskrift_Bokoppskrift FOREIGN KEY (Oppskriftsid_for) REFERENCES Oppskrift (Oppskriftsid_for ALTER TABLE Utklipp ADD CONSTRAINT Person_Utklipp FOREIGN KEY (Navn_gitt_av) REFERENCES Person (Navn_paa ALTER TABLE Ingrediens ADD CONSTRAINT Oppskrift_Ingrediens FOREIGN KEY (Oppskriftsid_med) REFERENCES Oppskrift (Oppskriftsid_for ALTER TABLE Menylinje ADD CONSTRAINT Oppskrift_Menylinje FOREIGN KEY (Oppskriftsid_er_rett_i) REFERENCES Oppskrift (Oppskriftsid_for ALTER TABLE Selskap_Person ADD CONSTRAINT Selskap_Selskap_Person FOREIGN KEY (Dato_med_gjest) REFERENCES Selskap (Dato_for_selskap ALTER TABLE Selskap_Person ADD CONSTRAINT Person_Selskap_Person FOREIGN KEY (Navn_er_gjest_i) REFERENCES Person (Navn_paa ALTER TABLE Tilberedningsforsoek ADD CONSTRAINT Oppskrift_Tilberednik FOREIGN KEY (Oppskriftsid_i) REFERENCES Oppskrift (Oppskriftsid_for 57
ALTER TABLE Utklipp ADD CONSTRAINT Oppskrift_Utklipp FOREIGN KEY (Oppskriftsid_for) REFERENCES Oppskrift (Oppskriftsid_for /****************************************************************** * Index Definitions CREATE INDEX Oppskrift_Ingrediens ON Ingrediens (Oppskriftsid_med CREATE INDEX Oppskrift_Menylinje ON Menylinje (Oppskriftsid_er_rett_i CREATE INDEX Exclud_1 ON Omregning (Maaleenhet_omregning_fra CREATE INDEX Exclud_1_A ON Omregning (Maaleenhet_omregning_til CREATE INDEX Selskap_Selskap_Person ON Selskap_Person (Dato_med_gjest CREATE INDEX Person_Selskap_Person ON Selskap_Person (Navn_er_gjest_i CREATE INDEX Oppskrift_Tilberednik ON Tilberedningsforsoek (Oppskriftsid_i CREATE INDEX Person_Utklipp ON Utklipp (Navn_gitt_av /* UNSUPPORTED CONSTRAINT: Referential Exclude "Exclud_1" */ /* UNSUPPORTED CONSTRAINT: Intratable Subset "Utklipp_Utklipp" */ /* UNSUPPORTED CONSTRAINT: Intratable Subset "Utklipp_Utklipp1" */ 58