erDiagram
medlem ||--o{ besok : "har"
aktivitet ||--o{ besok : "brukes i"
medlem {
INTEGER id PK
INTEGER fodselsar
TEXT skole
}
aktivitet {
INTEGER id PK
TEXT navn
TEXT rom
}
besok {
INTEGER id PK
INTEGER medlem_id FK
INTEGER aktivitet_id FK
TEXT dato
}
Prosjekt 5 Sluttprosjekt for en kunde
Bestillingen
E-post fra kunden
Hei!
Jeg leder ungdomsklubben Tårnet, som har åpent tre kvelder i uka. Vi har aktiviteter som gaming, brettspill, matlaging, musikkrommet og fotball i gymsalen. Hver kveld skriver vi opp hvem som kommer, og hva de gjør, på papir.
Hvert år må vi sende en rapport til kommunen om hvor mange som bruker klubben. Vi vil også vite hvilke aktiviteter som er populære, hvilke kvelder det kommer flest, og om vi når både de yngste og de eldste medlemmene.
Vi vil gjerne ha en database for registreringen, og en nettside som viser statistikken på en måte som er lett å forstå. Det er viktig at vi ikke lagrer mer om ungdommene enn vi trenger.
Hilsen Selma Haugen, ungdomsklubben Tårnet
I sluttprosjektet bruker du alt du har lært i boka: en database med SQL, spørringer som svarer på spørsmålene til kunden, og en nettside som viser svarene. Lagre alt i mappen tarnet-statistikk.
- Les e-posten. Skriv ned alle spørsmålene kunden vil ha svar på.
- Lag en kravliste med en tabell som den nedenfor. Finn minst fire krav til.
| Krav | Fra bestillingen | Slik sjekker jeg det |
|---|---|---|
| Databasen kan registrere hvem som kommer, og hva de gjør | «skriver vi opp hvem som kommer, og hva de gjør» | Spørringene i testtabellen |
| Nettsiden viser hvilke aktiviteter som er populære | «hvilke aktiviteter som er populære» | Et diagram med en tittel som sier hva det viser |
| Klubben lagrer minst mulig om ungdommene | «ikke lagrer mer om ungdommene enn vi trenger» |
- Hvilke opplysninger om hvert medlem trenger klubben for å svare på spørsmålene? Hvilke trenger den ikke? Bruk det du lærte i 22.4, og fyll inn den tomme ruta.
- Skriv minst tre spørsmål du vil stille kunden før du begynner.
Bruk bare oppdiktede data i prosjektet, også om du har en ekte kunde. Ekte personopplysninger skal ikke ligge i skoleprosjekter, på minnepinner eller på nettet.
Jeg skal lage en database for en ungdomsklubb. Her er bestillingen: [lim inn bestillingen]. Ikke lag datamodellen for meg. Hvilke spørsmål bør jeg stille kunden for å finne ut hvilke data databasen trenger, og hvilke den ikke bør lagre?
Datamodell og plan
Ovenfor ser du et forslag til datamodell. Klubben lagrer ikke navn, bare et medlemsnummer, fødselsåret og hvilken skole medlemmet går på. Hvert besøk er én rad, med medlem, aktivitet og dato. Navnene på medlemmene står bare på et papir i klubben.
- Les datamodellen. Hvilken relasjon er det mellom medlem og aktivitet? Hvordan løser tabellen
besokdet? - Hvorfor lagrer modellen fødselsåret, og ikke alderen? Hvorfor ikke hele fødselsdatoen?
- Ett medlem gjør to aktiviteter samme kveld. Hvordan blir det lagret?
- Lag din egen datamodell for kunden din. Tegn ER-diagrammet, og vis det til kunden eller en medelev som later som hun er kunden.
Deretter lager du en plan som kobler hvert spørsmål fra kunden til en spørring og en måte å vise svaret på.
| Spørsmål fra kunden | Spørring | Vises som |
|---|---|---|
| Hvor mange besøk har klubben hatt? | COUNT(*) fra besok |
et stort tall med en forklaring |
| Hvilke aktiviteter er populære? | GROUP BY aktivitet, sortert |
et stolpediagram |
| Hvilke kvelder kommer det flest? | GROUP BY ukedag |
|
| Når vi både de yngste og de eldste? |
- Fyll ut planen for alle spørsmålene i kravlisten.
Mappe
tarnet-statistikk
├── README.md
├── index.html
├── stil.css
├── skript.js
├── dokumentasjon.html
├── sql
│ ├── tabeller.sql
│ ├── testdata.sql
│ └── sporringer.sql
└── bilder
└── er-diagram.jpg
Bygge løsningen
tarnet-statistikk/sql/tabeller.sql
-- Tabellene til ungdomsklubben Tårnet
CREATE TABLE medlem (
id INTEGER PRIMARY KEY,
fodselsar INTEGER,
skole TEXT
);
CREATE TABLE aktivitet (
id INTEGER PRIMARY KEY,
navn TEXT NOT NULL,
rom TEXT
);
CREATE TABLE besok (
id INTEGER PRIMARY KEY,
medlem_id INTEGER REFERENCES medlem(id),
aktivitet_id INTEGER REFERENCES aktivitet(id),
dato TEXT
);Du skriver SQL-koden i tekstfiler i mappen sql, slik at du har den neste gang. Hver spørring får en kommentar som sier hvilket spørsmål den svarer på.
- Lag
tabeller.sqlfor datamodellen din. - Legg inn noen få rader for hånd i
testdata.sql: minst fire medlemmer, alle aktivitetene og ti besøk. - Kopier innholdet i begge filene inn i boksen nedenfor, og kjør. Skriv
SELECT * FROM besok;nederst for å sjekke at alt kom inn.
Boksen husker ikke databasen når du laster inn siden på nytt. Det gjør ingenting, fordi alt står i filene dine. Lim inn filene på nytt, og kjør. Vil du ha databasen som en fil, kan du bruke DB Browser for SQLite, slik som i oppgave 20.8.
For å teste statistikken trenger du mange rader. Det er tungvint å skrive for hånd. Et lite JavaScript-program med en løkke kan lage dem for deg.
tarnet-statistikk/lag-testdata.js
// Lager 300 oppdiktede besøk som INSERT-setninger
let linjer = [];
for (let i = 1; i <= 300; i++) {
let medlem = Math.floor(Math.random() * 40) + 1;
let aktivitet = Math.floor(Math.random() * 5) + 1;
let dag = Math.floor(Math.random() * 28) + 1;
let dato = `2027-03-${String(dag).padStart(2, "0")}`;
linjer.push(`(${i}, ${medlem}, ${aktivitet}, '${dato}')`);
}
console.log("INSERT INTO besok (id, medlem_id, aktivitet_id, dato) VALUES\n" + linjer.join(",\n") + ";");- Les programmet. Hva gjør
padStart(2, "0")? Hvorfor trengs det? - Kjør programmet i en side med
<script src="lag-testdata.js">, og kopier resultatet fra konsollen inn itestdata.sql. Lag også 40 medlemmer på samme måte. - Klubben har bare åpent tre kvelder i uka, men programmet lager besøk alle dager. Endre programmet slik at datoene blir mer realistiske.
Nå skal du svare på spørsmålene til kunden.
- Skriv spørringene fra planen i
sporringer.sql, med en kommentar over hver. Test dem i boksen. - Skriv ned svarene. Er det noe i svarene som overrasker deg? Er det noe som kan skyldes måten du laget testdataene på?
Til slutt lager du nettsiden. Kopier resultatet fra hver spørring inn i skript.js som en liste med objekter, slik du gjorde i 21.4.
tarnet-statistikk/skript.js
// Resultatet fra spørringen «Hvilke aktiviteter er populære?»
// i sporringer.sql, kjørt 15. mars 2027
const aktiviteter = [
{ navn: "Gaming", besok: 84 },
{ navn: "Fotball", besok: 71 },
{ navn: "Matlaging", besok: 60 }
];
// Tegner et liggende stolpediagram i elementet med id-en element
function tegnDiagram(element, data, egenskap) {
...
}- Lag funksjonen
tegnDiagram, slik at du kan bruke den til alle diagrammene. Bruk det du lærte i 17.2 om parametere.
- Lag nettsiden med en kort tekst og et diagram eller et tall for hvert spørsmål. Følg reglene for gode diagrammer i 21.5. Hvert diagram skal ha en tittel som sier hva leseren skal se, og en undertittel som sier hvilken periode tallene gjelder.
- Gi siden stil, og sjekk at den virker på mobil og med tastatur.
Teste og levere
| Test | Forventet | Resultat |
|---|---|---|
| Spørringen for antall besøk, med de ti radene du la inn for hånd | 10 | |
| Spørringen for populære aktiviteter, med de ti radene | det du har talt for hånd | |
| Et medlem uten besøk | kommer ikke med i besøkstallene, men telles som medlem | |
| Diagrammene på nettsiden | samme tall som spørringene | |
| Nettsiden på mobil og med tastatur | alt kan leses og brukes | |
| Ingen ekte personopplysninger | bare oppdiktede data |
Det er vanskelig å se om en spørring som teller 300 rader, gir riktig svar. Derfor tester du først med de få radene du la inn for hånd, der du har talt svaret selv.
- Lag en testtabell for spørringene og nettsiden. Ha minst én test for hvert spørsmål fra kunden.
- Gjennomfør testene, og rett feilene.
- Vis nettsiden til en medelev, og be henne svare på spørsmålene til kunden bare ved å se på siden. Hvor ble hun usikker?
- Lag en ZIP-fil av mappen, og lever den slik læreren sier.
Dokumentere prosjektet
Dokumentasjonen samler alt fra prosjektet. Bruk det du lærte i kapittel 23.
- Skriv
README.mdmed hva prosjektet er, hvordan databasen lages fra SQL-filene, og hvordan nettsiden åpnes. - Lag
dokumentasjon.htmlmed disse delene: kunden og bestillingen, kravlisten, datamodellen med ER-diagrammet, spørringene med svarene, diagrammene, personvern, testing, kilder og bruk av KI, og hva du ville gjort annerledes. - Under Personvern skal du skrive hvilke opplysninger databasen lagrer om hvert medlem, hvorfor klubben trenger dem, og hvilke opplysninger du valgte å ikke lagre.
- Skriv en kort rapport til kunden på under én side, med svarene på spørsmålene hennes og én anbefaling. Bruk et språk kunden forstår, uten ord som
GROUP BY. - Presenter prosjektet for kunden eller klassen på fem minutter.
Her er rapporten jeg har skrevet til kunden: [lim inn teksten]. Ikke skriv den om. Si om det er noe en kunde som ikke kan programmere, ikke vil forstå, og om anbefalingen min følger av tallene.
Oppsummering
I sluttprosjektet har du laget en database som lagrer minst mulig om personer, spørringer som svarer på kundens spørsmål og en nettside med diagrammer, og du har testet og dokumentert alt.
Arbeidsmåten
| Del | Du lager |
|---|---|
| Bestillingen | en kravliste og spørsmål til kunden |
| Datamodell og plan | et ER-diagram og en plan som kobler hvert spørsmål til en spørring og et diagram |
| Bygge løsningen | SQL-filer for tabeller, testdata og spørringer, og en nettside med diagrammer |
| Teste og levere | en testtabell, tester med små data og en brukertest |
| Dokumentere prosjektet | README.md, dokumentasjon.html og en kort rapport til kunden |
Før du leverer
- Hver spørring har en kommentar som sier hvilket spørsmål den svarer på.
- Spørringene er testet med små data, der du har talt svaret selv.
- Diagrammene viser de samme tallene som spørringene, og følger reglene i 21.5.
- Databasen lagrer bare det kunden trenger, og alle dataene er oppdiktet.
- Nettsiden virker på mobil og med tastatur.
- Dokumentasjonen har datamodell, spørringer, svar, personvern, testing og kilder.
Flere bestillinger
Læreren kan gi deg en av bestillingene nedenfor. Arbeid på samme måte som med ungdomsklubben Tårnet.
Bestilling A: Idrettslaget Ørn
E-post fra kunden
Hei!
Idrettslaget Ørn har mange lag i ulike idretter. Vi vil registrere oppmøte på hver trening, og se hvilke lag som trener mest, hvor mange som kommer på hver trening, og om noen slutter å komme.
Hilsen styret i IL Ørn
Bestilling B: Skolebiblioteket
E-post fra kunden
Hei!
Skolebiblioteket vil vite hvilke bøker som lånes mest, hvilke sjangre som er populære på hvert trinn, og hvilke bøker som aldri blir lånt, slik at vi kan bytte dem ut. Vi vil ikke lagre hva hver enkelt elev har lånt etter at boka er levert.
Hilsen skolebibliotekaren
Bestilling C: Kantina
E-post fra kunden
Hei!
Kantina kaster for mye mat. Vi vil registrere hvor mye vi lager av hver rett, og hvor mye som blir solgt, hver dag. Så vil vi se hvilke retter og hvilke dager vi kaster mest, slik at vi kan lage riktigere mengder.
Hilsen kantina
Bestilling D: Bysyklene
E-post fra kunden
Hei!
Kommunen har bysykler på tolv stasjoner. Vi vil vite hvilke stasjoner det startes og avsluttes flest turer fra, hvilke strekninger som er mest brukt, og hvordan bruken varierer gjennom døgnet og med været.
Hilsen kommunen
Undersøk hvordan du kan lagre tidspunkt i SQLite, og bruke strftime til å gruppere turene etter time og ukedag. Lag et diagram som viser hvordan bruken varierer gjennom døgnet.