- NB! FK läheb "mitu" poolele kirja.
Kirjelda DECIMAL tüüpi
DECIMAL on kindla komakohaga kümnendarv. Selle andmetüübi kirjeldamisel tuleb öelda arvu pikkus (ilma märgi ja punktita) ja kümnendkohtade arv.
NT kui tahame panna andmebaasi arvu, mis jääb -99.99 ja 99.99 vahele, siis kirjeldame andmebaasi tabelisse veeru, mille tüüp on DECIMAL(4, 2).
Mis on INTEGER, INT, SMALLINT ja TINYINT?
INTEGER ja INT on samad- enamasti praegu 4-baidi pikkune täisarv (+/- 2 astmel 32).
SMALLINT tavaliselt 2-baidi pikkune täisarv.
TINYINT tavaliselt 1-baidi pikkune täisarv.
Mis on DATETIME ja TIMESTAMP?
Mõlemad kirjeldavad andmetüüpi, mille puhul saab samasse veergu kirjutada kuupäeva ja kellaaja. Nendel omavahel ei ole mingit vahet. Lihtsalt osa andmebaasisüsteemides kasutatakse üht, teises teist (mõnes mõlemad lubatud)
Mis on BINARY, BLOB, BITMAP?
Põhimõtteliselt LONG VARCHAR sünonüümid, kuid need on mõeldud just dokumentide salvestamiseks andmebaasi.
Mis on LONG VARCHAR ja millal seda kasutatakse?
"Lõpmatu" pikkusega teksti väli. Tegelikult on see pikkus kirjeldatud, aga see on väga suur baitide hulk.
Seda kasutatakse vabatekstiliste kommentaaride ja kirjelduste sisestamiseks andmebaasi. Sellesse välja saab kirjutada ka mistahes dokumente (DOC, XLS, HTML jms)
Mis vahe on CHAR ja VARCHAR tüübil?
CHAR on vanem andmetüüp.
Erinevus seisneb selles, kuidas neile andmebaasis mälu eraldatakse.
VARCHAR tüüpi veergudes eraldatakse andmebaasis mälu nii palju, kui mitu sümbolit konkreetsesse välja on kirjutatud.
CHAR reserveerib alati maksimaalse sümbolite hulga (nii palju, kui definitsioonis kirjas)
Kas pärast tabeli loomist saab veeru pikkust muuta?
Pikemaks saab teha, lühemaks ei saa teha.
Mis on andmebaas?
Andmebaasi all mõistetakse andmekogumit, mis lisaks andmetele sisaldab endas ka nende andmete struktuuri ehk kirjeldust (andmebaas on kogum andmeid koos neid kirjeldavade meta-andmetega). Andmete kirjeldus sisaldab tabelite kirjeldusi (kus hoitakse andmeid) ja tabelite vaheliste seoste kirjeldusi. Tänapäeval kuuluvad kirjelduste hulka ka protseduurid, nende käivitamise reeglid ja kalenderplaanid (schedulers).
Arvuti operatsioonisüsteemi mõttes on andmebaas fail või kogum faile (sõltub andmebaasisüsteemist). Kogum failidest on mitmekesisem, sest erinevad andmebaasisüsteemid jagavad andmeid failidesse erinevalt. Andmebaasi failid ei pea asuma ühes arvutis.On olemas ka seliiseid andmebaasisüsteeme, kus salvestatakse mitu erinevat andmebaasi ühte samasse faili.
Kõik andmebaasides olevad andmed talletatakse rist-tabelitena(read ja veerud) ning andmebaasi salvestatakse ka nende-vahelised seosed. Ühe kirje moodustavad ühes tabeli reas olevad andmed (ühe isiku andmed, ühe auto andmed jne)
NB! Andmebaasis peab olema vähemalt üks tabel. Seoseid teiste tabelitega ei pea olema.
Too näiteid erinevatest andmebaasisüsteemidest:
MySQL- kogum faile, mis asuvad sama ketta kataloogis (directorys). Iga tabel on eraldi fail. Lisaks on seal süsteemsed tabelid, kus hoitakse kasutajate nimesid, tabelite vaheliste seoste kirjeldusi jne. Kasutajateks saavad olla Linuxi kasutajateks registreeritud isikud (selle operatsioonisüsteemi kasutajad, maci kasutajad seda kasutada ei saa). Viimaks hoitakse kataloogis ka faile, kus hoitakse indeksite andmeid.
Unisys SQLBase- hoiab oma andmebaase ühes failis. Andmebaasi loomisel tehakse kettale tühi andmebaas, kuhu saab hakata looma tabeleid. Ei ole kindlale operatsioonisüsteemi kasutajatele, vaid igale andmebaasile luuakse oma kasutajad ja defineeritakse need igas baasis eraldi.
MS Access- hoiab oma andmebaase tingimusteta ühes failis. Kõik kasutajad on ainult ühe andmebaasi kesksed
Oracle, MS SQL Server (suured andmebaasisüsteemid)- andmebaaside loomine hakkab pihta ketastel mälu eraldamiseks. Selleks kirjutatakse ketta pinna reserveerimiseks ketastele failid, mis registreeritakse andmebaasisüsteemi mootoris kui "piirkond, kuhu saab andmebaase teha". Need "piirkonnad" võivad olla erinevatel ketastel ja ka erinevates arvutites. Andmebaasi loomisel saab ette öelda, millistesse piirkondadesse ja millises mahus andmebaas luuakse. Hiljem saab vajadusel andmebaasile uusi piirkondi juurde lisada. Kasutajad luuakse ühised üle kõigi sama andmebaasimootoriga hallatavate andmebaaside.
Mis on andmebaasi juhtimissüsteem (ABJS)?
Programm, mis oskab vastavalt andmebaasis olevale kirjeldusele tõlgendada seal olevaid andmeid.
See koosneb kahest osast:
- andmetest ja nende kirjeldustest ehk andmebaasist
- andmete käsitlemise vahenditest
ABJS poolt tagatavad tegevused:
- andmebaasi loomine ja hävitamine
- andmete struktuuride loomine ja muutmine
- andmete lisamine, kustutamine ja uuendamine (muutmine)
- andmete pärimine
- andmete säilimise haldamine
- kasutajate ja kasutajagruppide õiguste haldamine
- protseduuride käivitamine, muutmine, loomine, hävitamine
Selleks, et töödelda andmebaasis olevaid andmeid peab andmeid töötlev programm saatma ABJS-ile saatma korraldusi. Selleks peab ka programm tundma selle konkreetse ABJS-i suhtlus-liidest (kõikidel ABJS-idel erinev). On välja töötatud ka mõned standardid, mida tunnevad nii ABJS-id kui ka erinevad programmid (nt ODBC ehk open databse connectivity on Microsofti oma)
Mis on protseduur ja kuidas neid aktiveerida?
Protseduur on programm, mis on salvestatud andmebaasi.
Aktiveerimine:
- Trigeri abil- tegemist on nö konkreetse toimingu toimumist jälgiva valvuriga, mis jälgib, kui konkreetne toiming toimub, siis käivitatakse protseduur. Toimingute hulka kuuluvad tegevused andmebaasi tabeliga (andmete lisamine, kustutamine, uuendamine). Näiteks andmete lisamisel konkreetsesse tabelisse käivitatakse protseduur, mis kontrollib, kas kõik vajalikud andmed olid lisatud kirjes olemas ja kas kõik väärtused vastavad reeglitele.
- Manuaalne korraldus- keegi annab andmebaasile korralduse käivitada mingi protseduur.
- Teise protseduuri abiga- üks protseduur võib olla teise protseduuri alamprotseduur
- Kalenderplaan- mitmetes andmebaasisüsteemides on võimalik öelda mis kuupäeval ja kellaajal mingi protseduur käivitada (kui sagedalt).
Mis on andmebaasi mootor?
Tesisõnu andmebaasi server. Tegemist on keskse südamega andmebaasi ja töötlusprotseduuri vahel (andmebaasi juures asuv programm, millele antakse korraldusi, et opereerida andmebaasiga). Selleks, et andmebaasiga midagi teha, tuleb mootorile saata korraldus ja andmed. Korralduse tulemusena saadab mootor vastuse, milleks võib olla ka veateade (kui korraldus esitati vales formaadis või korraldus sisaldas selliseid tabelite/veergude nimesid, mida andmebaasis ei eksisteeri). Tulemuseks võib olla ka tühi vastus, kui sealt küsiti midagi sellist, mida pole.
Mida kujutab endast klient / teenindaja arhitektuur?
Kui töötlusprotseduur tahab andmebaasiga vahetada informatsiooni, siis valmistatakse töötlusprotseduuris ette korraldus (tavaliselt SQL-keelne) ja need andmed, mis tuleb koos korraldusega serverisse saata. Korraldus saadetakse koos andmetega andmebaasi mootorisse ehk serverisse, mis töötleb korralduse ja salvestab andmed andmebaasi või teeb nende andmete alusel päringu andmebaasi.
Sama skeemi alusel saadetakse andmebaasi ka administreerimiskäsud (kasutajate lisamine, kasutajate õiguste muutmine, tabelite lisamine, seoste kirjeldamine jne)
NÄIDE:
Andmete lisamiseks andmebaasi saadetakse serverisse INSERT käsklus koos lisatavate andmetega. Andmebaasi mootor kontrollib lause ja vea korral tagastab veakoodi. Kui kontroll on edukas, siis üritab AB mootor lisada saadetud andmed andmebaasi sellesse tabelisse, mis oli INSERT käskluses. Kui see ei õnnestu, siis tagastatakse veakood. Kui õnnestus, siis tagastatakse veakood 0.
Ajalooline arhitektuur:
Teegis olid funktsioonid, mille kättesaamiseks pidid programmi kirjutama. Selle teegi pidid panema töötlusprotseduuri külge.
Kuidas jaotatakse andmebaasid struktuuri järgi? Näited, nimetused.
Struktuuri järgi klassifitseerimisel eristatakse andmebaase seoste lubatud struktuuri järgi.
Võrkstruktuuriga andmebaas- see, mida meie joonistame (tänapäeval enamik selle struktuuriga). Olemite vahel on lubatud teha ükskõik kui palju suhteid (kui palju ülesande poolt vajalikuks osutub). Piiranguks on andmebaasi mootori poolt seatud füüsilised piirid. Olemite vahel ei ole soovitatav teha üks-mitmele seoseid edasi-tagasi (soovitus teha need ainult ühes suunas), sest neid ei saa realiseerida.
Puu-kujuline andmebaas- igal olemil saab olla ülemusi ainult üks. Temast võib alamaid minna ükskõik kui palju
Kuidas jaotatakse andmebaasisüsteemid seoste moodustamise viisi järgi? (3.6)
Navigatsioonilised andmebaasid- iga tabeli kirje koosneb kahest osast: päisest ja andmeblokist. Päises on info kirje pikkuse, staatuse ja selle kirjega seotud teiste kirjete kohta. Andmeblokis on need andmed, mille salvestamiseks on andmebaas loodud. Päis on tehniline instrument, mida kasutajale kunagi ei näidata.
Kirje päises on iga seose jaoks üks aadressiväli, millesse kirjutatakse ülemuse-kirje aadress (viide ülemusele) või seotud kirjete ahela esimese või viimase kirje aadress seose tabelis.
Siin on ülemuse päises kirjas 1.alluva ja viimase alluva aadress. Alluvatel on lisaks neile kirjas ka ülemuse aadress ja edasi-tagasi viidad (viit eelmisele ja järgmisele kirjele ehk järgmise ahela aadress ja eelmise ahela aadress). Tänu sellele saab läbida kirjete ahelat nii edas- kui ka tagurpidi.
Relatsioonilised andmebaasid- valdav osa täna kasutatavaid andmebaasisüsteeme on relatsioonilised. Kahe tabeli sidumiseks peab neil olema sama semantikaga veerg. Kui kahes tabelis asuvatel kirjetel on sama väärtus, ongi kaks tabelit omavahel seotud. Üks-mitmele seosega tabelis "üks" poolel peab tabelis olev veerg olema unikaalse väärtusega, aga mitmeses otsas võib seeda väärtust esineda mitu korda. (nt auto ja omanik on üks-mitmele seos, kus kere number on unikaalne väärtus auto pool)
Mida kujutab endast olemi-suhte diagramm ja mis on seal põhilised komponendid?
Seda kasutatakse andmemudelite koostamiseks ja kirjelduse esitamiseks. Seal on ühendatud:
- andmemudeli graafiline esitus- olemid, vaated ja nende vahelised seosed
- tabelite sisemise struktuuri kirjeldused- atribuudid, nende andmetüübid, piirangud, indeksid
- vaadete kirjeldused- kuidas vaated olemite kaudu kirjelduvad
- olemite ja vaadete vaheliste seoste kirjeldused- seoste väljade kirjeldused
- mudeli komponentide kirjeldused- olemite, atribuutide, seoste, protseduuride jm vabatekstiline kirjeldus
Põhilised komponendid:
- olemid- määratlus, mis väljendab reaalse maailma mingile objektile, nähtusele või sündmusele. Nt olem auto väljendab reaalse elu objektide kogumit autod
- olemite semantika- kirjeldab olemi olemust ja toimimist (kirjeldatakse olemi ilmingute, andmebaasi tekkimise, nende muutumise ja hävitamise reeglid).
NÄIDE: isiku semantika- kantakse tabelisse, kui ta sünnib, muudetakse tema pikkust, kaalu, vanust, aga sünnikuupäeva ei muudeta kunagi. Isikut ei kustutata tabelist kunagi, vaid tehakse tabelisse sellekohane märge.
- olemite vahelised seosed
- atribuudid (andmebaasi tabeli veerud)- olemi madalaim tase, mille kogum kirjeldab olemi struktuuri. Iga atribuudi juures tuleb kirjeldada ka selle semantika ehk kirjeldus, milliseid väärtusi atribuut võib omandada
Mis on kontseptuaalne ERD ja mis andmeloogiline?
Kontseptuaalne ERD on ERD ilma tema sisemist struktuuri täpsustamata nimetatakse ka infoloogiliseks mudeliks. Tavaliselt alguses vaadtaksegi mudelit kontseptuaalsel tasemel (nagu ka meie tegime enda esimesi töid).
Andmeloogiline ERD- koostatakse pärast kontseptuaalset modelleerimist ehk projeteeritakse olemite sisemine struktuur, mis koosneb olemi omadustest (lisatakse atribuudid)
Mis on füüsiline modelleerimine?
Selle käigus saab andmemudelist andmebaasi skeem ehk skemaatiline kirjeldus, mille alusel saab luua andmebaasi. Selle käigus lisatakse andmeloogilisele andmemudelile järgmised kirjeldused:
- olemitele tabelite nimed
- olemitele seoste võtmete kirjeldused (primaar- ja välisvõtmed)
- olemitele indeksite kirjeldused
- olemite atribuutidele veergude nimed, mille järgi luuakse andmebaasi tabelite veerud
- olemite atribuutidele andmetüübid, pikkused ja NULL, NOT NULL piirangud
Kas mitu-mitmele seos on võimalik? Kuidas?
Ei ole võimalik- andmebaasides sellist seost sellisel kujul realiseerida ei õnnestu.
Üks-mitmele seose puhul kirjutatakse seose "üks" poolel olev primaarvõti seose "mitu" poolsesse tabelisse välisvõtmena. Kui me nüüd üritame seda reeglit järgida ja teha mitu-mitmele seost, siis seda ei saa teha, sest meil ei ole primaarvõtit seose "üks" poolel, mida teisele poole kirjutada.
Mis on domeen ja atribuut?
Domeen- Veeru tüüp. Väärtuste kogum, mis kirjeldab, andmete ilmnemise võimalused (milliseid andmeid selle konkreetse domeeni järgi tekkida võib). Kasutaja defineeritud andmetüüp. Kogum elementaarseid väärtusi (atomaarseid ehk mida enam väiksemaks ei jaga). Kasutatakse selleks, et piiratakse andmeid, mida esitada võib. Kas on täisarv, kümnendarv, max pikkus, kümnendkohtade arv, formaat kuupäeva puhul.
Domeeni abil defineeritakse kõik atribuudi omadused välja arvatud atribuudi detailne semantika. Domeeni semantika on atribuudi semantika kõige üldisemal tasemel ilma atribuudi spetsiifiliste täpsustusteta, mis tavaliselt kirjeldavad atribuudi käsitlemise reegleid.
Domeeni struktuur on tavaliselt:
- andmetüüp (char, integer, jne)
- maksimaalne pikkus
- kümnendkohtade arv
- formaat
- NULL/NOT NULL
- miinimum ja maksimum väärtus
- vaikimisi väärtus
- võimalike väärtuste loend
Atribuut- Veerg. Semantiline nimetus ehk objektide nimetus, nt laud, mööbel, auto, isik, hobune, treener. Atribuut saab olla selline nagu domeeni kirjeldus lubab
Mis on relatsioon ja relatsiooni järk?
Relatsioon- tabel/olem. Vektor, mis koosneb atribuutidest. Kogum ehk omavahel kokku seotud atribuutide kogum (NB! atribuudid peavad olema järjestatud). Kui paneme domeenid ritta ja anname neile semantilised nimetused, siis saame relatsiooni
R- relatsioon
A1, A2,...-järjestatud atribuudid. Igal atribuudil on relatsioonis kindel koht ja seda ei tohi muuta
dom(A1)- domeen, mis määrab atribuudi A
Relatsiooni järk- atribuutide arv relatsioonis
NÄIDE:
NB! Relatsioon viitab nii relatsiooni ilmingule kui ka skeemile.
Mis on relatsiooni ilming (pikem seletus), relatsiooni skeem ja relatsiooni jooksev staatus (6.3)?
Relatsiooni ilming- relatsiooni kirjelduse (ehk relatsiooni skeemi) alusel loodud kogum andmeid.
Relatsiooni ilmingut relatsiooni skeemil R tähistatakse r(R) ja see on kogum vektoreid:
Iga vektor on järjestatud kogum N-väärtuseid:
kus iga väärtus
on domeeni dom(Ai) element või on tegemist tühja väärtusega. Vektoris olevad väärtused on alati järjestatud samamoodi nagu on relatsiooni skeemis järjestatud atribuudid. Atribuut määrab temaga samas positsioonis oleva väärtuse semantika ja füüsilised parameetrid (domeeni).
Relatsiooni skeem- relatsiooni kirjeldus
Relatsiooni jooksev staatus- relatsiooni (tabeli/olemi) ilming mingil konkreetsel ajahetkel. See muutub siis, kui mõni relatsiooni vektor (ehk domeeni element) muutub, lisandub või kaob.
Relatsioon = relatsiooni skeem + relatsiooni ilming
Mis on relatsiooniline andmebaas, relatsioonilise andmebaasi ilming ja andmebaasi jooksev staatus?
Relatsiooniline andmebaas- kogum relatsiooni skeeme ja terviklikkuse piiranguid, mis kirjeldavad seoseid relatsioonide vahel. Kui erinevates relatsioonides on atribuute, mille semantiline tähendus on sama, siis moodustavad nad seose kahe relatsiooni vahel- foreign key ja primary key ehk üks relatsioon viitab teisele ja viidatakse läbi atribuutide väärtuste.
Relatsiooniline andmebaas = relatsioonilise andmebaasi skeem + relatsioonilise andmebaasi ilming
Relatsioonilise andmebaasi ilming- kogum relatsiooni ilminguid ehk kogum relatsiooni skeemi alusel loodud andmeid, millest ükski ei lähe vastuollu ühegi terviklikkuse piiranguga
Andmebaasi jooksev staatus- andmebaasi ilmingu hetkeseis. Muutub siis, kui muutub mõne temasse kuuluva relatsiooni jooksev staatus.
Nimeta relatsiooni karakteristikud
- Vektorite järjestus- relatsioonis olevad vektorid EI OLE järjestatud (tegelikult on, aga see ei ole kunagi teada ja pole ka oluline). Siiski ilmuvad vektorid nende lugemisel mingis järjestuses, mis on tingitud andmebaasi füüsilisest ehitusest. Loogilisel tasandil vektorite järjestust relatsioonis ei eksisteeri.
- Väärtuste järjestus vektoris- vektoris ON väärtused järjestatud. Oluline on, et relatsiooni ilmingu ehk skeemi kõikides vektorites oleksid samatähenduslikud väärtused samas järjekorras.
- Väärtuste atomaarsus- iga vektoris olev väärtus on atomaarne ehk väärtust enam väiksemaks ei jaga. Korduvad väärtused pole lubatud.
Nimeta relatsioonilise mudeli piirangud ja mis on supervõti (6.4)?
Domeeni piirang- kõik domeeni (veeru tüübi) kaudu defineeritud atribuudid on atomaarsed ja kõik samas positsioonis asuvad vektorid on sama tüüpi (tabel, kus igas veerus on ainult samasugused andmed: eesnimi, perekonnanimi, sünniaeg, telefon jne)
Võtme piirang- iga vektor relatsioonis on selgelt eristatav- ühes relatsioonis ei saa olla vektoreid, mille kõik väärtused on samad.
Supervõti- minimaalne atribuutide kombinatsioon, mille väärtused võimaldavad vektoreid üksteisest eraldada. Praegu kasutame supervõtmena primary keyd
Mis on relatsiooni terviklikkus ja seose terviklikkus?
Relatsiooni terviklikkus- relatsiooni supervõtme ükski väärtus ei saa olla NULL, sest nende alusel eristatakse relatsiooni objekte.
Seose terviklikkus- selle piirang määratakse kahe relatsiooni vahele ja ta hoiab korras kahe relatsiooni ilmingu (skeemi alusel koostatud andmete) vektorite väärtusi EHK ühes relatsioonis olev vektor/vektorid saab viidata ainult teises relatsioonis olevale vektorile/vektoritele. Välisvõtme väljadel ei tohi esineda ühtegi väärtust, mida poleks olemas selle võtme kaudu seotud relatsiooni mõne vektori primaarvõtmes.
Mis on primaar- ja välisvõti?
Primaarvõti- ehk supervõti on minimaalne atribuutide kombinatsioon, mille väärtused võimaldavad vektoreid üksteisest eraldada. Lühim väärtuste kombinatsioon, mis on unikaalne üle kõikide vektorite selle konkreetse relatsiooni piires.
Välisvõti- viitab primaarvõtmele. Seda defineeritakse tema omaduste kaudu:
- relatsiooni mitte ükski välisvõti ei lange kunagi täielikult kokku sama relatsiooni (tabeli) primaarvõtmega (nt osakond osakonnas- on 2 osakond_ID-d, aga üks on ülemine, teine alumine osakond ehk neil on erinev semantika)
- kui relatsioon on seotud rekursiivselt iseendaga, siis langevad kõik rekursiivseid seoseid kirjeldavad välisvõtmed füüsiliste parameetrite poolest kokku sama relatsiooni primaarvõtmega (semantika ehk olemi olemuse ja toimimise kirjeldus on erinev)
- relatsiooni iga välisvõti langeb kokku mõne teise relatsiooni primaarvõtmega
- vektori välisvõtme väärtused on kas tühjad (NULL) või langevad kokku seotud relatsiooni mõne vektori primaarvõtmega
Mis tegevusi saab teha andmebaasi ilmingul?
ilming on relatsiooni kirjelduse (ehk relatsiooni skeemi) alusel loodud kogum andmeid.
Tegevused:
- vektori lisamine relatsiooni- vektori väärtused vastavad relatsiooni skeemis määratud atribuutide domeenidele. Järgida tuleb seose terviklikkuse piiranguid ehk välisvõtme väljadel ei tohi esineda ühtegi väärtust, mida poleks olemas selle võtme kaudu seotud relatsiooni mõne vektori primaarvõtmes (välisvõti oleks seotud mõne teise relatsiooni primaarvõtmega).
- vektori uuendamine- olemasolevaid vektoreid saab muuta nii, et need ei lähe vastuollu relatsiooni skeemis määratud atribuutide domeenidega. Ühtegi terviklikkuse piirangut ei tohi rikkuda. Välisvõtme väljadel ei tohi tekkida ühtegi väärtust, mida poleks olemas selle võtme kaudu seotud relatsiooni mõne vektori primaarvõtmes. Primaarvõtme väärtuse muutmine ei ole soovitatav (saab, aga ei ole soovitatav, sest kui on seos mõne välisvõtmega, siis primaarvõtme uuendamine lõhuks seosed).
- vektori kustutamine- relatsioonis olemasoleva vektori hävitamine. Tuleb jälgida, et ei kustutataks vektorit sellise primaarvõtmega, millel on seostatud vektoreid teistes relatsioonides (on välisvõtmed teiste relatsioonidega). Kui selline kustutamine on vajalik, siis tuleb eelnevalt kustutada ka kõik seotud vektorid teistest relatsioonidest.
Mis on normaliseerimine ja denormaliseerimine (mida lisatakse selle käigus-nimetused?). Anomaaliad (kirjuta taha, mis normaalkujul millised anomaaliad on)?
Normaliseerimine- andmemudeli vastavusse viimine ühele normaalkujudest
Normaalkuju- reeglite kogum, mis võimaldab hallata andmestruktuuride terviklikkust (kõik andmed, mis peavad olema, on olemas. Kõik seosed, mis peavad olema, on olemas). Normaalkujud on andmemudeli olemite (tabelite) ja nende atribuutide (veergude) organiseerimisreeglid. Loodi selleks, et vältida suuri vigu. Iga normaalkujuga käivad kaasas ka anomaaliad (midagi sellist, mida me ei taha). Anomaaliad:
- info liiasus- samad andmed mitmes eksemplaris
- mälu raiskamine- kui andmed on mitu korda salvestatud (liiasus). Nendes kirjetes, kus osade korduv-gruppide väljad jäävad tühjaks, reserveeritakse andmebaasis ilma asjata tühja mäluruumi (kettale salvestatakse tühjad korduv-grupid).
- andmete muutumine ebaadekvaatseks- käib üldjuhul liiasusega kaasas. Me ei tea lõpuks, millised andmed on õiged. Kuna samu andmeid tuleb uuendada erinevates kirjetes, siis võib tekkida olukord, kus sama objekti kohta on andmebaasi erinevates kirjetes erinevad andmed.
- andmete lisamise anomaalia- kui on vaja lisada rohkem korduvaid objekte, kui seda võimaldab korduv-gruppide arv olemis (tabelis), siis tuleb lisada uus kirje, kus jätkatakse eelmist kirjet
- andmete kustutamise anomaalia- Kui kustutatakse andmed korduv-grupist (korduv-grupi väljad tehakse tühjaks), mis ei ole dokumendis viimane, tuleb tagumisi korduv-gruppe "üles poole nihutada", et tekkida tekkinud tühimik. Tühimikud on hea eemaldada, sest muidu on kirjete töötlus oluliselt keerulisem
- Andmete uuendamise anomaalia- kuna korduv-gruppides olevate objektide andmeid korratakse väga paljudes korduv-gruppides, siis ühe konkreetses kirjes oleva korduvgrupi andmete uuendamisel võib tekkida vajadus uuendada andmeid väga paljudes kirjetes (kõikides, kus on sama objekti andmed). Sisuliselt on tegemist andmebaasiserveri protsessori aja raiskamisega
- seoste riknemine- kustutatakse midagi ära
- sunnitud lisategevuste tegemine- hea teha mudeleid nii, kui primaarvõtmed ei muutuks
Täielik normaliseerimine- viimine viiendale normaalkujule
Denormaliseerimine- protsess, mille käigus muudetakse normaliseeritud andmemudelit, et tõsta andmete kasutamise jõudlust. Seda kasutatakse kahel juhul: tarkvara jõudluse tõstmine või liigse keerukuse vähendamine. Protsessi tulemusena antakse järele normaliseerimise rangetele reeglitele, et tagada andmebaasi kiirem kasutamine.
Denormaliseerimise käigus lisatakse andmemudeli olemitele:
- liit-atribuute- väärtused, mis normaliseerimise reeglite järgi peaksid paiknema erinevates veergudes või tabelites on vahel mõistlik kokku panna ühte veergu. Näide selle kohta on aadress, mis postiteenuse näites oli jaotatud erinevatesse olemitesse: riik, asula, talu, maja, postiindeks jne, kuid tihti ei ole mõisltik nii suurt süsteemi eraldi aadressi jaoks teha, kui me tahame töötajate infosüsteemi kirjutada, kus ta elab.
- agregeeritud andmeid- koondsumma, välja arvutatud keskmine, loendusandmed(avg, max, min, countd) vms. Mõistlik, sest nende ümberarvutamine võib raisata kriitiliselt palju andmebaasiserveri protsessori aja ressurssi. Nt pangakontol saldo nägemine (koosneb laekumistest ja väljaminekutest), mida tuleb tihti arvutada. Selleks luuakse atribuut konto saldo, millele liidetakse sissetulek või väljaminek, et saada uus saldo.
- grupeerivaid atribuute- kasutatakse, et pidada järge objekti muutumise ajaloo kohta. Selleks tuleb lisada igale kirjele tema avamise ja sulgemise kuupäev. Näide on tööleping- kui seal muudetakse nt palka, siis kirjutatakse eelmisele töölepingule lõpukuupäev, tehakse vanast töölepingust koopia, muudetakse palka veerg ära ning see on uus kehtiv tööleping. Aga kui nüüd uuel muudetud töölepingul muutub lepingu number, siis kaob seos vana lepinguga ära ja selleks tuleb töölepingu olemis kasutada atribuuti grupp ID.
- tingimuslikult eksisteerivaid atribuutide gruppe- kasutatakse üks-ühele seoses, kus seotud olemi primaarvõti on ühtlasi ka välisvõti, mis seob teda põhi-olemiga. Normaliseerimise reeglid ei tunnista üks-ühele seost, sest reeglite kohaselt tuleks need olemid ühendada üheks olemiks (nt olem isik võib koondada ka kontaktandmed ja aadressi enda alla. Ei ole eraldi olemid aadress, telefon, e-mail). Tingimuslikult eksisteerivad atribuutide grupid eiravad seda reeglit. Seda kasutatakse, kui üks olem läheb liiga suureks. Näiteks olem kindlustusleping, kus on 100 000 kirjet, aga meie soovime sealt kõige tihedamini võlgnike andmeid, mida on 6000, siis me teeme iga kord päringu üle 100 000 rea, aga selle vältimiseks teeme eraldi olemi VÕLG (tekib 1:1 suhe, sest 1 leping saab võlas olla 1 kord). Kuna olemis võlg saab olemi kindlustusleping iga rea kohta olla ainult üks rida, siis ei ole meil olemile võlg eraldi IDd vaja, vaid kasutame kindlustuslepingu IDd ehk meil tekib olukord, kus primaarvõti on ka välisvõti:
Mudelile lisatakse:
- koond-olemeid- sarnaselt agregaat-summadega on vahel vaja hoida terveid andmete loendeid (põhjus sama- iga kord kui on vaja neid andmeid, siis on kulukas hakata seda uuesti üles ehitama). Hoitakse kollektsiooni andmete loenditest. Selleks luuakse andmemudelisse spetsiaalne olem.
Räägi erinevatest normaalkujudest NÄITED, domeen-võtme vs boyce-codd, neljas, viies
- Normaliseerimata kuju- andmemudeli vähemalt ühes olemis on korduvgrupid (nt on 1.kauba kood ja 2.kauba kood- tegelikult peaks olema kauba jaoks eraldi olem, mitte iga kauba jaoks eraldi atribuut). Seal on enam-vähem kõik anomaaliad olemas
- Esimene normaalkuju- kaotatakse korduvgrupid ära. Leidub olemeid, kus on transitiivne seos või jaotatud võti, aga korduvgruppe ei ole. Siin peab olema vähemalt kaks olemit (milles kummagi otsas ei tohi olla mulli ehk nulli võimalust, üks on alati).
- Liit-võti- Uue olemi primaarvõti saadakse seotud olemi (suhte "üks" poolel oleva olemi) primaarvõtme ja uues olemis kirjeldatava objekti võtme liitmise teel. Oluline on, et mõlemas tabelis oleks unikaalne primaarvõti. Objektide andmed tekivad ainult paariedna (arve ja klient, kaup ja müük)
- Transitiivne seos- kui a → b ja b → c, siis a → c (→ tähendab järeldub). Arvest järeldub klient. Primaarvõtmega on tugevalt seotud ainult arve, klient tegelikult ei ole. Olemis arve on ühest väljast koosnev primaarvõti, samas on aga andmeväljadega kirjeldatud kaks objekti (arve ja klient), millest ainult üks (arve) on tugevalt seotud primaarvõtmega. Teise objekti andmed pole aga võtmega üldse seotud.
- Jaotatud võti- osa andmetest on seotud võtmega kauba kood (kauba nimi, kauba hind, kauba ühik EHK kauba andmed), osa arve nr (kõik ülejäänud EHK müügi andmed). Tekivad tavaliselt esimesele normaalkujule ümberstruktureerimise tulemusena.
Anomaaliad: kadus ära vaid mälu raiskamise anomaalia
- Teine normaalkuju- kaotatakse jaotatud võti ära, aga transitiivne seos jääb alles. Tehakse uus olem KAUP ja tõstetakse kauba nimi, kauba hind ja kauba ühik sinna. Nüüd on uuel olemil eelmisesse olemisse suundumisel ka mull ehk on lubatud ka seos null (tähendab, et kõrvale tõstetud objekt võib eksisteerida ka iseseisvalt ehk antud näites KAUP)
Anomaaliad: alles on transitiivse seosega seotud anomaaliad ehk andmete lisamise, kustutamise, kirje uuendamise, info liiasuse ja andmete adekvaatsuse anomaalia
- Kolmas normaalkuju- kaotatakse transitiivne seos ära. Tavaliselt üle selle ei disainita. Sellel ei ole transaktsioonilisi anomaaliaid. Arve juurest viiakse kliendi andmed eraldi olemisse. Ka siin on uuest olemist KLIENT suundumisel eelmisesse olemisse mullike ehk null lubatud EHK olem KLIENT saab eksisteerida ka iseseisvalt
Anomaaliad: kõik seni kirjeldatud anomaaliad on kadunud. Küll aga esineb primaarvõtme uuendamise anomaalia (esines ka esimesel ja teisel normaalkujul). Kui uuendada mõnda primaarvõtit sellises olemis, kus ei ole päritud primaarvõti (üleval näites on päritud primaarvõti olemis MÜÜDAV_KAUP), siis iga primaarvõtme uuendamine tingib hulgaliselt uuendusi kõikides nendes kirjetes, kus antud primaarvõtme väärtust on kasutatud seostava paari tekitamiseks välisvõtmega. See tekitab andmebaasi serveri protsessori ressursi raiskamise ja andmete adekvaatsuse oht
- Domeen-võtme normaalkuju- tihti viiakse andmemudelid sellele kujule. Saame lahti primaarvõtme uuendamise anomaaliast. Asendame kõik primaarvõtmed tehniliste primaarvõtmetega (olemis MÜÜDAV KAUP ka nüüd üks primaarvõti)
Enam ei oma primaarvõtmete uuendamine mõtet, sest ID on tehniline andmeelement, mille ainuke tähendus on olla sama olemi piires unikaalne. Oluline on, et kui kirje kustutatakse, siis tema IDd ei anta uutele kirjetele, muidu tekib seose väära taastumise anomaalia (kui kustutada “üks” poolse otsa kirje, aga seose “mitu” poolel ei kustuta neid,siis uue sama IDga kirje lisamisel tekib viga).
- Boyce-Codd normaalkuju- transitiivne seos kaotatud, jaotatud võtmed alles (vastupidine II normaalkujule). Kui jaotatud võtmed ka ära kaotada, saame uuesti III normaalkjuju
Anomaaliad: peaagu samad nagu II normaalkuju puhul (siin põhjuseks jaotatud võti). Andmete lisamise, kustutamise, kirje uuendamise, info liiasuse ja andmete adekvaatsuse anomaalia
- Neljas normaalkuju- andmemudel on Boyce-Codd normaalkujul, millel on ainult ühes olemis jaotatud võti. See vähendab anomaaliate esinemist.
- Viies normaalkuju- andmemudel on IV normaalkujul ja selles puuduvad suhte projitseerumised (ühest olemist teisse saab liikuda mitut teed pidi)
Mis on teatmik-, objekt-, subjekt- ja seos-tüüpi olemite seostamise üldised seaduspärasused? NÄITED
- teatmik-tüüpi olem- kirjeldavad objekt- või seos-tüüpi olemi mingi omaduse väärtuste loendi (vahel ka teatmik-tüüpi olemi). Ehk tegemist on väärtuste loendi kirjeldajaga EHK omaduste loend. Väärtuste loend on aja jooksul muutuv. Asub alati üks-mitmele seoses "üks" poolses otsas. AGA kui on seotud teise teatmik-tüüpi olemiga, siis üks neist on "üks või mitu" poolses otsas:
Sellisel juhul on suhe jäik- igal põhi-teatmiku real peab olema vähemalt üks vaste alam-teatmikus.
Tavaliselt on olemi nimetuse lõpus -liik, -tüüp, -viis või -tase, mis näitabki, et tegemist on mingi omaduste loendiga.
Näiteks toote_liik, isikutüüp, maksmise_viis jne.
Ridu võib kustutada, kui kustutataval real ei ole seoseid teiste tabelitega. Kui on, siis tuleb kustutatavale reale märkida kasutuselt kõrvaldamise aeg.
- objekt-tüüpi olem- kirjeldavad reaalse elu objekte või nähtusi. Olemis sisalduva loendi kooslus on pidevalt muutuv. Sinna saab suubuda suhteid ainult teatmik-tüüpi olemitest ja maksimaalselt ühest subjekt- või objekt-tüüpi olemist. Tal saab ülemusi olla ainult üks, mis on kas subjekt- või objekt-tüüpi. Samas saab ta ise olla ülemuseks mitmele objekt-tüüpi olemile.
Näiteks maja, mööbel, sõiduk, toode.
Ridu võib kustutada, kui kustutataval real ei ole seoseid teistes tabelites. Kui on, siis tuleb kustutatavale reale märkida kasutuselt kõrvaldamise aeg.
Näide seosest teatmik-tüüpi olemiga:
- subjekt-tüüpi olem- kirjeldavad reaalse elu subjekte. Olemis sisalduva loendi kooslus on pidevalt muutuv. Sinna saab suubuda suhteid ainult teatmik-tüüpi olemitest. Samas võib ta ise olla ülemuseks mitmele objekt-tüüpi olemile (üks-mitmele "üks" poolses otsas), näide:
Näiteks isik, müüja, ostja, teenindaja jne.
Ridu võib kustutada, kui kustutataval real ei ole seoseid teiste tabelitega. Kui on, siis tuleb kustutatavale reale märkida kasutuselt kõrvaldamise aeg.
- seos-tüüpi olem- kirjeldavad objekt- või subjekt-tüübi olemite vahelisi seoseid (kaasa arvatud oleku muutuseid). Sinna saab suubuda suhteid kõikidest olemitest: teatmik-, subjekt-, objekt- ja ka seos-tüüpi olemitest (siis kirjeldab vaadeldav seos-tüüpi olem selle teise sisemist ajalist struktuuri). Kindlasti peab sinna suubuma vähemalt kaks suhet objekt- või subjekt-tüüpi olemitest.
Näiteks töötamine, abielus_olemine, õppimine jne.
Sinna kirjutatud ridu tavaliselt enam ei muudeta (kirjutatakse üle sulgemiskuupäevi). Andmebaasist kustutatakse ridu vaid arhiveerimise käigus.
Mis on SQL? Mis on selle funktsioonid?
Relatsioonilise andmebaasi käsitluskeel: andmekirjelduskeel ja andmetega manipuleerimise keel. Igal andmebaasisüsteemil on oma spetsiifiline SQL-keel. Need küll sisaldavad endas standardit, kuid lisaks sellele on igas keeles hulk laiendusi, mis on ainuomane just sellele konkreetsele süsteemile. Neid laiendusi ei pea kasutama ja võib kirjutada ainult standardile vastavaid keelekonstruktsioone → siis saab antud käsklust kasutada kõikides andmebaasisüsteemides.
Selle funktsioonid:
- andmestruktuuride loomine ja kirjeldamine- andmebaaside loomine ja hävitamine, tabelite kirjeldamine, tabeli kirjelduste muutmine, tabelite hävitamine, tabelite vaheliste seoste loomine ja katkestamine, protseduuride loomine, muutmine ja hävitamine
- andmete käsitlemine- andmete lisamine, uuendamine ja kustutamine tabelites
- andmete pärimine- andmete otsimine andmebaasist ja otsingu tulemuste esitamine
- andmete haldamine- koopiate tegemine, andmete taastamine koopiatest
- kasutajate õiguste haldamine- uute kasutajate loomine, kasutajatele õiguste andmine ja võtmine, kasutajate blokeerimine, kasutajate kustutamine
Mis on Cartesiuse loend?
Kui samas SELECT lauses on kirjeldatud päring mitmest tabelist, aga seose tingimus (join tingimus) on jäetud kirjeldamata, siis on päringu tulemuseks Cartesiuse loend, kus on tehtud ühe tabeli iga rea seos teise tabeli kõikide ridadega. nt tabelis ISIK on 3000 rida, tabelis AADRESS on 9000 rida, siis kui me teeme päringu ilma join tingimuseta, saame tulemuses 27 000 000 rida..
Mida tähendab arhitektuuri kihilisus?
Infosüsteemi mudeli kihiks nimetatakse ühte teisest tarkvarakomponendist suhteliselt eraldatud tarkvara komponentide kogumit, millel on funktsionaalselt määratletud tähendus ja mis vahetab teiste analoogiliste komponentidega ehk kihtidega informatsiooni läbi standardiseeritud liidese.
Kirjelda erinevaid mudeleid (Joonised, lukustamine 1-kihiline).
Ühe-kihiline mudel- (sissejuhatav tekst- olid andmebaasid ja andmebaasikäsitlusprogramm, mis alguses asusid samas arvutis. Hiljem need lahutati- andmebaasid kolisid fail-serverisse ja töötlusprogrammid jäid tööjaamadesse- sellest midagi paremaks ei muutunud, lihtsalt füüsiline arhitektuur muutus, loogiline arhitektuur jäi samaks.)
Seal on üks tarkvaraline komponent (üks programm). Seega pole ka mingeid liideseid, mille kaudu teiste komponentidega informatsiooni vahetada. Igal andmebaasisüsteemil olid standardfunktsioonide teegid (andmete baasi kirjutamiseks, lugemiseks). Iga andmebaasi käsitlemise programm oli kogum kasutajaliidese ja arvutusprotseduuride jaoks spetsiaalselt kirjutatud programmi ja andmebaasisüsteemi funktsioonide teegi kogum
Andmebaas paiknes töötlus-programmiga ühes arvutis ja alguses sai seda kasutada üks kasutaja. Kui tekkis multi-tasking ja ajajaotus-süsteemid, siis said kasutada mitu kasutajat (ühes arvutis) AGA sellega tekkisid probleemid, sest keegi lisas midagi, keegi kustutas, keegi kirjutas üle jne. Probleemi lahendamiseks hakati andmeid lukustama, selleks kirjutati lukk kirje päisesse ja kui seda enam vaja polnud, siis kirjutati see tühja lukuga üle. Lukus oli kirjas protsess, mis selle lukku pani ja see sama protsess sai luku maha võtta. AGA seal oli üks probleem- kui protsess juhtus ära surema, siis ei saanudki neid lukke maha võtta ja see takistas teiste kasutajate tööd. Küll aga oli selle jaoks lahendus- olid spetsiaalsed programmid, mis käisid mingi konkreetse aja tagant ja otsisid neid surnud protsesse ja hävitati lukud.
Kahe-kihiline mudel- klient-serveri mudel. Kaheks kihiks on andmebaasi serveris asuv andmebaasi mootor ja kliendi arvutis olev rakendus, mis suhtlevad liidese kaudu (võivad, aga ei pea olema ühes arvutis). Andmebaasi käsitleva rakenduse ja andmebaasi vahel on programm (mida nimetatakse andmebaasi mootoriks), mis täidab rakenduse korraldusi ja vahendab rakendusele andmeid. Andmebaasi poole pöörduvaid rakendusi võib olla kuitahes palju (piiri seab serveri riistvara konfiguratsioon- protsessori kiirus, mälu maht, ketaste maht, ketaste kiirus jne). Andmebaasi mootor haldab tavaliselt korraga mitut andmebaasi.
Iga andmeside protsess algatatakse kliendi arvutis. Kui seal töötaval rakendusel on vaja mingit toimingut andmebaasi teha (kirjutada, lugeda), siis ta saadab korralduse andmebaasi mootorile, mis omakorda täidab korralduse ja salvestab andmed andmebaasi või teeb nende andmete alusel päringu andmebaasi.
Enam pole vaja lukke andmebaasi salvestada, sest andmebaasi mootor haldab kõiki lukke oma sisemiste meetoditega. Andmebaas jälgib, millises seisus on temaga ühendust võtnud rakendused ja vajaduse korral (kui rakendus ei tööta)hävitab kõik seotud lukud.
Andmebaasimootor koosneb kahest osast: see, mis teeb seda, mida paluti (TÄITUR) ja see osa, mis seostab tegevust sellega, kes seda palus ehk LIIDES. Klient ja server peavad tundma liidest samamoodi, et selle andmebaasi poole saaks pöörduda. Liidese ülesanne on vahendada liiklust. Oluline on, et andmebaasi mootoriga suhtlev rakendus tunneb ka seda liidest, mille kaudu andmebaasi mootorile korraldusi saata ja andmeid vastu võtta. Igal andmebaasisüsteemil on enda spetsiifiline liides (native link) ja andmebaasi poole pöördumiseks peab rakenduse koosseisus olema just see draiver, mille andmebaasi poole pöörduda soovitakse.
Kolme-kihiline mudel- kasutajaliides on viidud rakendusest eemale (rakendusest välja). Rakendus ise töötab andmebaasi mootoriga samamoodi nagu kahe-kihilises mudelis. Meil on kolm komponenti: andmebaasi mootor (tegeleb vahetu andmebaasi käsitlemisega), rakendus (juhib protsessi) ja kasutajaliides (selle kaudu suhtleb kasutaja rakendusega).
Rakendus pannakse tavaliselt tööle selleks loodud eraldi keskkonnas- aplikatsiooni serveris. Kasutaja peab pöörduma mingil URLil, kus registreerumisel käivitatakse aplikatsiooni serveris (rakenduses) tema jaoks protsess, mille kasutajaliides saadetakse tema sirvijasse. Kui kasutaja teeb läbi kasutajaliidese rakendusega tegevusi, siis rakendus vahetab kõik vajalikud andmed ja korraldused andmebaasi mootoriga.
Andmebaasi serveri ja rakenduse vahel toimub korralduste ja andmete liigutamine läbi mõne native linki. Rakenduse ja kasutajaliidese vaheliseks liideseks on kas HTTP, HTTPS, XML, SOAP või mõni muu standardiseeritud liides.
N-kihiline mudel- kihte võib olla rohkem kui 3, mis lisanduvad alati aplikatsiooni serveri ja kliendi vahele (muidu lõhuksime klient-serveri mudel ära). Nt on vahel veel koormuse jagur (vaatab, et aplikatsiooni serverid oleksid ühtlaselt koormatud, et tagada klientide parim teenindamine) või logistika server (teostab süsteemi sisemist logistikat ja aitab valida selle aplikatsiooni serveri, millel on see rakendus, mida klient vajab ehk ta on vahendaja, mis leiab kliendile õige rakenduse).
Komponent mudel (0-kihiline)- ei ole kihte. Kõik serverid paiknevad samal tasemel ja suhtlevad üksteisega läbi logistika serveri. Klient asub ka serveritega samal tasemel:
Tegelikult kõik serverid ühel tasemel, joonisel logistika server üleval lihtsalt ülevaatlikuse pärast. Selline arhitektuur sobib hästi väga keeruka ja dünaamilist laiendamist nõudva insosüsteemi loomiseks.
Nimeta etapid SQL-korralduse ettevalmistamisel täitmiseks (nimetused)
- Leksiline analüüs- esimene samm päringu käivitamisel, kus kontrollitakse, kas need sõnad, mis ma kirja panin, võivad olla keelekonstruktsiooni osad. Kui leitakse mingi kummaline fraas, mis ei ole keele komponent, siis katkestatakse leksiline analüüs veaga.
- Grammatiline analüüs- Vaadatakse, kas sõnad on loogiliselt järjekorras. Kas alguses on võtmesõna (SELECT, INSERT, DELETE jne), kas iga avaldis vastab andmebaasi välja kujule, kas sulgude arv on õige, kas funktsioonide nimed klapivad, kas FROM on olemas, kas sellele järgnevad tabelite nimed jne
- Kontroll- kas andmebaasis on olemas need asjad, mis on lauses kirjas (protseduuri nimed, funktsiooni nimed, tabelid). Kui neid nimesid ei ole, siis tagastatakse sellekohane veateade. Kui mul ei ole päritud asja jaoks õigusi, siis mulle öeldakse, et seda asja pole olemas
- Optimeerimine- siin määratakse ära, millises järjekorras päringuid baasi tehakse, milliseid indekseid kasutatakse, milliseid piiranguid ja millises järjekorras rakendatakse. Etapi tulemuseks on SQL-lause algoritm. Võtab kõik tabelid ja tingimused ette ning koostab puu- päri esmalt sellest tabelist see, siis tee see ära jne. Arvutab, mitu rida mingi päringu puhul andmebaasist tuleb ja valib sellise tee, kus ridade arv on väikseim (INSERT puhul seda pole vaja teha). SELECTide optimiseerimise puud võivad olla väga keerulised
- Kompileerimine- võtab algoritmi ette ja kirjutab valmis programmi (andmebaasi mootorile arusaadav vahekood), kompileerib selle objekt koodi
Kuidas optimeerida andmebaasi käsitlust?
- Saata andmebaasi serveri poole ainult korrektseid korraldusi- vigaste korralduste analüüsimine raiskab serveri aega
- Saata andmebaasi serveri poole ainult vajalikke korraldusi- "igaks juhuks" saadetud korraldused raiskavad aega
- Saata andmebaasi serveri poole ainult optimaalseid korraldusi
Mis on transaktsioonikäsklused?
Transaktsioon- kahe COMMITi vahele jääv korralduste jada või COMMITi ja ROLLBACKi vahele jääv korralduste jada. Teisisõnu on transaktsioon väikseim terviklik ja seotud muudatus-korralduste jada.
ROLLBACK- võtab muudatused tagasi
COMMIT- kinnitab muudatused. Kui see käsklus on antud, siis enam ROLLBACKi kasutada ei saa.
SAVEPOINT- niiöelda teetähised (nt saad rollbackida mingi kindla teetähiseni)
Kuidas jaotatakse ressurssi?
- Vastavalt vajadusele- nt haigetele ravimid
- Vastavalt sihtrühmale- nt lastele
- Vastavalt traditsioonile- nt päästepaadi koht
- Vastavalt jõule- nt majanduslikke ja poliitilisi ressuresse
- Vastavalt seadusele
Kuidas käib failikäsitlus mitme kasutajaga?
Lugeda saab mitu kasutajat korraga, muuta vaid üks korraga. Kui see, kes esimesena andmekogumi kasutusele võttis, avas selle lugemiseks, ei saanud keegi teine seda avada muutmise režiimis – ainult lugemise režiimis. Kui keegi avas andmekogumi kirjutamise režiimis, ei saanud seda enam keegi teine nii kaua avada, kuni esimene avaja selle sulgenud oli.
Mis on eksklusiivsed ja mitte-eksklusiivsed lukud?
- Eksklusiivsed (exclusive)- lukustatud kirjete kasutamise õigus (read/write/delete/update) oli ainult kirje lukustajal
- Mitte-eksklusiivsed (shared)- ülejäänud kasutajad said kirjete sisu lugeda, aga muid toiminguid teha ei saanud
Kirjelda klient-serveri arhitektuuriga andmebaaside lukustusviise. kirjete lukustamine
- Lukkudeta andmekäsitlus- ei lukustata ühtegi kirjet. Seda kasutatakse siis, kui andmebaasi ei lisata uusi kirjeid, ei uuendata ega kustutata olemasolevaid EHK ainult loetakse. Kasutatakse mõistet read-only.
- Kirje lukustamine- ainult ühe kirje lukustamine. Lukkude hulk on küll palju suurem, kui lehekülje lukustamise korral ja töötlus palju keerulisem, kuid võit 'juhuslike lukkude' kadumisest on mitmeid kordi suurem.
- Lehekülje lukustamine- lukustatakse alati rohkem kui üks kirje. Lukustatakse terve üks andmebaasi lehekülg, kus on palju kirjeid. Igal leheküljel on juhuslik komplekt kirjeid, mis lukustatakse.
- Tabeli lukustamine- lukustatakse kõik tabelis olevad kirjed. Eesmärgiks on tavaliselt kirjeid kaitsta muutuste eest mingi suure, paljusid kirjeid töötleva protsessi eest.
Nimeta erinevaid lukke (lukustusmeetodeid), mida saab andmebaasi panna
Lukustusmeetodid määravad luku tugevuse- kas kirjete kasutamise õigus on ainult ühel lukustajal või on ka teistel õigus andmeid lugeda.
ROLLBACK ja COMMIT eemaldavad iga luku.
- S-locks (shared locks)- seda saavad mitmed kasutajad korraga peale panna. Selle lukuga saavad kõik kirjeid lugeda, aga muuta ega kustutada ei saa keegi. Lukust vabastasid nii COMMIT kui ka ROLLBACK käsud
- X-locks (exclusive locks)- selle saab korraga peale panna üks kasutaja (see lukk saab eksisteerida vaid üksi). Sellisel juhul näeb lukustatud kirjeid/tabelit/lehekülge ainult lukustaja. Selle lukuga võib teoastada nii lisamise, kustutamise kui ka uuendamise käsklusi. Kui kirjet on muudetud või kustutatud, siis luku saab eemaldada ainult siis, kui võtta muudatused tagasi (ROLLBACK) või kinnitades muudatused (COMMIT). Kui tabelisse lisada uus kirje, siis jääb sellele kirjele, kuni ROLLBACK- või COMMIT-korralduse tegemiseni, X-lock tüüpi lukk.
- U-locks (update locks)- neid paigaldatakse siis, kui andmed loetakse baasist kindla sooviga neid uuendada või kustutada. U-lock võib koos eksisteerida s-lockiga. Selleks, et u-lockiga hakata muutma, tuleb ta teha x-lockiks, aga selleks peavad olema kõik s-lockid vabastatud ja siis u-lockid vabastatakse automaatselt ehk visatakse minema.
Lukkude vahelised seosed:
*)“S-lock” ja “U-lock” tüüpi lukud võivad koos eksisteerida. Kui andmete muutmiseks on vaja “U-lock” tüüpi lukk muuta “X-lock” tüüpi lukuks, siis kõik “S-lock” tüüpi lukud peavad eelnevalt olema vabastatud.
**)Kunagi ei õnnestu X-locki panna olemasoleva U-locki kõrvale. Õnnestub vaid paralleelselt eksisteeriva U-locki muutmine X-lock’ks. Sellisel juhul kõikide teiste protsesside U-lock’d vabastatakse.
Kui luku lisamine ei õnnestu oodatakse. Kas igavesti või mingi ajani. Võib tekkida TIME-OUT viga.
Mis on räpased lugemised (dirty reads)?
"Räpaseks lugemiseks" nimetatakse sellist lugemist, kus, juhul kui kirje on selliselt lukus, et tema andmeid ei saa lugeda (kirjele on paigaldatud “X-lock”), siis kui kirjest on olemas mingi varasem, lukustamisele ja muutmisele eelnev koopia, siis loetakse sisse see. Seda režiimi saab nii sisse kui välja lülitada. Selline lähenemine väldib ootamist lukustatud kirjete taga ja lihtsustab oluliselt andmebaasi mootori tööd.
See tähendas seda, et lugeja (mitte lukustaja) sai näha lukustatud kirjet enne seda, kui sinna oli muudatusi tehtud (insert puhul ei näinud midagi, sest varasem kirje puudus). See oli edasisamm, sest konflikti sattusin teise kirjutjaga siis, kui me mõlemad muuta tahtsime. Lugemisega probleeme polnud, raportite tegemiseks see sobis.
Andmekaitse LOE ÜLE KONSPEKTIST
Mis on indeks? Indeksi loomine
Indeks on andmebaasi juhtimissüsteemi funktsionaalne instrument, mis võimaldab muuta andmete (kirjete) pärimise andmebaasist kiiremaks → indeksist leiame võtme väärtuse järgi kiiresti kirje aadressi ja tänu sellele saame kirje enda poole pöörduda. Indeksid kirjeldavad andmete juurde nö otsetee (nende puudumisel peaksime läbi vaatama järjest kõik tabeli read). EHK tänu indeksitele on andmete otsimine ja leidmine andmebaasi tabelitest palju kiirem.
Struktuuri poolest on indeks tabel, millel on vähemalt kaks veergu (NB! tegemis EI OLE andmebaasi tabeliga, vaid indeksil on lihtsalt tabeli struktuur). Esimeses veerus on otsingu võti ja teine sellele võtmele vastava kirje aadress tabelis. Uue kirje kirjutamisel andmebaasi tabelisse, kirjutatakse rida ka igasse indeksisse, mis on selle tabeliga seotud. Indeks saab eksisteerida ainult seoses mingi tabeliga ja tabeli hävitamisel andmebaasist kaob ka indeks ja kõik selle tabeliga seotud indeksid. Kui kirjes muudetakse nende veergude väärtusi, mida on kasutatud indeksi võtme moodustamiseks, siis nendes indeksites kustutatakse vana indeksi kirje ja kirjutatakse sinna uus kirje. Enamikes indeksites on indeksi read järjestatud võtme väärtuse järgi (välja arvatud paisk-indeksid).
Indeksi loomiseks kirjaldatakse indeksi võtme struktuur (seda ei saa hiljem muuta), antakse indeksile unikaalne nimi (selle abil saab indeksi hävitada ilma tabelit hävitamata) ja määratakse tabel, millele see indeks luuakse.
Kuidas jagunevad indeksid? märksõnad
- Ühe-tasemeline indeks- kõik võtmeväärused ühes reas ja sorteeritud, asjad leitakse üles kahendotsinguga. Idee on sarnane raamatute taga olevate indeksitega- seal on sõna ning lehekülg/leheküljed, kus on antud sõnast räägitud.
Moodustatakse tavaliselt andmetabeli ühe välja järgi (saab ka mitme väljaga → siis pannakse nende väljade väärtused kokku, mis peab toimuma alati samas järjestuses). Indeksi moodustamiseks tehakse kahe-veeruline tabel, kus esimeses veerus on võtmete väärtused ja teises veerus kirjete aadresside loend
- Mitme-tasemeline indeks- seletatud indeksite juures
- Hõre indeks- Indeksisse ei kuulu kõikide kirjete võtme väärtused, vaid ainult lehekülgede esimeste kirjete võtme väärtused. Ei ole kõiki võtme väärtusi (kõiki indeksi väärtusi ei ole, on ainult teatud. On vahemikud, mõned on vahelt ära jäetud)). Kasutatakse lehekülge adresseeritavate indeksite korral. Alati järjestatud, aga võib olla nii ühe- kui ka mitmetasemeline.
- Tihe indeks- Andmetabeli kõikide kirjete võtmeväärtused on olemas ka indeksis EHK igale andmetabeli kirjele vastab üks indeksi kirje (sellele saab ka hõreda indeksi peale ehitada). Kõik indeksid on esitatud. Võib olla nii järjestatud kui ka järjestamata ning võib olla nii ühe- kui ka mitmetasmeline.
- Järjestatud indeks- kindlas järjekorras
- Järjestamata indeks- järjekord puudub. alati tihe.
Too indeksitest näiteid PROBLEEMID
- Primaarindeks- fikseeritud pikkusega kirjete loend, millest igal on kaks veergu → esimeses võtme väärtus ja teises andmebaasi lehekülje aadress (fikseeritud suurusega blokk, kuhu iga tabeli puhul on salvestatud konkreetse tabeli kirje pikkusest sõltuv arv kirjeid), kus paikneb antud võtme väärtusele vastav kirje. Kui lehekülg on teada, siis loetakse korraga sisse ja otsitakse õige kirje üles järjestikotsinguga. Indeks vastab tabeli primaarvõtmele (indeksi võtme väärtus = tabeli primaarvõti). On hõre, järjestatud ja ühe-tasemeline. EHK kõigi andmetabeli kirjete võtmeväärtusi ei ole indeksis, indeksi kirjed on sorteeritud võtmeväärtuse kasvamise või kahanemise järjestuses ja indeksi kõik kirjed paiknevad samal tasemel st. ühtses jadas.
Otsimine → leitakse järjestikuste indeks-kirjete paar, mille vahele otsitava kirje võtme väärtus jääb. Võtme väärtust otsitakse kahendotsinguga.
Probleemid → indeksisse uute ridade lisamine ja sealt ridade kustutamine. Probleem tekib siis, kui lisatav kirje satub andmetabelis uue bloki esimeseks kirjeks, siis tuleb lisada kirje ka indeksisse vajalikule positsioonile kirjete järjestuses (vastavalt võtme väärtusele). See võib tingida vajaduse taha poole jäävaid kirjeid edasi nihutada, et teha uuele indeksi kirjele kohta. Kirje kustutamisel võib tekkida vajadus kas indeksi uuendamiseks (kui kustutatakse bloki esimene kirje – ankur-kirje) või indeksi rea kustutamiseks (kui kustutati viimane kirje plokist). Esimesel juhul tuleb uuendada ainult võtme väärtus. Teisel juhul peame me indeksist kustutama kirje ja “tõmbama kokku) taha poole jäävaid indeksi kirjeid.
- Kobarindeks- primaarindeksi väärtus ei ole andmetabelis unikaalne. Kobarindeksi kirjel on kaks veergu- võtme väärtuste veerg ja lehekülje alguse viida veerg. Kobarindeks on tihe, järjestatud ja ühe-tasemeline. EHK kõigi andmetabeli kirjete võtmeväärtused on indeksis olemas, indeksi kirjed on sorteeritud võtmeväärtuse kasvamise või kahanemise järjekorras ja indeksi kõik kirjed paiknevad samal tasemel st. ühtses jadas. Kobarindeksis leidub rida andmetabeli iga erineva kobarväärtuse kohta (indeksi kirje esimeses veerus) ja teine veerg viitab leheküljele, kus on esimene vastava võtmeväärtusega kirje:
Otsimine → otsitakse indeksist etteantud võtmeväärtuse järgi üles indeksi rida ja võetakse sealt lehekülje aadress. Siis pöördutakse aadressi järgi andmetabeli lehekülje poole ja loetakse sealt kirjeid järjest seni, kuni leitakse vastava võtmeväärtusega indekseeritud välja väärtus. Siis loetakse kirjeid seni, kuni indekseeritud välja väärtus ehk kobar-väärtus jääb samas etteantud otsingu võtmeväärtusega või kuni tabeli lõppemiseni EHK nt tahetakse leida kirjed, mille ameti ID on 2, siis võetakse indeksist selle lehekülg, milleks on antud näites 1 ja loetakse kirjeid seni, kuni saadakse kätte kõik ametid, mille ID on 2 ehk loetakse ka lehekülge nr 2. Nagu primaarindeksis, toimub siin ka otsimine kahendotsinguga.
Probleem → Ei ole efektiivne, sest uue rea lisamisel peab blokkidena hakkama andmeid liigutama. Võimalus on panna ühte plokki ühe võtmeväärtusega kirjed ja kui nad ära ei mahu, siis jätkuvad järgmises plokis. Siis tuleb lisada ka viit järgmisele lehele, mis muudab efektiivsemaks. Probleem tekib indeksi kirjete lisamisel. Kuna indeks on tihe st. kõik võtme väärtused on indeksis ja ka järjestatud, siis tuleb iga uue võtme väärtuse tekkimisel andmetabelisse teha indeksisse "auk", selleks et uus indeksi võtme väärtus panna järjestuses õigesse kohta.
- Sekundaarindeks- Kirjetes on kaks veergu (võtme väärtuste veerg ja lehekülje viida veerg) ja indeksi kirjed on järjestatud võtmeväärtuse järgi. Veergude väärtused on unikaalsed, aga kirjed ei ole sorteeritud selle väärtuse järgi. Tihe indeks, järjestatud ja ühe-tasemeline EHK kõigi andmetabeli kirjete võtmeväärtused on indeksis olemas, indeksi kirjed on sorteeritud võtmeväärtuse kasvamise või kahanemise järjekorras ja indeksi kõik kirjed paiknevad samal tasemel st. ühtses jadas.
Kuna veerg, mille järgi indeks on koostatud ei ole andmetabeli kirjete sorteerimise aluseks, siis ei nimetata seda võtmeks vaid lihtsalt indekseerimisväärtuseks ja tabeli veergu, milles indekseerimisväärtuseks on, indekseeritud veeruks.
Sekundaarindeksit kasutatakse paralleelselt primaarindeksiga siis, kui tabelis on kaks veergude komplekti, mille väärtused on unikaalsed. Neist ühest tehakse primaarindeks ja selle järgi sorteeritakse tabeli kirjed. Teisest unikaalsest veergude komplektist tehakse sekundaarindeks.
- Mitmetasemeline indeks- idee on vähendada indeksist otsimise sammude arvu (vähendada indeksi otsingu iga sammu järel läbi vaadatavate indeksi-kirjete hulka rohkem kui kaks korda) ehk kogu otsing koondub kiiremini.
Kahe-tasemeline indeks, mis on ehitatud primaarse indeksi põhimõttel:
Siin jagatakse ka indeks plokkideks(lehekülgedeks) ja ehitatakse sinna peale teine indeksi tase, mis on primaarne indeks esimese taseme indeksile. Leitud aadressi järgi on vaja lugeda puhvrisse sisse esimese taseme indeksi blokk ning lugeda sealt selle lehekülje aadress andmetabelis, kus asub kirje ja seejärel lugeda leitud aadressi järgi sisse andmetabeli lehekülg.
Siin näites on tegemist hõreda ja järjestatud mitme-tasemelise primaarindeksiga.
- Paiskindeks (hash index)- indeksi lugemiste arv on 1 kuni kolm/neli. Indeksil on alati kolm veergu: võtme väärtus, viit andmetabeli leheküljele ja viit kollisiooni ahela järgmisele kirjele. Indeksi väärtused (nende asukoht) indeksis arvutatakse valemi abil (asukoht tundub juhuslik, aga tegelikult ei ole). Indeks tehakse tema loomisel valmis tema maksimaalse võimaliku ridade arvuga (täidetakse tühjade ridadega). Kui indeksi ridade arvu on vaja muuta (tavaliselt suurendada) tuleb indeks luua uuesti, sedakorda siis juba suurema või väiksema ridade arvuga. Paisk-indeksi ridade arv peaks olema umbes 20% suurem, kui on seda maksimaalselt andmetabelisse lisatavate kirjete arv.
Võtme indeksist leidmiseks kuluv lugemiste arv ei sõltu indeksi ridade arvust vaid sellest, kui õigesti on arvutatud paisk-indeksi ridade arv; suurem ridade arv annab tavaliselt paremaid tulemusi.
OLULINE: paisk-indeksil on kolm veergu, paisk-indeksil on alati fikseeritud arv ridu ja paisk-indeksi ridade arv peaks olema ca 20% suurem, kui on maksimaalselt võimalik lisada kirjeid andmetabelisse, mille jaoks on see paisk-indeks loodud.
Iga paisk-indeksi tabeliga on seotud funktsioon x=f(y), kus y on võtme väärtus ja x on selle võtme väärtuse all kalkuleeritud rea number, kuhu võtme väärtus y koos lehekülje aadressiga kirjutatakse. Funktsiooni f nimetatakse paisk-funktsiooniks. Ja tegevust, kus paisk-funktsiooni järgi võtme väärtuse alusel arvutatakse indeksi kirje rea aadress, kuhu see võtme väärtus koos lehekülje viidaga kirjutatakse, nimetatakse paiskamiseks. Andku meie võtme väärtus "Kai Mai' funktsioonil f tulemuse 3. See tähendab seda, et võtme väärtus "Kai Mai' tuleb paigutada paisk-indeksi kolmandasse ritta:
Kui me nüüd tahame teada, kas mingi võtme väärtusega kirje on andmetabelis olemas peame me võtma sama funktsiooni, millega me "paiskasime" võtme väärtuse indeksisse, arvutama otsitavale reale indeksi rea numbri ja vaatama, kas indeksi selle rea peal on sellise väärtusega võtme väärtus.
Kui tahetakse kirjutada võtme väärtust sinna, kus juba on olemas mingi võtme väärtus, siis valitakse teisele võtmeväärtusele mingi teine vaba rida indeksi tabelis (siis viidatakse algse rea juures sinna reale, kuhu teine võtmeväärtus pandi).
Sellist ahelat, mis tekib indeksi nendest kirjetest, mida funktsioon määrab sama indeksi rea peale, nimetatakse kollisiooni ahelaks.
Kui paisk-indeksi kõik read on täidetud, siis ei saa andmetabelisse enam ühtegi kirjet lisada, kuna indeksisse ei õnnestu lisada enam ühtegi uut väärtust. Sellist situatsiooni ei tohi andmebaasis lasta tekkida. Juba siis kui selline "oht paistab kauguses" tuleb paisk-indeks hävitada ja luua see uuesti ja siis juba suurema ridade arvuga.
Probleem: Paisk-indeksi suurimaks miinuseks on see, et ta tuleb kohe alguses täies mahus valmis ehitada ja seepärast reserveerib see kohe (olenemata andmetabeli suurusest) täies mahus ketta ruumi. Seepärast kasutatakse neid harva. Teisest küljest vaadatuna ei ole üldse väga palju kohti kus neid kasutada tasuks.
Paisk-indeksid on tihedad (paisk-indeksis on andmetabeli kõigi unikaalsete võtmete väärtused), järjestamata (paisktabelis paiknevad võtmeväärtused “kaootiliselt segamini” ja mitme tasemelised (kujuneb dünaamiliselt läbi kollisiooni ahelate)
Märkmed
- CASE-süsteemi abil võrreldakse uut mudelit olemasoleva andmebaasi struktuurida ja genereeritakse SQL-keelsed andmebaasi andmestruktuuri muutmise laused
- Sama tabeli mitmest koopiast saab teha päringu, kui kirjutada FROM süntaksisse tabel mitu korda:
- Relatsioon- tabel
- Atribuut- veerg
- Domeen- veeru tüüp
- Relatsiooni skeem- tabeli kirjeldus
- Peatükkides 5.3-5.8 on toodud posti toomise ERD mudeli näide.
- Oracles NULL ei võrdu NULLiga
- INSERT lausega mitme rea lisamisel saada need ühe käsuga- koormab serverit vähem
- DELETE, UPDATE korralduse optimerimiseks kasutada indeksit
- SELECT. Sõltub WHERE tingimusest. Kasuta domeen-võtme normaalkuju. tabelite arv muudab päringu aeglasemaks, kasuta alam-SELECT lauseid. Indekseid ei tohi liiga palju oll. SELECT lause võib mitmeks tükiks jagada. FROM grupp lühemaks, kasuta (IN, NOT IN, EXISTS alampäringuid). WHERE enne JOINI. OUTER-join on aeglane, kasuta UNION-konstruktsiooni. Indekseeri kõik seosed.
- Andmete korral on piiratu ressursiks aeg, mille jooksul on vaja mingeid konkreetseid andmeid muuta või kasutada.
- Lukustamine- Andmebaasis ei ole nii, et ma avan faili ja siis ta läheb teistele lukku, vaid seal toimus alguses lukustamine kirje haaval. Nt ma tahan hakata tegema tehingut pangakontoga, aga kuna ma ei taha, et keegi teine samal ajal tehingut teeks, siis ma panen selle kirje teistele lukku
- Ajalooliselt haldas lukke andmebaasi juhtimissüsteem, klient-serveris haldab lukke server