Datubāzes normalizācija

**Normalizācija** ir datu organizācijas process datubāzē, kas iekļauj tabulu veidošanas procesu un attiecību veidošanu starp tiem, saskaņā ar noteikumiem, kas nodrošina datu aizsardzību un padara datubāzi elastīgāku, novēršot dublēšanos un nekonsekventu atkarību.

Datu dublēšana noved pie neproduktīvas diska brīvās vietas aizpildīšanas, un rada datubāzes uzturēšanas problēmas. Piemēram, ja datus, kuri glabājas vairākās vietās ir nepieciešams labot, tad vienas un tās pašas izmaiņas jāveic visās vietās. Klienta adreses maiņu ir daudz vieglāk īstenot, ja datubāzē šādu informāciju glabā tikai tabulā Klienti (Customers) un nekur citur.

Ir vairāki noteikumi datubāzes normalizēšanai. Katru noteikumu sauc "normālforma". Ja ir izpildīts pirmais noteikums, saka, ka datubāze ir "pirmajā normālformā." Ja ir izpildīti pirmie trīs noteikumi, tiek uzskatīts, ka datubāze ir "trešajā normālformā". Ir arī citi datubāzes normalizēšanas līmeņi, tomēr vairākām lietotnēm, lai normalizētu datubāzi, ir pietiekami normalizēt to līdz trešajai normālformai.

## Normālformas

### Pirmā normālforma (NF1)
**Definīcija 1**: Tabula (entītija) ir pirmajā normālformā (1NF), ja visi tās atribūti ir parasti mainīgie (nevis masīvi). Ja rodas nepieciešamība pēc masīvveida atribūtiem, tad tāda atribūta vietā jāveido jauna tabula un esošajā tabulā jāliek attiecīga ārējā atslēga.
**Definīcija 2**: Tabula ir 1. NF, ja katrs atribūts ir atomārs (nav salikts) un tabulas nesatur atkārtojošās grupas.

* Novērst atkārtojošās grupas atsevišķās tabulās.
* Izveidot atsevišķu tabulu katram saistīto datu komplektam.
* Identificēt katru saistīto datu komplektu ar primāro atslēgu.
Lai saglabātu līdzīgus datus, neizmantojiet vairākus laukus vienā tabulā. Piemēram, lai izsekotu precei, kas tiek iepirkta no diviem dažādiem piegādātājiem, var izveidot ierakstu ar laukiem, kuros norādīts katra piegādātāja kods. Ja ar laiku nepieciešams norādīt trešo piegādātāju, jāpievieno vēl viens lauks.
Lauka pievienošana nav vēlama, jo nepieciešamas izmaiņas gan tabulā, gan programmā, tāpēc šī metode ir slikti pielāgojama piegādātāju skaita dinamiskām izmaiņām. Ieteicams visu informāciju par piegādātājiem ievietot atsevišķā tabulā Pārdevēji (Vendors) un sasaistīt preces ar piegādātājiem, izmantojot produkta kodu, vai sasaistīt piegādātājus ar precēm, izmantojot piegādātāju kodus.

### Otra normālforma (NF2)
**Definīcija 1**: Tabula ir otrajā normālformā, ja tā ir pirmajā normālformā un tās ikviens atribūts ir atkarīgs no šīs entītes unikālā identifikatora (primārās atslēgas).
**Definīcija 2**: Tabula ir 2. NF, ja ir 1. NF un neviens atribūts nav atkarīgs tikai no primārās atslēgas daļas (pilnībā atkarīgs no primārās atslēgas).

* Izveidot atsevišķas tabulas tādām vērtību kopām, kas attiecas uz vairākiem ierakstiem.
* Sasaistīt tabulās, izmantojot ārējo atslēgu.
Ieraksti var būt atkarīgs tikai no primāras tabulas atslēgas (vai, ja nepieciešams, no saliktas atslēgas). Piemēram, klienta adrese grāmatvedības sistēmā. Šī adrese ir nepieciešama ne tikai tabulai Klienti (Customers), bet arī tabulās: Pasūtījumi (Orders), Pārvadājumi (Shipping), Rēķini (Invoices) un tml. Lai klienta adreses uzglabāšanai neveidot ierakstus katrā tabulā, to lietderīgi uzglabāt vienā vietā: tabulā Klienti (Customers), vai atsevišķā tabulā Adreses (Addresses).

### Trešā normālforma (NF3)
**Definīcija 1**: Tabula ir trešajā normālformā, ja tā ir otrajā normālformā un neviens tās neidentificējošs atribūts nav atkarīgs no cita neidentificējoša atribūta.
**Definīcija 2**: Tabula ir 3. NF, ja ir 2. NF un neviens neprimārais atribūts nav tranzitīvi atkarīgs no katras iespējamās atslēgas (neprimārie atribūti nav atkarīgi viens no otra).

* Novērst laukus, kas nav atkarīgi no atslēgas.
Vērtības, kuras iekļautas ierakstā bet nav ieraksta atslēgas daļa, nepieder tabulai. Ja lauku grupas saturs var piederēt vairāk nekā vienam ierakstam tabulā, tos ieteicams novietot atsevišķā tabulā.
Piemēram, tabula Pieņemšana darbā (Employee Recruitment), var ietvert kandidāta vārdu, adresi un universitāti, kur viņš izglītojies. Tomēr, situācijā, kad jāveic grupveida e-pastu sūtīšana, ir nepieciešams pilns universitāšu saraksts. Ja universitāšu informācija tiks saglabāta tabulā Kandidāti (Candidates), izveidot universitāšu sarakstu bez kandidātiem nebūs iespējami. Tātad, ieteicams uztaisīt atsevišķu tabulu Universitātes (Universities) un, ar universitātes koda atslēgu, sasaistīt to ar tabulu Kandidāti (Candidates).
Izņēmums. Normalizēt datubāzi līdz trešajai normālformai teorētiski ir vēlams, bet ne vienmēr tas ir lietderīgi. Piemēram, lai novērstu visas iespējamās saistības starp tabulas laukiem Klienti (Customers), būs jāveido atsevišķas tabulas, kurās uzglabāt informāciju par: pilsētām, ZIP kodiem, tirdzniecības pārstāvjiem, klientu klasēm, un jebkuru citu informāciju, kas var dublēties vairākos ierakstos. No teorētiskā viedokļa normalizēšana ir vēlama, tomēr, būtisks mazo tabulu skaita pieaugums var izraisīt programmās ātruma samazināšanos vai atmiņas trūkumu.
Veikt trešo normālformu var būt noderīga tikai tādiem datiem, kas bieži mainās. Ja atkarīgie lauki paliek, programma jāizstrādā tā, lai, pamainot kādu no laukiem, lietotājam būtu jāpārbauda visi iesaistītie lauki.

### Ceturtā normālforma (NF4)
**Definīcija**: Tabula ir 4. NF, ja ir 3. NF un katrs atribūts identificē viennozīmīgi citu atribūtu.

### Piektā normālforma (NF5)
**Definīcija**: Tabula ir 5. NF, ja ir 4. NF un, ja tabulai ir trīs vai vairākas iespējamās atslēgas, to var sadalīt atsevišķās tabulās katrai iespējamai atslēgai.