Kurs: Databashantering och design Datum: oktober 2025 GitHub: https://github.com/Campus-Molndal-CLO25/assignment-sql-81clafra
Monster Tracker är ett konsolbaserat system för att logga och analysera monsterobservationer i staden Grimville. Programmet använder en SQLite-databas i tredje normalformen (3NF) och implementerar fullständig CRUD-funktionalitet för hantering av monster, platser, jägare och observationer.
Systemet gör det möjligt för jägare att:
- Registrera nya monster och platser
- Logga observationer med detaljerade beskrivningar
Programmets huvudmeny med navigation till olika funktioner
CRUD-gränssnitt för monsterhantering
Formulär för att registrera nya monsterobservationer
- .NET 9.0 SDK eller senare
- Terminal/kommandotolk
- SQLite (ingår i
System.Data.SQLite)
-
Klona repositoryt:
git clone https://github.com/Campus-Molndal-CLO25/assignment-sql-81clafra.git cd assignment-sql-81clafra -
Återställ NuGet-paket:
dotnet restore
-
Bygg projektet:
dotnet build
dotnet runVid första körningen skapas automatiskt:
MonsterTracker.db– SQLite-databasen- Nödvändiga tabeller enligt schema
-
CRUD för Monster
- Skapa nya monster med namn, typ och farlighetsnivå
- Visa alla registrerade monster
- Uppdatera monsterinformation
- Radera monster (med hantering av FK-constraints)
-
CRUD för Location
- Registrera platser med namn och region
- Lista alla platser
- Uppdatera platsinformation
- Radera platser
-
CRUD för Hunter
- Lägg till jägare med namn och erfarenhetsnivå
- Visa alla jägare
- Uppdatera jägarinformation
- Radera jägare
-
CRUD för Observation
- Skapa observationer genom att koppla monster, plats och jägare
- Lägg till beskrivning och datum
- Visa alla observationer med komplett information
- Uppdatera observationer
- Radera observationer
-
Parametriserade SQL-queries
- Alla databasoperationer använder parametrar
- Skydd mot SQL-injektion
-
Single Responsibility Principle (SRP)
- Separata klasser för varje ansvar:
MonsterRepository,LocationRepository, etc. – dataåtkomstConsoleUI– användarinteraktionDatabaseConnection– anslutningshantering
- Separata klasser för varje ansvar:
-
Facade-mönster
MonsterTrackerFacade– förenklad ingång till systemets funktionalitet- Kapslar in komplex logik från användargränssnittet
-
Felhantering
- Validering av användarinput
- Hantering av databasfel
- Tydliga felmeddelanden
Monster (Id, Name, Type, DangerLevel) Location (Id, Name, Region) Hunter (Id, Name, ExperienceLevel) Observation (Id, MonsterId, LocationId, HunterId, Description, DateSeen)
Databasen är designad enligt tredje normalformen:
- 1NF: Alla kolumner innehåller atomära värden
- 2NF: Inga partiella beroenden (alla attribut beror på hela primärnyckeln)
- 3NF: Inga transitiva beroenden (attribut beror inte på andra icke-nyckel-attribut)
Exempel på 3NF-efterlevnad:
- Monsterinformation (Name, Type, DangerLevel) finns endast i Monster-tabellen
- Observation refererar till Monster via MonsterId (främmande nyckel)
- Detta undviker duplicering och säkerställer dataintegritet
MonsterTracker/
├── Models/
│ ├── Monster.cs # Datamodell för monster
│ ├── Location.cs # Datamodell för platser
│ ├── Hunter.cs # Datamodell för jägare
│ └── Observation.cs # Datamodell för observationer
├── Data/
│ ├── DatabaseConnection.cs # Hanterar SQLite-anslutningar
│ ├── DatabaseCreation.cs # Skapar databasfil vid start
│ ├── MonsterRepository.cs # CRUD för Monster
│ ├── LocationRepository.cs # CRUD för Location
│ ├── HunterRepository.cs # CRUD för Hunter
│ └── ObservationRepository.cs # CRUD för Observation
├── Services/
│ └── MonsterTrackerFacade.cs # Facade-mönster
├── UI/
│ └── ConsoleUI.cs # Användarinteraktion
├── Program.cs # Programinmatningspunkt
└── MonsterTracker.db # SQLite-databas (skapas vid körning)
Single Responsibility Principle (SRP):
- Varje klass har ett tydligt definierat ansvar
MonsterRepositoryhanterar endast Monster-relaterade databasoperationerConsoleUIansvarar endast för användarinteraktionDatabaseConnectionhanterar endast databasanslutningar
Facade Pattern:
MonsterTrackerFacadeger ett förenklat gränssnitt till systemet- Döljer komplexitet från
Program.csoch UI-lager - Koordinerar operationer mellan flera repositories
- Namngivning: Tydliga och beskrivande namn på klasser, metoder och variabler
- Kommentarer: Dokumentation av komplex logik och affärsregler
- Felhantering: Try-catch-block med specifik felhantering
- Parametriserade queries: Alla SQL-frågor använder säkra parametrar
- Skapa monster med olika farlighetsnivåer
- Registrera platser
- Logga observationer och verifiera relationer
- Försök radera monster som har observationer (FK-constraint test)
- Uppdatera befintliga poster
- Testa felhantering med ogiltig input
- Verifiera att alla menyer fungerar korrekt
- Alla registreringar av nya, och uppdateringar av befintliga observationer, kräver kännedom om identifikationsnummer för aktuella monster, platser och jägare. Vidare, om användaren ger ett id-nummer för uppdatering som inte finns i databasen, reagerar inte programmet. Det fortsätter istället att fråga efter nya uppgifter till posten, men uppdaterar inget i databasen, dock.
Potentiella förbättringar:
- Datumsformat kunde valideras strängare (just nu accepteras alla TEXT-värden)
- Menynavigering kunde förbättras med breadcrumbs
Genom detta projekt har jag fått djupare förståelse för databasnormalisering och varför 3NF är viktigt för att undvika dataduplicering. Implementeringen av Repository-mönstret och Facade visade tydligt värdet av separation of concerns, vilket gjorde koden lättare att testa och underhålla.
Den största utmaningen var att klura ut alla detaljer och hinna implementera allt inom tidsramen.
-
AI-verktyg:
Använde Perplexity.ai för att:
- Ta reda på hur en SQL-schema-fil kan användas för att med C# skapa en tom SQLite-databas, samt aktivera främmande nycklar i databasen.
- Bli påmind om att metoder är private som standard i C# och därmed behöver ordet "public" framför dem för att andra klasser ska komma åt dem. Vidare också att ickestatiska metoder först behöver en instans av klassen för att kunna användas.
- Få en mall över hur på ett snyggt sätt implementera en textbaserad meny-funktion.
Använde TabbyML Visual studio code-plugin tillsammans med modellen Qwen2.5-Coder-7B lokalt på datorn för att:
- Få hjälp med många kodifyllningar, se kommentarer i koden. Modellen hade även tillgång till kursens Github-repositories som data.
- C-Sharp
- Work with entity relationship table shapes in draw.io
- What is Third Normal Form (3NF)?
- SQLite C#: Connecting to SQLite databases
- Repository as static or non-static class?
- Kod från mina kurskamraters uppgifter har AI-agenten TabbyML haft tillgång till. De rader kod-kompletteringar, se kodkommentarer, som jag infogat från agenten kan därmed baseras på dessa uppgifter.
Detta projekt är skapat som en del av kursen Databashantering och design vid Campus Mölndal.
Student: Claes Fransson Email: claes.v.fransson@gmail.com GitHub: Claes1981
Skapad: oktober 2025 Senast uppdaterad: 31 oktober 2025



