4 Andmetüübid
Kuna andmebaasis olevates tabelis peab igal tunnusel olema määratud ka tema andmetüüp, tutvumegi käesolevas peatükis peamiste PostgreSQL’is kasutusel olevate andmetüüpidega.
Arvu andmetüübid
Allolevas tabelis on välja toodud oluliseimad arvulised andmetüübid. Kõige laialdasemalt kasutatavad on neist ilmselt integer, serial, numeric ning real. Kui aga on teada, et andmebaasis võivad arvud oma mahult liiga suureks minna, tasub kasutada nende andmetüüpide ‘suuremaid’ versioone, mis mahutavad endasse 4-baidi asemel 8-baiti. Kui aga vastupidiselt on teada, et arvud varieeruvad vaid näiteks kümne piires, oleks mõistlik mälu kokkuhoiu mõttes kasutada andmetüüpe smallint ning smallserial, mis on vastavalt integeri ning seriali 2-baidised versioonid.
Üheks olukorraks, kus on alati mõistlik kasutada andmetüüpi serial, on primaarvõtmete korral. Nagu üleeelmises peatükis olnud tabelitelt näha oli, sisaldas iga tabel primaarvõtmena tunnust id, mis oli täisarv ning mille eesmärgiks oli aidata meil olemit üheselt identifitseerida. Kasutades andmetüüpi serial, pole meil uusi andmeid lisades vaja id väärtust ise välja mõelda ning täpsustada, sest serial andmetüüp valib oma väärtuseks ise esimese vaba oleva täisarvu. Sellega oleme me taganud, et iga olemi ehk kirje id väärtus on unikaalne ka siis, kui me seda ise ei täpsusta.
Millal aga kasutada andmetüüpi real ning millal andmetüüpi numeric? Kuna numeric andmetüüp hoiab endas palju täpsemaid arve kui real, siis üldjuhul on mõistlik alati andmetüübi real asemel valida numeric andmetüüp.
bigint |
8-baidine täisarv |
integer |
4-baidine täisarv |
smallint |
2-baidine täisarv |
bigserial |
automaatselt suurenev 8-baidine täisarv |
serial |
automaatselt suurenev 4-baidine täisarv |
smallserial |
automaatselt suurenev 2-baidine täisarv |
double precision |
8-baidine ujukomaarv |
real |
4-baidine ujukomaarv |
numeric |
reaalarv |
Teksti andmetüübid
Peamised teksti andmetüübid on text, varchar ning char. Kui andmetüüp text mahutab endasse ‘lõpmatu’ arvu sümboleid, siis andmetüüpidel varchar ning char tuleks anda kaasa täisarv n, mis täpsustab sümbolite jada pikkust.
Hea tava on see, et text andmetüübi asemel kasutatakse varchar andmetüüpi. Põhjus selleks on lihtne – ‘lõpmatu’ pikkusega sümbolite jada võtab mälus väga palju ruumi ning üldiselt on andmebaasis hoitavatel andmetel siiski mingi määratletav sümbolite limiit olemas (nt inimese nimi ilmselt ei ole üle 200 tähemärgi pikk). Seega alati tasub mõelda, milline võiks olla maksimaalne tähemärkide arv ning kasutadagi siis varchar andmetüüpi andmetüübi text asemel.
Millal aga kasutada andmetüüpi char? Andmetüüpi char kasutame me juhul, kui teame, et kõik tunnuse väärtused on alati täpselt sama pikkusega. Kui me aga ei saa olla kindlad, et tunnuse väärtused on alati sama pikkusega, kasutame me andmetüüpi varchar.
text | määratlemata pikkusega sümbolite jada |
varchar (n) | sümbolite jada kuni pikkusega n |
char (n) | sümbolite jada fikseeritud pikkusega n |
Veel andmetüüpe
Allolevas tabelis on väjla toodud veel mõningad kasulikud andmetüübid, mida ilmselt andmebaasi tabelite loomisel vaja läheb. Kusjuures nurksulgudes on märgitud ära vabatahtlik osa, seega nurksulgudes oleva võib välja jätta.
bit [ (n) ] | bittide jada fikseeritud pikkusega n |
varbit [ (n) ] | bittide jada kuni pikkusega n |
boolean | tõeväärtus (true/false) |
date | kuupäev kujul ‘yyyy-mm-dd’ |
time [ (p) ] | ilma ajatsoonita kellaaeg kujul ‘hh:mm:ss’, kus p on sekundite järel olevate komakohtade arv |
time [ (p) ] with time zone | ajatsooniga kellaaeg kujul ‘hh:mm:ss+hhmm’ või ‘hh:mm:ss-hhmm’, kus p on sekundite järel olevate komakohtade arv |
timestamp [ (p) ] | kuupäev ja kellaaeg ilma ajatsoonita, kus p on sekundite järel olevate komakohtade arv |
timestamp [ (p) ] with time zone | kuupäev ja kellaaeg koos ajatsooniga, kus p on sekundite järel olevate komakohtade arv |
Millal kasutada erinevaid kellaaegade ning kuupäevadega seotud andmetüüpe on ilmselt kõigile selge. Samuti peaksite tänu Pythonile olema tuttavad ka andmetüübiga boolean.
Võõrasteks andmetüüpideks on ilmselt aga bit ning varbit. Üheks näiteks, kus kasutada andmetüüpi bit, on jah/ei väärtuste korral – 1 tähistab väärtust ‘jah’ ning 0 väärtust ‘ei’. Samuti sobiks bit andmetüüpi kasutada, kui miski on lubatud/keelatud, sisselülitatud/väljalülitatud jne.
Kokkuvõte
Nagu näha, siis erinevaid andmetüüpe on üpriski palju. Valikuvõimalus on oluline seetõttu, et andmebaasi haldussüsteem annab alati teada, kui kasutaja sisestab mingile väljale valet tüüpi väärtuse. Ehk kui me kasutame iga tunnuse jaoks väga hästi läbimõeldud andmetüüpe, mis vastavad võimalikult hästi tunnuse reaalsele olemusele, on meil võimalik andmete sisestamisel tehtavaid vigu vältida, sest andmebaasi haldussüsteem teavitab meid enamik juhtudel veast. Kui me aga kasutame iga tunnuse jaoks näiteks andmetüüpi text, mis laseb meil hoida ükskõik mis pikkusega sümbolite jada, ei saa me kuidagi kontrollida, kas kasutaja sisestas täisarvulise tunnuse väärtuseks täisarvu, ujukomaarvu või sootuks midagi muud.
NB! Kui tulevikus peaks esinema vajadus kasutada mõnda muud andmebaasi haldussüsteemi kui PostgreSQL, siis tasub teada, et seal võivad andmetüübid olla veidikene erineva nimetusega. Seetõttu tasub alati konkreetse andmebaasi haldussüsteemi dokumentatsiooni uurida ning need erinevused üle vaadata. Üldjoontes peaks kõik siiski üpriski sarnane olema.