Backend Workshop

I skal arbejde med domænet "Pokémon" og gå hele backend processen gennem:

  1. Forstå data

  2. Designe datamodel + ER-diagram (database design)

  3. Implementere et relations­database­design i MySQL

  4. Skrive SQL-queries (inkl. joins og aggregates)

  5. Lave en Express-API applikation ovenpå databasen

Del 1 - Dataforståelse

Opgave 1 – Hvad er det her for data?

Med udgangspunkt i tabellen pokemon:

  1. Beskriv med få linjer:

    • Hvad repræsenterer én række i tabellen?

    • Hvad er “domænet” (hvilke koncepter beskrives)?

  2. Brug WKID-pyramidenarrow-up-right 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

  1. Kig på kolonnerne i pokemon (fx hp, speed, primary_type, secondary_type).

  2. 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?

  3. For mindst 3 felter: formuler en eller flere idéer til constraintsarrow-up-right.

    • Fx: hp > 0, primary_type skal være én af en fast liste, secondary_type må 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

  1. Udvid domænet med minimum 3 entiteter f.eks:

    • Pokemon

    • Trainer

    • Battle

    • Location eller Gym (valgfrit)

    • Evt. Team / League

  2. 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).

  3. Brug begreberne fra Cardinality and database diagramsarrow-up-right (PK, attributter, relationer).

Opgave 4 – Cardinality og EER-diagram

  1. Beskriv relationer mellem entiteterne, fx:

    • En Trainer kan eje mange Pokemon

    • En Battle foregår mellem 2 (eller flere) trænere.

    • Én Pokemon kan deltage i mange Battles over tid (M–N).

  2. Lav et ER/EER-diagram med:

    • Entiteter

    • Relationer

    • Cardinalities (1:1, 1:M, M:N)

Del 3 – Relations­design i MySQL (DDL)

I må gerne bruge chatGPT til at generere insert statements og data

Opgave 5 – Fra ER-diagram til tabeller

  1. Opret en ny database, fx pokemon_game.

  2. Skriv DDL (CREATE TABLE) til mindst disse tabeller:

    • trainer

    • pokemon (kan være kopi/variant af den eksisterende pokemontabel, men med en PK, fx pokedex_number eller id)

    • trainer_pokemon (join-tabel for ejerskab)

    • battle (kamp-info: dato, sted, vinder osv.)

    • battle_participant (hvilke trænere deltager i hvilke kampe)

  3. 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.ioarrow-up-right

Opgave 6 – Indsæt test-data

I må gerne bruge chatGPT til at generere insert statements og data

  1. Indsæt minimum 10 trænere i trainer.

  2. Indsæt minimum 40 rækker i trainer_pokemon (hvem ejer hvilke Pokémon).

  3. Indsæt minimum 10 kampe i battle og tilhørende rækker i battle_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:

  1. Find alle trænere med deres Pokémon-navne (JOIN mellem trainer, trainer_pokemon, pokemon).

  2. Find alle kampe med:

    • dato

    • deltagende træner-navne

    • evt. vinder

  3. 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:

  1. Gennemsnitlig hp pr. primary_type (GROUP BY).

  2. Antal Pokémon pr. træner.

  3. 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.ioarrow-up-right

Del 5 – Simpelt API Express.js

Opgave 9 – Express-skelet + DB-connection

  1. Opret et nyt Node-projekt

  2. Installer nødvendige pakker:

    • npm install express mysql2

  3. Lav en app.js, der:

    • Opretter en Express-app

    • Opretter en MySQL-connection til pokemon_game

    • Har et simpelt GET /test, der returnerer { status: "ok" }.

Opgave 10 – Endpoints

Implementer mindst 3 endpoints:

  1. GET /pokemons

    • Returner en liste af alle pokemonners navne.

  2. GET /trainers/teamcount

    • Returner en liste af trænere med antallet af Pokémonner de har.

  3. GET /battles

    • Returner en liste af alle kampe inkl. deltagere.

  4. GET /trainers/:id – detaljer om én træner inkl. team.

  5. GET /stats/top-trainers – sorter trænere efter antal kampe.

Last updated