Backend Workshop
I skal arbejde med domænet "Pokémon" og gå hele backend processen gennem:
Forstå data
Designe datamodel + ER-diagram (database design)
Implementere et relationsdatabasedesign i MySQL
Skrive SQL-queries (inkl. joins og aggregates)
Lave en Express-API applikation ovenpå databasen
Del 1 - Dataforståelse
Opgave 1 – Hvad er det her for data?
Med udgangspunkt i tabellen pokemon:
Beskriv med få linjer:
Hvad repræsenterer én række i tabellen?
Hvad er “domænet” (hvilke koncepter beskrives)?
Brug WKID-pyramiden fra What is data som reference.
Giv 2 eksempler på rå data.
Giv 2 eksempler på information.
Giv 1 eksempel på en beslutning, man kunne understøtte med Pokémon-data (f.eks i en kontekst af et spil).
Opgave 2 – Datakvalitet og constraints
Kig på kolonnerne i
pokemon(fxhp,speed,primary_type,secondary_type).Lav en lille liste over mulige datakvalitetsproblemer:
Hvilke felter kunne være
NULL, men ikke burde være det?Hvad hvis typer staves forkert?
Hvad hvis stats er negative eller urimeligt høje?
For mindst 3 felter: formuler en eller flere idéer til constraints.
Fx:
hp > 0,primary_typeskal være én af en fast liste,secondary_typemå være NULL men ikke tom tekst.
Del 2 - Datamodel og ER-diagram (Database Design)
Nu udvider vi domænet: forestil jer et lille Pokémon-spil med trænere, kampe og hold. Foreslå et sæt af entiteter, der kunne være relevante.
Opgave 3 – Identificér entiteter
Udvid domænet med minimum 3 entiteter f.eks:
PokemonTrainerBattleLocationellerGym(valgfrit)Evt.
Team/League
For hver entitet:
Vælg en primærnøgle (naturlig eller kunstig/surrogat).
Skriv 3–6 nøgleattributter (fx for
Trainer: navn, alder, hometown, badge_count).
Brug begreberne fra Cardinality and database diagrams (PK, attributter, relationer).
Opgave 4 – Cardinality og EER-diagram
Beskriv relationer mellem entiteterne, fx:
En
Trainerkan eje mangePokemonEn
Battleforegår mellem 2 (eller flere) trænere.Én
Pokemonkan deltage i mangeBattlesover tid (M–N).
Lav et ER/EER-diagram med:
Entiteter
Relationer
Cardinalities (1:1, 1:M, M:N)
Del 3 – Relationsdesign i MySQL (DDL)
I må gerne bruge chatGPT til at generere insert statements og data
Opgave 5 – Fra ER-diagram til tabeller
Opret en ny database, fx
pokemon_game.Skriv DDL (CREATE TABLE) til mindst disse tabeller:
trainerpokemon(kan være kopi/variant af den eksisterende pokemontabel, men med en PK, fxpokedex_numberellerid)trainer_pokemon(join-tabel for ejerskab)battle(kamp-info: dato, sted, vinder osv.)battle_participant(hvilke trænere deltager i hvilke kampe)
For hver tabel:
Angiv primærnøgle (
PRIMARY KEY (...)).Angiv relevante foreign keys (
FOREIGN KEY (...) REFERENCES ...).Tilføj mindst eventuelle CHECK constraints/logiske regler. behu.gitbook.io
Opgave 6 – Indsæt test-data
I må gerne bruge chatGPT til at generere insert statements og data
Indsæt minimum 10 trænere i
trainer.Indsæt minimum 40 rækker i
trainer_pokemon(hvem ejer hvilke Pokémon).Indsæt minimum 10 kampe i
battleog tilhørende rækker ibattle_participant.
Del 4 – SQL-queries og aggregater (Data literacy + joins)
Brug nu jeres egne tabeller i pokemon_game til at lave queries.
Opgave 7 – Joins
Lav mindst disse queries:
Find alle trænere med deres Pokémon-navne (JOIN mellem
trainer,trainer_pokemon,pokemon).Find alle kampe med:
dato
deltagende træner-navne
evt. vinder
Find alle Pokémon som ejes af mere end én træner (GROUP BY + HAVING).
Opgave 8 – Aggregater
Lav mindst 3 queries med aggregate-funktioner:
Gennemsnitlig
hppr.primary_type(GROUP BY).Antal Pokémon pr. træner.
Antal kampe pr. træner og sortér efter flest kampe.
(Brug fx COUNT, AVG, MIN, MAX osv., som i Data analysis – Aggregate functions.) behu.gitbook.io
Del 5 – Simpelt API Express.js
Opgave 9 – Express-skelet + DB-connection
Opret et nyt Node-projekt
Installer nødvendige pakker:
npm install express mysql2
Lav en
app.js, der:Opretter en Express-app
Opretter en MySQL-connection til
pokemon_gameHar et simpelt
GET /test, der returnerer{ status: "ok" }.
Opgave 10 – Endpoints
Implementer mindst 3 endpoints:
GET /pokemonsReturner en liste af alle pokemonners navne.
GET /trainers/teamcountReturner en liste af trænere med antallet af Pokémonner de har.
GET /battlesReturner en liste af alle kampe inkl. deltagere.
GET /trainers/:id– detaljer om én træner inkl. team.GET /stats/top-trainers– sorter trænere efter antal kampe.
Last updated