Tiedonhallinnan perusteet H11 Ovien ja kulun valvontajärjestelmän tietokanta Nimi: Mikko Haapanen Opiskelijanumero: 0900568 Ryhmä: T09L Työ tehty: 15.3.2010
Mikko Haapanen 15.3.2010 1(7) 1. Asiakasvaatimukset Harjoitustyön tarkoituksena oli luoda tietokanta koulun sähköistä kulunvalvontaa varten. Alla on listattu kulunvalvonnan toteutus sekä vaatimukset: - Oviin on asennettu sähkölukot, jotka sisältävät tiedon lukon numerosta ja sen ryhmänumerosta. - Lukon ryhmänumero kertoo, minä päivinä ja kellonaikoina ovi on auki. - Avainkortit sisältävät mikrosirun, jossa on avainkortin numero sekä sen ryhmänumero. - Käyttäjän yrittäessä ovesta sisään sähkölukko lukee kortin tiedot ja vertaa kortissa olevan ryhmäkoodin omaan listaansa ryhmistä, jotka voivat käyttää ovea sinä kellonaikana ja päivänä. - Kaikki korttien käytöt rekisteröidään loki-tiedostoon, jotta voidaan selvittää keitä kiinteistön missäkin osassa on milloinkin ollut. - Kulunvalvonta on myös toimittava silloin, kun yhteys tietokantaan ei toimi. Edellä mainitun kulunvalvonnan toteutuksen ja asiakkaan vaatimusten mukaisesti luodaan seuraavalla sivulla olevan kuvan 1. mukainen ER-malli.
Mikko Haapanen 15.3.2010 2(7) Kuva 1: ER-mallinnus
Mikko Haapanen 15.3.2010 3(7) 2. ER-malli Kuva 1. siis esittelee asiakkaan vaatimuksien perusteella suunniteltua ER-mallinnusta eli näkemystä siitä, miten tietokannan pitäisi loogisesti rakentua ja toimia. Jokainen taulukko sisältää perusavaimen, joka on merkitty taulukkoon alleviivauksella ja perusavaimen nimen perässä olevalla tähdellä. Kaikessa yksinkertaisuudessaan kuvan ER-malli kertoo meille, että jokaisella käyttäjällä on yksi avainkortti. Avainkortit kuuluvat johonkin tiettyyn korttiryhmään, jolla puolestaan voi olla rajoitettuja oikeuksia tiettyihin lukkoryhmiin. Lukkoryhmät sisältävät useita lukkoja. Edellä mainittujen lisäksi löytyy erillinen logi -taulu, joka pitää kirjaa ovien avaus tapahtumista. Alla on vielä tarkemmin selvitetty ER-mallin sisältö. Tietokanta pitää kirjaa kaikista käyttäjistä, jotka omistavat avainkortin. Tietokantaan siis luodaan käyttäjä -niminen taulukko, joka sisältää tiedot henkilötunnuksesta (hid), etunimestä (enimi), sukunimestä (snimi) sekä käyttäjän omistamasta kortista (korttinro). Yhden käyttäjän nimissä voi olla vain yksi avainkortti, mikä on merkattu ER-malliin käyttäjä ja kortti -taulukon väliin yhden suhde yhteen (1:1). Kortti-taulukko sisältää tiedot jokaisesta avainkortista, eli korttien numerosta (korttinro) sekä korttien ryhmänumerosta (kryhmanro). Yhteen korttiryhmään voi kuulua monta avainkorttia ja tämä on merkitty ER-malliin n:n suhde yhteen (n:1). Jokaisella korttiryhmällä on oman numeronsa lisäksi merkattu nimi (kryhmanimi) selventämään mistä ryhmästä on kyse. Tällaisia ryhmiä voi olla esimerkiksi opettajat ja oppilaat. Jokainen korttiryhmä liitetään lukkoryhmään oikeudet -taulukossa. Oikeudet -taulukossa kerrotaan millä korttiryhmillä on oikeudet käyttää mitäkin lukkoryhmää. Lisäksi tässä taulukossa voidaan vielä erikseen määritellä päivät (aukipaiva) ja aikavälit (aukiaika ja kiinniaika) milloin mikäkin korttiryhmän käyttäjä voi kulkea mistäkin lukkoryhmän määrittämästä ovesta. Koska korttiryhmiin voi kuulua monta lukkoryhmää ja päinvastoin, on tämä merkattu ER-malliin n:n suhde n:ään (n:n). Lukkoryhmä -taulukosta löytyy lista lukkoryhmien numeroista (lryhmanro) ja näiden ryhmien nimistä (lryhmanimi), jonka tarkoitus on korttiryhmän nimen tapaan selventää ryhmien sisältöä. Lukko -taulukosta löytyy lista lukoista (lukkonro) sekä lukoille asetettujen lukkoryhmien numeroista (lryhmanro). ER-mallin ala-vasemmalta löytyy vielä erillinen logi-taulukko, joka kirjaa tiedot tapahtumista. Se sisältää tapahtumanumeron (tid), tapahtuma-ajan (aika), tapahtumassa käytetyn kortin numeron (korttinro), lukon numeron (lukkonro) sekä käytetyn kortin omistajan henkilötunnuksen (hid).
Mikko Haapanen 15.3.2010 4(7) Asiakkaan vaatimuksissa oli vielä maininta, että kulunvalvonnan tulisi toimia ns. offline tilassa. Tämä toteutetaan ylläpidon toimesta, joko automatisoidulla menetelmällä tai käsin siirtämällä oikeudet -taulun tarvittava sisältö sähköisiin lukkoihin. Eli jokainen lukko saa listan niistä korttiryhmistä ja näiden ryhmien oikeuksista tähän lukkoon. 3. Relaatiomalli Tietokannan luonnissa seuraava vaihe on relaatiomallin luominen. Relaatiomalli kertoo käyttäjälle taulukoiden väliset yhteydet, jotka auttavat myöhempiä SQL-kyselyjen tekoa. Alla on kuva kulunvalvonnan relaatiomallista. Kuva 2: Relaatiomalli Relaatiomallista löytyy taulukot, joiden päältä löytyy paksunnettuna taulukon nimi. Taulikoiden nimien alapuolelta löytyy lista taulukon kentistä, joista ensimmäisenä on tähdellä merkattu kunkin taulukon pääavain. Kukin taulu on linkitetty mustalla viivalla seuraavaan taulukkoon, kertoen mitkä kentät tarkoittavat samaa asiaa.
Mikko Haapanen 15.3.2010 5(7) 4. SQL-lauseet taulukoiden luomiseen Alta löytyy tarvittavat komennot tietokannan luontia varten # Luodaan kortti- ja lukkoryhmä -taulukot CREATE TABLE korttiryhma ( # NOT NULL = kenttä ei saa olla tyhjä # AUTO_INCREMENT = rivin luonnin yhteydessä tämä kenttä saa automaattisesti arvon # PRIMARY KEY = pääavain kryhmanro INT NOT NULL AUTO_INCREMENT PRIMARY KEY, kryhmanimi VARCHAR(30) CREATE TABLE lukkoryhma ( lryhmanro INT NOT NULL AUTO_INCREMENT PRIMARY KEY, lryhmanimi VARCHAR(30) # Luodaan oikeudet -taulu CREATE TABLE oikeudet ( kryhmanro INT, lryhmanro INT, # FOREIGN KEY = vierasavain, jolla viitataan (REFERENCE) taulun(avaimeen) FOREIGN KEY (kryhmanro) REFERENCES korttiryhma(kryhmanro), FOREIGN KEY (lryhmanro) REFERENCES lukkoryhma(lryhmanro), aukiaika TIME, kiinniaika TIME, aukipaiva VARCHAR(2) # luodaan kortti, käyttäjät, lukko -taulut CREATE TABLE kortti ( korttinro INT NOT NULL AUTO_INCREMENT PRIMARY KEY, # REFERENCE = viitataan taulun(kenttään) kryhmanro INT REFERENCES korttiryhma(kryhmanro) CREATE TABLE kayttajat ( hid VARCHAR(11) NOT NULL PRIMARY KEY, enimi VARCHAR(15), lnimi VARCHAR(15), korttinro INT REFERENCES kortti(korttinro)
Mikko Haapanen 15.3.2010 6(7) CREATE TABLE lukko ( lukkonro INT NOT NULL AUTO_INCREMENT PRIMARY KEY, lryhmanro INT REFERENCES lukkoryhma(lryhmanro) # luodaan logi-taulu CREATE TABLE logi ( tid INT NOT NULL AUTO_INCREMENT PRIMARY KEY, khid INT REFERENCES kayttajat(hid), korttinro INT REFERENCES kortti(korttinro), lukkonro INT REFERENCES lukko(lukkonro), # saa päivämäärän ja kellonajan arvoksi lisättäessä tapahtuman logiin # GETDATE() funktiolla kirjausaika datetime NOT NULL DEFAULT 0 /* Muutetaan AUTO_INCREMENT arvot taulukoille, * jotta taulukoiden pääavainten erottaminen * toisistaan olisi helpompaa esimerkiksi kirjanpidossa. */ ALTER TABLE korttiryhma AUTO_INCREMENT=10000; ALTER TABLE kortti AUTO_INCREMENT=20000; ALTER TABLE lukkoryhma AUTO_INCREMENT=40000; ALTER TABLE lukko AUTO_INCREMENT=60000; SQL-lauseet uusien ryhmien, avainten, jne lisäämistä varten: # luodaan uusi lukkoryhmä INSERT INTO lukkoryhma(lukkoryhma.lryhmanimi) # luodaan esimerkkiryhmät VALUES ('Aula'), ('Yläkerta'), ('Alakerta'), ('Labrat') # luodaan uusi korttiryhmä INSERT INTO korttiryhma(korttiryhma.kryhmanimi) # luodaan esimerkkiryhmät VALUES ('Opettajat'), ('Oppilaat'), ('Siivoojat'), ('Vartijat') # luodaan uusi lukko INSERT INTO lukko(lryhmanro) SELECT lukkoryhma.lryhmanro FROM lukkoryhma WHERE lukkoryhma.lryhmanro = 40001 # valitaan lukkoryhmä 4001 käyttöön
Mikko Haapanen 15.3.2010 7(7) # luodaan uusi kortti INSERT INTO kortti(kryhmanro) SELECT korttiryhma.kryhmanro FROM korttiryhma WHERE korttiryhma.kryhmanro = 10001 # sijoitetaan kortti ryhmään 10001 # luodaan uusi kortti INSERT INTO kayttajat VALUES ('130365','Matti','Meikäläinen', (SELECT kortti.korttinro FROM kortti WHERE kortti.korttinro = 20000)) # annetaan käyttäjälle kortti 20000 käyttöön # luodaan oikeudet eri käyttäjä- ja lukkoryhmien välille INSERT INTO oikeudet VALUES ( # korttiryhmä 10000 (SELECT korttiryhma.kryhmanro FROM korttiryhma WHERE korttiryhma.kryhmanro = 10000), # lukkoryhmä 40000 (SELECT lukkoryhma.lryhmanro FROM lukkoryhma WHERE lukkoryhma.lryhmanro = 40000), # Aukiaika '05:30:00', # Kiinniaika '18:00:00', ) # Aukipäivä (maanantai) 'MA' Sähköisten lukkojen ns. offline tilaa varten täytyy lukkojen muistiin ladata lista milloin mikäkin käyttäjäryhmä voi ovea käyttää. Tämä tapahtuu alla olevalla SQL-kyselyllä: # Ladataan lukolle numero 60000 käyttäjäoikeustiedot SELECT lukko.lukkonro, oikeudet.* FROM lukko, oikeudet WHERE lukko.lryhmanro = oikeudet.lryhmanro AND lukko.lukkonro = 60000