Startup code for first assignment in Databaskonstruktion
Find a file
2026-10-21 11:05:01 +02:00
database.sql Städat koden lite lagt in nya inserts samt bytt namn på databasen 2026-10-01 10:29:13 +02:00
Databaskontruktion_a25josch.sql Städat koden lite lagt in nya inserts samt bytt namn på databasen 2026-10-01 10:29:13 +02:00
ER_diagram.png Uppdaterad version av diagrammet och mina valda entiteter 2026-09-01 17:58:50 +02:00
LICENSE Initial commit 2026-08-31 15:21:23 +00:00
README.md Fix ER bild 2026-10-21 11:05:01 +02:00

Databaskonstruktion-Assignment-1-Startup

Overview

Joseph Chamon, a25josch. Jag har blivit tilldelad grupp B, desinformatör. Desinformatören lagrar och läser incidenter och observationer, skriver rapporter och hanterar kampanjernas undanflykter.

Konceptuell databasdesign

Jag valde entiteterna (Agent, Desinformatör, Incident, Observation, Rapport, Kampanj, Undanflykter) eftersom de är de som en desinformatör arbetar med. Unamn är ett härlett attribut i uppgiften men lagras här som för- och efternamn.

ER Modell

ER or EER Model

Relations

Agent(AgentNamn, AgentNr, Lön, FörNamn, EfterNamn, Kommentar, Specialitet)

Plats(PlatsKod, PlatsNamn)

IncidentObservation(IncidentNamn, IncidentNr, ID, PlatsKod, Säkerhet, Odatum, Grad, AgentNamn, AgentNr)

Rapport(Datum, Rtitel, AgentNamn, AgentNr, IncidentNamn, IncidentNr, ID)

Kampanj(KampanjNr, SR, Sdatum, Sldatum, Kommentar)

AvslutandeKampanjer(KampanjNr, SR, Sdatum, Sldatum, Kommentar)

Typ(TypKod, TypNamn)

Undanflykter(Utitel, TypKod, Halt)

Berör(KampanjNr, IncidentNamn, IncidentNr, ID) -- M:N Kampanj-IncidentObservation Aktiva kampanjer

Berör_Avslut(KampanjNr, IncidentNamn, IncidentNr, ID) -- M:N AvslutandeKampanjer-IncidentObservation

Använder(KampanjNr, Utitel) -- M:N Kampanj-Undanflykter Aktiva kampanjer

Använder_Avslut(KampanjNr, Utitel) -- M:N AvslutandeKampanjer-Undanflykter

Logisk databasdesign

Agent och incident identifierades av två attribut vardera, så nycklarna är sammansatta. De två M:N-relationerna Kampanj-Incident och Kampanj-Undanflykter blev två nya tabeller, Berör och Använder. Desinformatör skulle ha fått en egen relation som ärver Agentsnyckel, men eftersom den bara har attributet Specialitet lade jag istället Specialitet direkt i Agent.

Fysisk databasdesign

  • Datatyper CHAR(1) för AgentNamn, TINYINT för AgentNr, INT för Lön, VARCHAR för namn och kommentar, SMALLINT för PlatsKod och TypKod, DATE för datum och DECIMAL(3,1) för undanflyktens sanningshalt.

  • Constraints Två CHECK på Lön, UNIQUE på AgentNr och NOT NULL på bland annat PlatsKod och Sdatum i KAMPANJ.

  • Denormalisering Desinformatör slogs ihop med Agent så att Specialitet lagras i AGENT, och Incident och Observation mergades ihop till INCIDENTOBSERVATION. Båda sammanslagningarna sparar en join vid läsning. Plats och typ kodifierades. Kampanj, Berör och Använder delades horisontellt i en tabell för pågående och en för avslutande kampanjer, vilket gjorde att 3 nya tabeller skapades. Henrik godkände endast en horisontell split då han ansog att den var komplex

  • Index SÄKERHETSINDEX på Säkerhet i INCIDENTOBSERVATION för snabbare filtrering av observationer. SDATUMINDEX på Sdatum i KAMPANJ för snabbare sökning på pågående kampanjer sorterat på startdatum.

  • Rättigheter Användaren DESINFORMATÖR får läsa INCIDENTOBSERVATION, eftersom en desinformatör ska kunna läsa all information om observationer, och skapa rader i RAPPORT. Rätten att läsa RAPPORT drogs tillbaka eftersom en agent bara ska läsa rapporter den själv skrivit.

Procedurer och triggers

  • MedelGrad (procedur) Visar medelvärdet av graden för alla observationer, så att en desinformatör snabbt ser hur allvarliga observationerna är i snitt. Graden ligger mellan 1 och 4.

  • Maxlön (procedur) Visar den högsta lönen bland agenterna, vilket gör det enkelt att se att ingen lön ligger över taket på 25000.

  • AgentDefaultLön (trigger) Körs före varje insert i AGENT. Anges ingen lön ska den sättas till 13000, enligt kravet att en agent utan angiven lön ska få defaultlönen.

  • KampanjAvslutas (trigger) Körs efter varje update i KAMPANJ. En pågående kampanj har slutdatum NULL och när ett slutdatum sätts kopieras kampanjen till AVSLUTANDEKAMPANJER så att avslutande kampanjer finns samlade på ett ställe.

Requirements

Kraven nedan hör till de entiteter jag valt för desinformatören

Agent

  • Identifieras unikt med namn och ett nummer
  • AgentNamn ska vara en bokstav exempelvis (S)
  • AgentNr får inte vara negativt, inte vara 0 och inte vara högre än 99
  • Agentens levnadsfilosofi lagras genom en kommentar
  • Lön ska lagras, måste ligga mellan 12000-25000. Tilldelas ingen lön ska den sättas till default vilket är 13000
  • Namnen Leif Loket Olsson, Greger Puckowitz och Greve Dracula får inte förekomma som ursprungligt namn
  • Agent lagrar Observationen
  • Agentens ursprungliga namn ska lagras genom ett härlett attribut som lagrar förnamn och efternamn

Antagande det står i uppgiften att Unamn ska vara ett härlett attribut som lagrar för och efternamn men i modellen står det att det är ett vanligt attribut så jag har strykt Unamn och lagrat för och efternamn istället Antagande det står i dokumentet att siffran 13 inte får vara agentnamn men det är antagligen skrivfel

Desinformatör

  • Har specialitet som lagras, exempelvis skicklighet på att ljuga om helikoptrar
  • Identifieras genom främmande primärnyckel genom agentens nycklar
  • Får inte arbeta med fler än 5 kampanjer samtidigt

Incident

  • Incident identfieras av både namn och nr vilket är ett antagande om sammansatt nyckel
  • Platsen incidenten skedde på lagras
  • När en desinformatör tilldelas en incident ska detta synas direkt i gränssnittet om applikationen redan körs, annars vid nästa uppstart
  • En desinformatör skall kunna se all information om en tilldelad incident och dess observationer

Observation

  • Identifieras unikt av ID
  • Attributen datum och grad lagras, grad måste vara mellan 1 och 4
  • Säkerheten lagras och uttrycks i procent, får inte vara mindre än 1% och inte högre än 114%
  • Måste tillhöra en incident
  • Desinformatören har rätt att läsa all information om observationer

Antagande En handläggare måste lagra observationen men ett designbeslut har gjorts där en agent istället lagrar observationen

Rapport

  • Identifieras unikt med Datum och Titel
  • Ärver Agent och Incidents nycklar som främmande attribut eftersom de har en 1:M med rapport på många sidan Antagande Ett antagande har gjorts där det endast finns en typ av rapport till skillnad från det som anges i dokumentet
  • Alla agenter får bara läsa rapporter de själva skrivit eller ska skriva uppföljning på
  • Desinformatörspridare har rätt att skapa nya rader i rapport tabellen
  • Vid skapande av rapport ska sidantal och ordantal kunna visas
  • Rapporter ska kunna importeras och exporteras till externa textfiler

Kampanj

  • Identifieras unikt av KampanjNr
  • Har en M:N relation mot incident och undanflykter
  • Varje kampanj lagrar en Success Rate vilket talar om ifall kampanjen lyckats eller misslyckats. Lagras som heltal och får endast anta värdena 0 eller 1
  • Startdatum måste vara tidigare än slutdatum, kampanjen måste vara minst en dag lång, om skillnaden är större än 5 veckor sätts längden automatiskt till 5 veckor.
  • Ifall en kampanj är pågående kan slutdatum ha värdet NULL
  • Kommentaren bör ha högst 80 tecken och förklarar kampanjens syfte
  • En enskild kampanj får innehålla högst 3 olika undanflykter, en enskild incident får ha högst 10 olika undanflykter totalt över sina kampanjer
  • En unik agent får inte ta bort eller modifiera fler än 4 kampanjer
  • Tas en kampanj bort tas kopplingen i Använder bort, en undanflykt tas bara bort ur databasen om den inte längre refereras av någon kampanj

Undanflykter

  • Identifieras unikt av titel
  • Undanflyktens sanningshalt lagras i procent. Får inte vara mindre än 0,1% och de med mer än 95% anses för sannolika
  • Typ talar om varifrån iden till undanflykten kommer från
  • Desinformatör ska kunna se en lista på undanflykter och mata in nya