III OSA sisukord |
3.6 ANDMED JA ANDMEBAASID
Senised kokkupuuted andmetega
Juba oma kursuste algusest peale oleme andmetega tegelenud - muutujad, erinevad andmetüübid olid praktiliselt esimesed teemad. Ka selle nädala üldteema on andmetega seotud - andmestruktuuridega nimelt. Käesolevas silmaringi materjalis käsitleme andmeid andmebaaside kontekstis.
Mäletatavasti kirjutasime algul andmed programmi sisse, hiljem juba kasutasime andmete jaoks eraldi faile. Juba sellel kursusel oli näiteid reaalsete andmete kasutamisest, konkreetselt tegelesime keskmiste temperatuuridega. Käesoleva kursuse osas 2.3 saime reaalseid andmeid statistikaameti veebilehelt ja Haridussilmast. Oluline on, et seda tabelit, mille me lõpuks allalaadisime ja oma programmiga avasime, ei olnud esialgu üldse sellisel kujul olemas. See alles konstrueeriti vastavalt meie valikutele olemasolevaid andmeid kasutades. Need olemasolevad andmed peavad olema mõistlikult organiseeritud, et kiiresti ja vigadeta vajalik üles leida.
Andmete hoidmiseks ja käsitsemiseks on kasutusel andmebaasid. Andmetega täidetud andmebaasidel põhinevad infosüsteemid ja registrid, mis tänapäeval kipuvad olema väga olulisel kohal. Näiteks Riigi Infosüsteemi otsingulehelt võib infosüsteeme, registreid jmt leida sadu.
Käesolevas silmaringimaterjalis tutvumegi pisut lähemalt andmete ja andmebaasidega. Tegemist on väga mitmekesise ja huvitava valdkonnaga, millest siin vaid põgusalt saame rääkida. Alustame andmebaaside ülesehitusest, siis räägime päringukeeltest ja lõpuks mõtiskleme üldse andmete ja informatsioonist meie ümber.
Üks või mitu tabelit
Andmete organiseerimiseks on väga erinevaid viise. Üks loomulik viis on püüda neid kujutada tabelina. Seda on ajalooliseltki palju kasutatud. On ju näiteks raamatu sisukord tabel, teame korrutustabelit ja keemiliste elementide perioodilisuse tabelit.
Kui on ühesuguseid andmeid mitmete objektide kohta, siis saab neid andmeid hõlpsasti ette kujutada tabelina. Kujutame ette meie kursuse hinnete tabelit.
Eesnimi | Perenimi | Nädal1 | Nädal2 | Nädal3 | Nädal4 | Nädal5 | Nädal6 | Nädal7 | Nädal8 |
---|---|---|---|---|---|---|---|---|---|
Andres | Paas | A | A | A | A | ||||
Pearu | Murakas | A | A | A | A | ||||
Indrek | Paas | A | A |
Selle tabeli alusel saab välja panna näiteks kursuse lõpuarvestused või vaadata, millised nädalad on veel arvestamata. Teatud tasemeni on tabel juba päris sobiv andmete hoidmise viis.
Sageli on aga tahtmine käsitleda andmeid komplekssemalt. Näiteks võime ette kujutada, et õppija kohta on veel mingeid andmeid, mis konkreetse kursusega ei pruugi otseselt seotud olla. Samuti on iga nädala arvestamiseks vaja mingeid ülesandeid lahendada.
Nii saame vastava andmebaasi andmemudeli esitada näiteks järgmiselt. Peame siin silmas, et lahendamine tähendab, et konkreetse nädala kõik vajalikud arvestused on saadud.
Konkreetse asja või nähtuse esitust mudelis nimetatakse olemiks (e objektiks). Näiteks on olem konkreetne õppija, konkreetne nädal, aga ka konkreetne lahendamine. Iga olem on mingit tüüpi ja just olemitüübid on need, mida andmebaasi loomisel kirjeldatakse. Antud juhul on vajalikud olemitüübid õppija, nädal ja lahendamine.
Olemitüübis määratakse erinevad tunnused. Näiteks olemitüübi õppija puhul on tekstilist tüüpi tunnused matrikli numbri, eesnime, perenime ja isikukoodi jaoks. Iga konkreetse olemi (antud juhul siis õppija) puhul antakse tunnustele väärtused. Oluline on, et tunnuste valik oleks selline, et iga olem oleks teistest eristatav. Õppija puhul ei pruugi eristamiseks piisata ees- ja perenimest, sest võib olla sama nimega õppijaid. Ühe ülikooli piires on sobiv tunnus matrikli number, mis on unikaalne. Eesti tasemel on üldiselt sobivaks isikukood. Näiteks meie kursustel see aga ei sobi, sest osaleb ka inimesi, kellel isikukoodi ei ole. Isegi mitte mõne teise riigi oma, sest kõigil riikidel isikukoodide süsteemi polegi.
Nende tunnuste komplekti, mille abil saame ühe olemi olemitüübis (ühe kirje tabelis) unikaalselt tuvastada, nimetatakse primaarseks võtmeks. Olemitüübis Õppija on selleks matrikli_nr ja olemitüübis Nädal on primaarvõtmeks nädala_jrk. Neid võtmeid kasutatakse olemitüübis Lahendamine viitamaks nädalale ja lahendajale (õppijale).
Iga olemitüübi jaoks saame oma tabeli, kus võib olla info paljude seda tüüpi olemite kohta.
Õppija
matrikli_nr | eesnimi | perenimi | isikukood |
---|---|---|---|
A034 | Andres | Paas | 34105212737 |
A037 | Pearu | Murakas | 34206122154 |
B124 | Indrek | Paas | 37111012443 |
B043 | Andres | Paas | 36801152732 |
Nädal
nädala_jrk | temaatika | kohustuslike_arv | valik_arv | test_arv |
---|---|---|---|---|
1 | Kahemõõtmeline järjend | 1 | 0 | 2 |
2 | Kahekordne tsükkel | 4 | 2 | 1 |
3 | Andmestruktuurid | 3 | 2 | 1 |
Lahendamine
Nädal | lahendaja_matrikkel | kuupäev |
---|---|---|
1 | A034 | 07.04.2017 |
1 | A037 | 08.04.2017 |
2 | B124 | 10.04.2017 |
2 | A037 | 12.04.2017 |
Kui nüüd nendest tabelitest sobivalt pärida, siis võib näiteks saada tulemuseks tabeli, milles on ühe konkreetse osaleja (Pearu Muraka) kõik arvestatud nädalad koos nädala teemadega ja kuupäevadega.
Kahemõõtmeline järjend 08.04.2017
Kahekordne tsükkel 12.04.2017
Päringukeel
Andmebaaside loomiseks ja andmetega tegutsemiseks on spetsiaalsed andmebaaside juhtsüsteemid. Nimetame siin vaid mõnda: Oracle Database, MySQL, Microsoft SQL Server, Sybase SQL Anywhere, PostgreSQL.
Neis süsteemides kasutatakse päringukeele SQL (Structured Query Language) erinevaid dialekte. Tutvume siin mõne tavalisema käsuga.
Tabeli loomiseks saab kasutada käsku CREATE TABLE
.
CREATE TABLE õppijad (matrikli_nr text, eesnimi text, perenimi text, isikukood text)
Kirjeid saab lisada käsu INSERT
abil.
INSERT INTO õppijad VALUES ('A034','Andres','Paas')
Kui tahame andmeid näha, siis on abiks käsk SELECT
.
SELECT * FROM õppijad WHERE perenimi = 'Paas'
Tore koht, kus ise saab päringuid proovida on sqlzoo.net. Alustame seal päris algusest. Võite lahendada sealtoodud ülesande, aga võime ka proovida kogu tabelit näha
SELECT * FROM world
või kõigi Euroopa riikide pindalasid
SELECT name, area FROM world WHERE continent = 'Europe'
Tegelikult on ka Pythoniga võimalik andmebaasiga tegeleda kasutades moodulit sqlite3. Kes tahab, võib katsetada järgmisi programme.
Programm, mis teeb tabeli ja täidab seda. Tuleb märkida, et selle programmi töö ei väljasta ekraanile midagi.
import sqlite3 ühendus = sqlite3.connect('kursus.db') c = ühendus.cursor() c.execute('''CREATE TABLE õppijad (matrikli_nr text, eesnimi text, perenimi text)''') c.execute("INSERT INTO õppijad VALUES ('A034','Andres','Paas')") c.execute("INSERT INTO õppijad VALUES ('A037','Pearu','Murakas')") c.execute("INSERT INTO õppijad VALUES ('B124','Indrek','Paas')") c.execute("INSERT INTO õppijad VALUES ('B043','Andres','Paas')") ühendus.commit() ühendus.close()
Programm, mis otsib tabelist neid, kelle perenimi on Paas.
import sqlite3 ühendus = sqlite3.connect('kursus.db') c = ühendus.cursor() c.execute("SELECT * FROM õppijad WHERE perenimi = 'Paas'") print(c.fetchall()) ühendus.commit() ühendus.close()
Lõpetuseks
Oleme nüüd vaadanud andmebaasi loomise ja andmetega tegutsemise tehnilisemat poolt. Materjali lõpuosas mõtiskleme natuke üldisemalt, mida see kõik meile annab või anda võiks. Ühelt poolt on andmebaasides olevate andmete põhjal võimalik teha paremaid otsuseid. Tegelikult paljud inimesed erinevates organisatsioonides erinevate andmete analüüsiga tegelevadki. Kui palju neid analüüse otsuste tegemisel arvestatakse, on juba järgmine küsimus.
Siin saabki välja tuua, et normaalse infokasutuse olulised etapid on
- kvaliteetne andmete kogumine ja hoidmine.
- mõtlemispõhine andmeanalüüs ja otsustus.
Andmebaasidest, kus on tohutult andmeid, saab sobivate päringutega filtreerida konkreetses olukorras vajalikke andmeid. Sarnaselt peaksime filtreerima kogu seda infot, mis meile väga erinevaid kanaleid pidi pakutakse ja võib-olla isegi peale surutakse. Info hulgast valiku tegemine ei pruugi aga üldse kerge olla. Nagu ka toitumise puhul, kui laud või kaupluse letid on lookas.
III OSA sisukord |