items
- id* - Auto inkrementell primærnøkkel
- name – Påkrevd tekst
- img_path – Valgfri path til bilde for varen, med default value til eksisterende bilde.
- item_group – Påkrevd varegruppe. (Det finnes ingen tabell for varegrupper, så denne er hardkodet for å kunne skille på ulike type varer)
- timestamps() – feltene created_at og updated_at oppdateres automatisk.
Items-tabellen inneholder alle (rå)varer. Alle varer som registreres i systemet ligger her.
sales_items
- item_id* - Primærnøkkel og fremmednøkkel
- price – Påkrevd tall med to desimaler
Dersom en vare også skal selges, vil den ligge i sales_item-tabellen.
orders
- id* - Auto inkrementell primærnøkkel
- total – Påkreved tall med to desimaler
- timestamps() - Feltene created_at og updated_at oppdateres automatisk.
Orders holder orden på når en ordre ble opprettet og den totale sluttsummen.
order_items
- order_id* - Primærnøkkel som peker på id i orders-tabellen
- item_id* - Primærnøkkel som peker på id i items-tabellen
- quantity - Positiv heltallsverdi som holder antallet av hver vare
I order_items ligger alle varene som er knyttet til en ordre. Primærnøkkelen er sammensatt av order_id og item_id.
Denne oppgaven er utført på omlag 2 dager, noe som også setter føringer på hvordan man velger å implementere databasestrukturen. Men det er forsøkt å overholde de kravene som oppgaven stiller. Jeg diskuterer gjerne alternative strukturer for et mer skalerbart system. Jeg vil også utdype nærmere angående følgende punkter:Slette varer
Det å slette tupler fra databasen kan være problematisk. Dette gjelder også i dette eksemplet. Ettersom en ordre inneholder fremmednøkler til varer, vil man potensielt få ordrer som peker til en ikke-eksisterende vare.
Det står det skal være mulig å slette, men jeg har valgt å holde integriteten ved like. Alternativt kunne man hatt et felt (feks. active) i items-tabellen.
Dette kunne vært en boolean. Man kunne så bare vist aktive varer i POS. Dette er ikke implementert.
Validering
En ordre som sendes blir på serversiden validert på følgende måte:
- Man sjekker om item_id fins i items-tabellen.
- Man sjekker om quantity er et heltall over 0.
Dette er fordi tabellen som inneholder varene i hver ordre (order_items) kun inneholder item_id, quantity og en fremmednøkkel, order_id, som peker på ordrenummeret. Et av problemene med dette er at man i teorien kan endre f. eks pris på klient-siden (endre Vue.js-modellen) ettersom valideringen kun sjekker om items-id'en er gyldig. Jeg har derfor valgt å returnere en ny liste hvor prisene er hentet fra varetabellen.