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.

  1. Les e-posten. Skriv ned alle spørsmålene kunden vil ha svar på.
  2. 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»
  1. 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.
  2. 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.

Spør KI

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

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
  }

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.

  1. Les datamodellen. Hvilken relasjon er det mellom medlem og aktivitet? Hvordan løser tabellen besok det?
  2. Hvorfor lagrer modellen fødselsåret, og ikke alderen? Hvorfor ikke hele fødselsdatoen?
  3. Ett medlem gjør to aktiviteter samme kveld. Hvordan blir det lagret?
  4. 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?
  1. 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å.

  1. Lag tabeller.sql for datamodellen din.
  2. Legg inn noen få rader for hånd i testdata.sql: minst fire medlemmer, alle aktivitetene og ti besøk.
  3. Kopier innholdet i begge filene inn i boksen nedenfor, og kjør. Skriv SELECT * FROM besok; nederst for å sjekke at alt kom inn.
Din database

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") + ";");
  1. Les programmet. Hva gjør padStart(2, "0")? Hvorfor trengs det?
  2. Kjør programmet i en side med <script src="lag-testdata.js">, og kopier resultatet fra konsollen inn i testdata.sql. Lag også 40 medlemmer på samme måte.
  3. 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.

  1. Skriv spørringene fra planen i sporringer.sql, med en kommentar over hver. Test dem i boksen.
  2. 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) {
  ...
}
  1. Lag funksjonen tegnDiagram, slik at du kan bruke den til alle diagrammene. Bruk det du lærte i 17.2 om parametere.
  1. 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.
  2. 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.

  1. Lag en testtabell for spørringene og nettsiden. Ha minst én test for hvert spørsmål fra kunden.
  2. Gjennomfør testene, og rett feilene.
  3. Vis nettsiden til en medelev, og be henne svare på spørsmålene til kunden bare ved å se på siden. Hvor ble hun usikker?
  4. 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.

  1. Skriv README.md med hva prosjektet er, hvordan databasen lages fra SQL-filene, og hvordan nettsiden åpnes.
  2. Lag dokumentasjon.html med 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.
  3. Under Personvern skal du skrive hvilke opplysninger databasen lagrer om hvert medlem, hvorfor klubben trenger dem, og hvilke opplysninger du valgte å ikke lagre.
  4. 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.
  5. Presenter prosjektet for kunden eller klassen på fem minutter.
Spør KI

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.