Normalisering, vad är det?
Förord
En annorlunda guide till normalisering av databaser.Mr D. Normal Atabase
Till att börja med måste jag tala om att jag är tekniker, inte lärarnisse. Därför kan denna artikel, som för övrigt är min första, vara något krystad och rakt på sak.
Varför ska vi ha normalisering? Är det inte bättre att vara annorlunda?
Normalisering finns i 4 steg, 1NF, 2NF, 3NF och 4NF. Vad kan då NF stå för? ska vi slå till med en vild gissning? Vad sägs om Normal Form? Jäss, helt rätt. 4NF anses något extrem och används sällan, därför tänker jag inte ta upp den. (Ingen annan gör det heller).
Regler, regler regler....
Den första normaliseringsregeln (1NF) säger att:- Det får inte finnas några dublettkolumner, dessa ska brytas ut till egna tabeller.
- Varje tabell ska ha en unik nyckel som består av en/flera kolumner.
Den andra normaliseringsregeln (2NF) säger att:
- Det ska inte finnas något data som upprepas på flera rader, dessa ska brytas ut och placeras i egna tabeller (med primärnyckel)
Den tredje normaliseringsregeln (3NF) säger att:
- En tabell ska endast innehålla data som är beroende av primärnyckeln.
Alla vill vi vara lika, eller?
Vi har ett företag där alla är likadana, alla heter samma sak, har samma lön och jobbar på samma kontor.Vi har de anställda i en tabell:
Namn | Position1 | Position2 | Avdelning | Lon | Kontor | KontorsNummer |
Sven Svensson | Programmerare | Gossegris | Utveckling | 23000 | Avesta | 0226-222 22 |
Sven Svensson | Programmerare | Gossegris | Utveckling | 23000 | Avesta | 0226-222 22 |
Sven Svensson | Programmerare | Gossegris | Utveckling | 23000 | Avesta | 0226-222 22 |
Löneförhöjning för vissa, men inte andra.
Men oj? Nu vill Farbor Albert(chefen) höja lönen för Sven Svensson #2, men hur ska han göra det? Med en updatesats ändras allas löner och då blir Farbor Albert fattig. Jo, han börjar med första regeln och lägger till en primärnyckel:AnstallningsID | Namn | Position1 | Position2 | Avdelning | Lon | Kontor | KontorsNummer |
1 | Sven Svensson | Programmerare | Gossegris | Utveckling | 23000 | Avesta | 0226-222 22 |
2 | Sven Svensson | Programmerare | Gossegris | Utveckling | 23000 | Avesta | 0226-222 22 |
3 | Sven Svensson | Programmerare | Gossegris | Utveckling | 23000 | Avesta | 0226-222 22 |
Oj. Nu kan han höja lönen, fast nu har han bestämt sig för att fortsätta normalisera databasen. Vad vare det mer som 1NF sa? Jo att det inte får finnas några duplettkolumner. Postition1 och Position2 har samma innebörd och är därför dublettkolumner. Vi skapar en ny tabell för dom samt en relationstabell, en sk junction table.
Anstallda:
AnstallningsID | Namn | Avdelning | Lon | Kontor | KontorsNummer |
1 | Sven Svensson | Utveckling | 23000 | Avesta | 0226-222 22 |
2 | Sven Svensson | Utveckling | 23000 | Avesta | 0226-222 22 |
3 | Sven Svensson | Utveckling | 23000 | Avesta | 0226-222 22 |
Position:
PositionsID | Position |
1 | Programmerare |
2 | Gossegris |
AnstallningsPosition:
PositionsID | AnstallningsID |
1 | 1 |
2 | 1 |
1 | 2 |
2 | 2 |
1 | 3 |
2 | 3 |
Verkställ! sa fänriken
Sådär. Nu höjer Farbror Albert lönen för Sven #1. Efterom Albert har bråkat med Sven #2 vill han inte att Sven #2 ska vara gossegris mer. SQL satserna som han använder ser ut så här:
UPDATE anstallda SET lon = 33000 WHERE AnstallningsID=1
DELETE FROM AnstallningsPosition WHERE positionsid=2 AND anstallningsid=2
Jag föredrar att skriva alla SQL ord med stora bokstäver och tabellinnehållet med små för att göra det lättare att läsa SQL satserna.
Vad hände?
Stackars Farbror Albert är glömsk och har glömt vad han gjort. Därför vill han lista alla anställda och vad de gör för någonting:
SELECT a.anstallningsid, namn, lon, position
FROM anstallda a, position p, anstallningsposition ap
WHERE ap.anstallningsid=a.anstallningsid
AND p.positionsid=ap.positionsid
Resultatet:
AnstallningsID | Namn | Lon | Position |
1 | Sven Svensson | 33000 | Programmerare |
1 | Sven Svensson | 33000 | Gossegris |
2 | Sven Svensson | 23000 | Programmerare |
3 | Sven Svensson | 23000 | Programmerare |
3 | Sven Svensson | 23000 | Gossegris |
Nu blev han glad igen, att vara chef kan vara jobbigt ibland. Men eftersom han är på bra humör fortsätter han med normaliseringen.
Bort med dubletter
Nästa steg är andra regeln. Den säger att det får inte finnas något data som upprepas på flera rader. Därför skapar vi en ny tabell, kontor och stoppar in kontorsnummer och namn i den, och så skapar vi en tabell för Avdelningen.Anstallda:
AnstallningsID | Namn | AvdelningsID | Lon | KontorsID |
1 | Sven Svensson | 1 | 23000 | 1 |
2 | Sven Svensson | 1 | 23000 | 1 |
3 | Sven Svensson | 1 | 23000 | 1 |
Position:
PositionsID | Position |
1 | Programmerare |
2 | Gossegris |
AnstallningsPosition:
PositionsID | AnstallningsID |
1 | 1 |
2 | 1 |
1 | 2 |
2 | 2 |
1 | 3 |
2 | 3 |
Kontor:
KontorsID | Namn | Telefonnummer |
1 | Avesta | 0226 - 222 22 |
Avdelning:
AvdelningsID | Namn |
1 | Utveckling |
0 Kommentarer