Permalänk
Medlem

Databasdesign

Tja,
så att jag håller på med ett SCADA-system där jag just nu befinner mig på "labbnivå". Framöver när det ska tas i produktion kommer en databas-arkitekt anlitas. Hursomhelst innan vi har den personen på plats så får jag sätta upp min egen databas för att kunna fortsätta utveckla SCADA-systemet.
Mitt fall är iaf enligt följande princip.
Jag har 7 produkter som inte har några direkta likheter med varandra, tänk exempelvis golfboll, bildäck, lampa, banan etc...
Dessa produkter har jag då tänkt att de ska få en varsin tabell med olika antal attribut samt typ av värden på dessa.

Vad jag nu vill är att kunna ha kommentarer på en produkttyp med ett visst ID-nummer.
Min första tanke var att jag har en kommentarstabell för varje produkt typ
golfboll_kommentarer
Då har jag lätt att hämta kommentarer som rör golfbollar.
Nackdelen med detta som visade sig ganska snabbt är att det blir jobbigt att ha en kommentarstabell för varje produkt, i verkligheten kanske jag har 20 produkter....

Så spåret jag är inne på nu är att bara ha en tabell med alla kommentarer i som skulle kunna se ut enligt följande:

| ID | produkt_id | produkt_typ | kommentar | 1 34 Golfboll Hej hopp 2 34 Golfboll Hej hopp2 3 55 Bildäck Hej hopp igen

För att då hämta kommentarer om en viss produktindivid så bör det väl typ bli
SELECT kommentar FROM tabell_kommentarer WHERE produkt_id = ? AND produkt_typ = ?;
så skickar jag med produktid samt produkttyp.

Frågan är väl om jag är rätt ute eller brukar man göra på ett annat sätt, jag vet framöver att jag även kommer behöva hantera att koppla filer mot en specifik produkt också så det kommer bli lite samma problem där.

Tack på förhand ni databasgudar!

Visa signatur

Bara gammalt skräp...

Permalänk
Medlem

Har du ritat ett databasdiagram med relationerna mellan dina entiteter?

Kommer en produkttyp kunna ha flera kommentarer? Kommer en produkt kunna ha flera produkttyper? (etc.)

Hör kommentaren till produkten eller produkttypen? Om kommentaren hör till produkten, varför är produkttyp relevant?

Visa signatur

| MSI B650 Tomahawk | Ryzen 7 9800X3D | ASUS RTX 3070 | 64GB DDR5 6000MHz | MSI MPG A1000G | Samsung 970 Evo M.2 1TB + 2x WD Black SN850X 2TB|

Permalänk
Medlem

Bra frågor! Ska försöka göra det hela tydligare så snart jag får tid!

Visa signatur

Bara gammalt skräp...

Permalänk
Skrivet av bardbard:

Tja,
så att jag håller på med ett SCADA-system där jag just nu befinner mig på "labbnivå". Framöver när det ska tas i produktion kommer en databas-arkitekt anlitas. Hursomhelst innan vi har den personen på plats så får jag sätta upp min egen databas för att kunna fortsätta utveckla SCADA-systemet.
Mitt fall är iaf enligt följande princip.
Jag har 7 produkter som inte har några direkta likheter med varandra, tänk exempelvis golfboll, bildäck, lampa, banan etc...
Dessa produkter har jag då tänkt att de ska få en varsin tabell med olika antal attribut samt typ av värden på dessa.

Vad jag nu vill är att kunna ha kommentarer på en produkttyp med ett visst ID-nummer.
Min första tanke var att jag har en kommentarstabell för varje produkt typ
golfboll_kommentarer
Då har jag lätt att hämta kommentarer som rör golfbollar.
Nackdelen med detta som visade sig ganska snabbt är att det blir jobbigt att ha en kommentarstabell för varje produkt, i verkligheten kanske jag har 20 produkter....

Så spåret jag är inne på nu är att bara ha en tabell med alla kommentarer i som skulle kunna se ut enligt följande:

| ID | produkt_id | produkt_typ | kommentar | 1 34 Golfboll Hej hopp 2 34 Golfboll Hej hopp2 3 55 Bildäck Hej hopp igen

För att då hämta kommentarer om en viss produktindivid så bör det väl typ bli
SELECT kommentar FROM tabell_kommentarer WHERE produkt_id = ? AND produkt_typ = ?;
så skickar jag med produktid samt produkttyp.

Frågan är väl om jag är rätt ute eller brukar man göra på ett annat sätt, jag vet framöver att jag även kommer behöva hantera att koppla filer mot en specifik produkt också så det kommer bli lite samma problem där.

Tack på förhand ni databasgudar!

Tjo! Databasdesign får det att pirra till i min nave!

Det jag skulle vilja fråga först är: Vad till och hur är databasen tänkt att användas i skarpt läge/produktion? Jag har aldrig hört talats om SCADA men när jag läser om det på Wikipedia och "statistiskt frågat" Gemini så verkar det röra sig om övervakning av industriprocesser så databastabellerna verkar handla mer om övervakning/överseende över varor/produkter - via olika parametrar som kan ändras över tid för varje produkt - snarare än exempelvis försäljning av dem? Stämmer det i ditt fall?

Således, vad är det för slags data du vill regelbundet lagra om de olika produkterna över tid? Först har du ju kanske statiska / meta data om varje produkt som namn, och övriga etiketter ("tags") för dem. Sedan kanske du har data som ändras över tid i takt med varje enskild produkt i något slags produktions- och/eller utvecklingsflöde.

Möjligen kanske du vill spåra hur lufttrycket ("air pressure") förändras över tid för varje tillverkat däck för att säkerställa att lufttrycket är konsekvent? Annars kanske du har någon "tröskel" i systemet som då larmar eller gör något annat om det börjar bli så att det är för lågt lufttryck helt plötsligt i flera tillverkade däck. (Jag har som sagt ingen aning om SCADA mer än det jag läst så jag "supergissar" nu!)

Är kommentarerna till för att kommentera varje tillverkad/behandlad produkt på något vis som i sin tur kanske beror på andra parametrar för samma givna produkt?

Mvh,
WKF.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"
"Visste du förresten att det är ett mångmiljardbolag?"
"Jag lever inte för att koda utan kodar för att sen kunna leva"

Permalänk
Medlem

Nej, det är inte jobbigt att normalisera en databas.

Det jobbiga är att skriva om skitkod som bygger på en onormaliserad skitdatabas.

Om kommentaren tillhör produkttypen, lägg den i produkttyp-tabellen.

Edit: Attribut-typerna som hör till produkttypen hänger givetvis också på produkttyp-tabellen. Flera produkttyper kan ha samma attributtyp. Själva attributvärdena hänger på produkten (och på attributtypen, som till exempel kan ha en mätenhet - vilket självklart också är en egen tabell).

Edit2: jag brukar tipsa om Padrones databaskurs. Se särskilt kapitlet om normalformer och normalisering. Det är verkligen ett misstag att inte gå hela vägen till tredje normalformen om man ska hålla på med relationsdatabaser alls

Permalänk
Medlem

Ok, nu är jag tillbaka från lite äventyr och kan förhoppningsvis förtydliga lite.

Föreställ er att jag äger ett företag som säljer diverse produkter på marknaden. Jag har underleverantörer som producerar mina produkter men innan jag skickar ut dessa för försäljning så vill jag kontrollera produkterna så de håller måttet.
En sådan produkt jag säljer är bananer.
För att kolla kvalitén på dessa bananer vill jag mäta böjradien på bananen samt gulheten. Om radie eller gulhet är fel så underkänns den bananen och får kasseras.
När jag får en batch med bananer in på min kontrollfabrik så levereras dessa med ett batch-id samt ett id-nummer för varje banan, dessa nummer har alltså tillverkaren levererat och de är unika(PK).

Min tabell i databas för bananer skulle då kunna se ut såhär med ett antal bananer kontrollerade i min bananstation:

Som vi kan se har banan 3 en böjradie på 3000, det är på tok för mycket så den underkänner mätmaskinen.
Tittar vi däremot på banan 4 så har den en bra radie men gulhetsfaktorn ligger utanför specifikation, trots det så är den godkänd??
Varför, jo för operatören vid maskinen har möjlighet att "overridea" specifikationen och godkänna ändå.
Men görs detta måste operatören motivera sin avvikelsevia en kommentar som då kopplas mot just denna bananen.
Detta är dock ett slutgiltigt beslut som operatör inte får ta utan kanske en kvalitetschef måste godkänna också och motivera med en kommentar.
Kontentan är att varje unik banan måste ha möjlighet till n antal kommentarer.

Lägg därtill att utöver bananer så kontrollerar jag golfbollar, däck, stuprör och andra artiklar som inte har något gemensamt och med helt olika typer av mätningar i min fabrik.

Så funderingen är väl hur gör jag detta upplägg i databasen?
En kommentarstabell per produkttyp alternativt en kommentarstabell som täcker alla produkttyper.

Angående normalisering så är det givetvis ett krav att det sker till 3:e formen. Detta får dock den riktiga databasarkitekten lösa när den kopplas in, jag jobbar just nu mer med proof of concept så det spelar ingen roll om databasen ballar ur då jag har skript för att populera den med "labbdata".

Visa signatur

Bara gammalt skräp...

Permalänk
Skrivet av bardbard:

Ok, nu är jag tillbaka från lite äventyr och kan förhoppningsvis förtydliga lite.

Föreställ er att jag äger ett företag som säljer diverse produkter på marknaden. Jag har underleverantörer som producerar mina produkter men innan jag skickar ut dessa för försäljning så vill jag kontrollera produkterna så de håller måttet.
En sådan produkt jag säljer är bananer.
För att kolla kvalitén på dessa bananer vill jag mäta böjradien på bananen samt gulheten. Om radie eller gulhet är fel så underkänns den bananen och får kasseras.
När jag får en batch med bananer in på min kontrollfabrik så levereras dessa med ett batch-id samt ett id-nummer för varje banan, dessa nummer har alltså tillverkaren levererat och de är unika(PK).

Min tabell i databas för bananer skulle då kunna se ut såhär med ett antal bananer kontrollerade i min bananstation:<Uppladdad bildlänk>

Som vi kan se har banan 3 en böjradie på 3000, det är på tok för mycket så den underkänner mätmaskinen.
Tittar vi däremot på banan 4 så har den en bra radie men gulhetsfaktorn ligger utanför specifikation, trots det så är den godkänd??
Varför, jo för operatören vid maskinen har möjlighet att "overridea" specifikationen och godkänna ändå.
Men görs detta måste operatören motivera sin avvikelsevia en kommentar som då kopplas mot just denna bananen.
Detta är dock ett slutgiltigt beslut som operatör inte får ta utan kanske en kvalitetschef måste godkänna också och motivera med en kommentar.
Kontentan är att varje unik banan måste ha möjlighet till n antal kommentarer.

Lägg därtill att utöver bananer så kontrollerar jag golfbollar, däck, stuprör och andra artiklar som inte har något gemensamt och med helt olika typer av mätningar i min fabrik.

Så funderingen är väl hur gör jag detta upplägg i databasen?
En kommentarstabell per produkttyp alternativt en kommentarstabell som täcker alla produkttyper.

Angående normalisering så är det givetvis ett krav att det sker till 3:e formen. Detta får dock den riktiga databasarkitekten lösa när den kopplas in, jag jobbar just nu mer med proof of concept så det spelar ingen roll om databasen ballar ur då jag har skript för att populera den med "labbdata".

Eftersom det rör sig om SCADA-relaterade databaser så är det viktigt att du och/eller ni anlitar en databasarkitekt som har specialiserat sig på just SCADA-relaterade databaser då industriprocesser som förlitar sig på tröskelvärden lagrade i databaser kan få förödande socioekonomiska konsekvenser om de inte har implementerats så genomtänkt som möjligt.

Startpunkten med relationsbaserade databaser är att varje Tabell (varje "CREATE TABLE Tabellnamn();" ska "beskriva en sak". Varje rad bör också vara unik för att undvika upprepningar/motsägelser. Varje rad bör också kunna fyllas med innehåll varje gång det förs in något i tabellen för att undvika så kallade "NULL"-värden (dvs., tomma tabellceller).

Så när du då tänker på tabellkolumner så tänker du, "Vad beskriver en produkt? Namn? Antal? Batch-/serienummer?". Nu har du ju situationen att varje Produkt kan ju ha olika värden såsom dimensioner, massa/vikt och kanske andra mätbara egenskaper (t.ex. färg(er)). En sammanhängande fråga blir då: "När jag för in data om produkten, vad för jag alltid in då vid första skedet?"

Anta att du inte för in några dimensioner ännu för din Bananprodukt. Då är det inte bra att ha en tabell som heter Banan som har kolumner med dimensioner eftersom dessa inte förs in ännu och skapar då onödiga NULL-värden. Istället har du kanske en tabell som heter Bananprodukt och en annan tabell som heter Bananegenskaper där du då har fyra kolumner: Tabellrad-id, Banan-id, Bananegenskap och Bananegenskapsvärde.

Egentligen ska du inte ha Bananprodukt som tabell utan helst en Produkttabell där Banan är en av de olika produkter som finns. Sedan en tabell Produktegenskaper med samma kolumner. Produktegenskaper är också vad som kallas för "svag entitet" eller typ "varje rad här får bara existera om den kan peka/referera via referensnyckel på en rad i en annan tabell". Dvs., du kan ju inte ha dimensioner om en banan om inte en banan finns först, eller hur?

En sak jag lärt mig från något svensk YT-klipp (en svensk databaslärare, men jag tror ej det var Padron) om databaser är att tabellerna ska "Helst växa på höjden och inte bredden". Med andra ord: hellre fler tabeller och/eller fler tabellrader än fler nya kolumner. Varje ny kolumn i en tabell innebär ju att du måste fylla alla befintliga rader med den nya kolumnens data och då kan det leda till fula NULL-värden och/eller motsägelser.

När du har två tabeller, exempelvis Produkt och Produktegenskaper så kan en rad i Produktegenskaper referera till en rad i Produkt vilket - om du visualiserar dig en klassisk tabell i Excel - innebär att en rad kan i princip ha fyra celler på den raden medan en annan rad i samma Exceltabell bara har tre celler på den raden eftersom ingen referenscell från Produktegenskaper har använts. Det är så jag visualiserar tabeller med referensnycklar som pekar på en tabell med primärnyckel, särskilt när du gör JOIN-förfrågan på dem.

Ja just det, kommentarsfrågan för bananer: Då har du en tabell för Produktkommentarer där varje rad måste "peka" (referera) till en Produkt vars produkttyp kanske är "banan" (fast helst har du en tabell som heter Produkttyp så det som pekas mot är siffran för tabellrad-id i Produkttyp). Då kan du ha flera kommentarer mot samma enskilda bananprodukt.

OCH: I Produktkommentarer-tabellen så kanske du även vill "peka" på vem som kommenterade så det går att spåra/se vem som kommenterade vad då du berättade om olika som kan kommentera olika. En kommentar har ju ("beskrivs av") vanligtvis kommentaren i sig, datumet för det och oftast _vem_ som kommenterade. Personerna blir så klart också sin egen tabell. Godkännande-grejen bör vara egen tabell då det kan argumenteras att ett Godkännande eller icke-Godkännande av en produkt inte kan "beskrivas" av en tabellen Produkt. (Icke-)godkännande är ju snarare en (dynamisk) process än något statiskt som exempelvis en Produkt.

Förhoppningsvis har A4-uppsatsen ovan gett dig flera tankar att mentalt tugga igenom nu!

Mvh,
WKF.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"
"Visste du förresten att det är ett mångmiljardbolag?"
"Jag lever inte för att koda utan kodar för att sen kunna leva"

Permalänk
Medlem
Skrivet av WebbkodsFrilansaren:

Eftersom det rör sig om SCADA-relaterade databaser så är det viktigt att du och/eller ni anlitar en databasarkitekt som har specialiserat sig på just SCADA-relaterade databaser då industriprocesser som förlitar sig på tröskelvärden lagrade i databaser kan få förödande socioekonomiska konsekvenser om de inte har implementerats så genomtänkt som möjligt.

Startpunkten med relationsbaserade databaser är att varje Tabell (varje "CREATE TABLE Tabellnamn();" ska "beskriva en sak". Varje rad bör också vara unik för att undvika upprepningar/motsägelser. Varje rad bör också kunna fyllas med innehåll varje gång det förs in något i tabellen för att undvika så kallade "NULL"-värden (dvs., tomma tabellceller).

Så när du då tänker på tabellkolumner så tänker du, "Vad beskriver en produkt? Namn? Antal? Batch-/serienummer?". Nu har du ju situationen att varje Produkt kan ju ha olika värden såsom dimensioner, massa/vikt och kanske andra mätbara egenskaper (t.ex. färg(er)). En sammanhängande fråga blir då: "När jag för in data om produkten, vad för jag alltid in då vid första skedet?"

Anta att du inte för in några dimensioner ännu för din Bananprodukt. Då är det inte bra att ha en tabell som heter Banan som har kolumner med dimensioner eftersom dessa inte förs in ännu och skapar då onödiga NULL-värden. Istället har du kanske en tabell som heter Bananprodukt och en annan tabell som heter Bananegenskaper där du då har fyra kolumner: Tabellrad-id, Banan-id, Bananegenskap och Bananegenskapsvärde.

Egentligen ska du inte ha Bananprodukt som tabell utan helst en Produkttabell där Banan är en av de olika produkter som finns. Sedan en tabell Produktegenskaper med samma kolumner. Produktegenskaper är också vad som kallas för "svag entitet" eller typ "varje rad här får bara existera om den kan peka/referera via referensnyckel på en rad i en annan tabell". Dvs., du kan ju inte ha dimensioner om en banan om inte en banan finns först, eller hur?

En sak jag lärt mig från något svensk YT-klipp (en svensk databaslärare, men jag tror ej det var Padron) om databaser är att tabellerna ska "Helst växa på höjden och inte bredden". Med andra ord: hellre fler tabeller och/eller fler tabellrader än fler nya kolumner. Varje ny kolumn i en tabell innebär ju att du måste fylla alla befintliga rader med den nya kolumnens data och då kan det leda till fula NULL-värden och/eller motsägelser.

När du har två tabeller, exempelvis Produkt och Produktegenskaper så kan en rad i Produktegenskaper referera till en rad i Produkt vilket - om du visualiserar dig en klassisk tabell i Excel - innebär att en rad kan i princip ha fyra celler på den raden medan en annan rad i samma Exceltabell bara har tre celler på den raden eftersom ingen referenscell från Produktegenskaper har använts. Det är så jag visualiserar tabeller med referensnycklar som pekar på en tabell med primärnyckel, särskilt när du gör JOIN-förfrågan på dem.

Ja just det, kommentarsfrågan för bananer: Då har du en tabell för Produktkommentarer där varje rad måste "peka" (referera) till en Produkt vars produkttyp kanske är "banan" (fast helst har du en tabell som heter Produkttyp så det som pekas mot är siffran för tabellrad-id i Produkttyp). Då kan du ha flera kommentarer mot samma enskilda bananprodukt.

OCH: I Produktkommentarer-tabellen så kanske du även vill "peka" på vem som kommenterade så det går att spåra/se vem som kommenterade vad då du berättade om olika som kan kommentera olika. En kommentar har ju ("beskrivs av") vanligtvis kommentaren i sig, datumet för det och oftast _vem_ som kommenterade. Personerna blir så klart också sin egen tabell. Godkännande-grejen bör vara egen tabell då det kan argumenteras att ett Godkännande eller icke-Godkännande av en produkt inte kan "beskrivas" av en tabellen Produkt. (Icke-)godkännande är ju snarare en (dynamisk) process än något statiskt som exempelvis en Produkt.

Förhoppningsvis har A4-uppsatsen ovan gett dig flera tankar att mentalt tugga igenom nu!

Mvh,
WKF.

Bra inlägg, kul läsning!
För att poängtera så kommer en arkitekt anlitas när väl den skarpa databasen skall tas fram men som sagt nu behöver jag en databas med data för att visualisera scadat för kund med exempeldata.
Likt det du är inne på så använder jag foreign keys mot primary keys och ett gäng med JOIN-förfrågningar.

Tycker att databaser är ganska kul att syssla(designa) med även om jag aldrig gjort det professionellt så kul att få lite input från de som kan. Det är ju som vanligt att man kan lösa ett problem på flera sätt så kul att se argument för de olika sätten.

Visa signatur

Bara gammalt skräp...