Järjestelmäkäsikirja
Tietokanta
Kantaan tehdyt muutokset
Yleistä
Järjestelmä perustuu varsin aktiiviseen tietokannan käyttöön. Syyt tähän ovat toisaalta käyttäjien muokattavissa olevan tiedon runsaus, toisaalta taas WWW-ympäristön erityisvaatimukset. Tietokannan pääsisällön muodostavat erilaiset seikkailun juonta, paikkoja ja esineitä kuvaavat tiedot.
Tietokantapalvelimeksi on valittu korkeakoulukäytössä ilmainen mSQL (Mini SQL), joka sisältää osan SQL-standardin mukaisista ominaiskuuksista. mSQL on jatkuvan kehitystyön alla, ja se toimii useilla UNIX-alustoilla. mSQL:n ominaisuuksia ovat mm. keveys ja nopeus sekä suhteellinen yksinkertaisuus, mitkä sopivat yhteen projektin päämäärien kanssa. mSQL:stä tosin puuttuu monia ominaisuuksia, mitkä olisivat tehneet siitä miellyttävämmän työkalun.
Tietokannan liittymää ohjelmaan käsitellään erikseen luvussa Tietokantaliittymämoduuli.
Tietovarasto
Johtuen järjestelmän luonteesta (muokattava seikkailupeli) sekä järjestelmän toimintaympäristöstä (WWW) todettiin jo varhaisessa kehitysvaiheessa järjestelmän tietorakenteen monimutkaisuus. Syitä tähän ovat mm.:
- Useiden entiteettien olemassaolo
- Entiteettien monimutkaiset keskinäiset suhteet
- Suurin osa tiedoista on muuttuvaa tai käyttäjän muokattavissa
- Ohjelmansuorituksen katkeaminen WWW ympäristössä
Normaalin UNIX:in tiedostojärjestelmän käyttö tämän rakenteen ja toiminnallisuuden toteuttamiseksi olisi ollut suuritöinen ja toteutus ylläpidettävyydeltään heikko. Lisäksi projektiryhmän kokemus tietokannoista vaikutti päätökseen ottaa käyttöön tietokantaohjelmisto. Projektin alkuvaiheissa oli mSQL-niminen tietokanta ainoa vapaa (ilmainen) UNIX-SQL-tietokanta, joka oli aktiivisen kehityksen kohteena. mSQL:n valintaan vaikuttivat myöskin tietokannan väitetyt ominaisuudet, mm. keveys, helppo siirrettävyys eri ympäristöihin ja nopeus sekä muutamien mielenkiintoisten lisäosien saatavuus.
mSQL
mSQL:n ominaisuuksien kehitys toivottavasti jo projektin ensimmäisen vuoden aikana tuo lisäominaisuuksia, jotka mahdollistavat tiettyjen toimintojen siirron suoraan tietokantamoottorille. Nykyhetken mSQL:n rajoituksia, jotka vaikeuttavat implementointia ovat mm.:
- mSQL ei mahdollista monen kentän Primary key:tä.
- mSQL ei mahdollista muita indeksejä kuin Primary key:n.
- mSQL ei mahdollista tietokantatason eheyden tarkistusta.
- mSQL ei sisällä laskuri-tyyppistä kenttää.
- mSQL:n ohjelmatason liittymä on liian yksinkertainen.
- mSQL:n transaktio-ominaisuudet ovat puutteelliset.
Jos tietokantaa vaihdetaan tai mSQL:stä tulee kehittyneempiä versioita, voidaan näistä ongelmista päästä eroon. Tietokantariippuvat kohdat ohjelmasta on pyritty erottamaan, jotta päivitys olisi helppo.
Tietokantamoottori muodostaa UNIX-koneessa oman prosessin, joka käynnistetään ajamalla mSQL:n bin-hakemiston msqld-ohjelma. Valittuun pid-nimiseen hakemistoon muodostuu silloin pid-niminen tiedosto, johon mSQL tallentaa prosessin id:n.
mSQL:ssä muodostetaan ja poistetaan tietokantoja msqladmin-ohjelmalla. Samalla ohjelmalla voidaan myös sulkea tietokantapalvelin. LAG käyttää yhtä tietokantaa, joka on nimetty LAG:ksi. Tietokanta sijaitsee tiedostorakenteessa mSQL:n databases-hakemistossa. Taulurakenne luodaan normaaleilla SQL:n CREATE TABLE -lauseilla. mSQL:ssä on msql-niminen terminal-ohjelma, jolla voidaan syöttää suoraan SQL-lauseita.
Yhteys LAG:sta tietokantapalvelimeen luodaan mSQL:n kuuluvalla C-funktiokirjastolla, joka muodostaa yhteyden /dev/msqld:n kautta. Saatavilla on myöskin Perl'illä sekä muutamilla muilla ohjelmointikielillä olevia kirjastoja. Se mitä lopullisessa versiossa tullaa käyttämään riippuu erilaisista tehokkuus, yhteensopivuus ym. kysymyksistä.
Mini SQL:n manuaali löytyy osoitteesta http://Hughes.com.au/product/msql/manual.htm.
Looginen rakenne
Taulukko tietokannan taulujen kenttien sisällöstä on liitteenä.
Tietorakenteen keskeisimmät entiteetit (ja tietokannan taulut) ovat:
- Käyttäjä - järjestelmän käyttäjä: esim. pelaaja, pelin kirjoittaja, opettaja tai ylläpitäjä.
- Ryhmä - käyttäjät jaetaan erilaisiin ryhmiin, joilla on erilaisia käyttöoikeuksia. Esim. Guests, Players, U501 (kurssinumero), Teachers.
- Seikkailu - järjestelmään voidaan luoda useita seikkailuja, joilla jokaisella on omat paikat, toiminnot, esineet ja ominaisuudet.
- Esine - Irtaimet objektit, joita pelaaja voi kuljettaa mukanaan, nostaa, pudottaa jne. Esim. lapio, suklaalevy.
- Ominaisuus - Pelaajan hahmon numeerisia ominaisuuksia, esim. rahamäärä.
- Paikka - seikkailun perusosa, paikka jossa pelaaja tai esine voi olla. Esim. kukkula, bussipysäkki.
- Teko - tietty teko, joka voidaan tehdä tietyssä paikassa. Esim. siirtyminen toiseen paikkaan, esineen ostaminen.
- Teon osat - toiminnot voivat jakautua useisiin yksinkertaisiin perusosiin. Esim. jonkin esineen ostamiseen liittyy kaksi toimintoa, esineen saaminen ja rahan väheneminen.
- Teon ehdot - toiminnoille voidaan määritellä ehtoja, esim. ostaminen vaatii tietyn määrän rahaa, ampuminen aseen.
Jokaisella näistä on primary keynä long integer -tyyppinen laskurikenttä (ID), jota käytetään identifiointiin eri relaatioissa ja tietojen etsinnässä.
N:N Relaatioita on:
- Käyttäjän (pelaajan) esineen paikka
- Käyttäjän ominaisuus
- Käyttäjän tekemät teot
- Käyttäjän käymät paikat
E-R-Kaavio.
PostScript-versio: 
Tietokannan implementaatio tauluineen, kenttineen ja relaatioineen.
Tietokannan taulut
- Users - Sisältää käyttäjäkohtaista tietoa. Jokaista käyttäjänimeä vastaa yksi tietue Users-taulussa.
- Groups - käyttäjäryhmät. Jokainen Users-taulussa oleva käyttäjä kuuluu johonkin Groups-taulun ryhmään. Groups-taulussa säädellään mm. käyttäjien oikeuksia.
- Adventures - seikkailut. Adventures-taulussa säilytetään erillisten seikkailujen nimet sekä mm. seikkailun alkupaikka (location).
- Locations - paikat. Seikkailun paikat. Jokainen paikka kuuluu johonkin seikkailuun.
- Actions - teot. Tiettyyn paikkaan liittyvät teot. Tässä taulussa on lähinnä teon nimi sekä pelaajalle tuleva kuvaus.
- ActionConditions - tekojen ehdot. Tiettyyn tekoon liittyvät ehdot. Jokainen ehto liittyy johonkin tekoon, mutta teolle ei välttämättä ole yhtään ehtoa.
- ActionParts - tekojen osat. Tietyn teon alkeisosat.
- Items - esineet. Seikkailun esineet. Jokainen esine liittyy johonkin seikkailuun.
- Properties - ominaisuudet. Pelaajan ominaisuudet seikailuissa. Jokainen ominaisuus liittyy johonkin seikkailuun.
- ItemLocations - esineiden paikat. Sisältää seikkailun aikana muuttuvan tiedon siitä, missä seikkailun paikoissa tietyn pelaajan esineet ovat.
- PropertyValues - pelaajan ominaisuudet. Sisältää seikkailun aikana muuttuvan tiedon siitä, mitkä tietyn pelaajan ominaisuudet ovat.
- LocationsBeen - käydyt paikat. Sisältää tiedon pelaajan käymistä paikoista. Pelaajan käydessä ensimmäistä kertaa seikkailun jossain paikassa merkitään se tähän tauluun.
- ActionsDone - tehdyt teot. Sisältää tiedon pelaajan suorittamista teoista. Pelaajan suorittaessa jonkin teon ensimmäistä kertaa tehdään siitä merkintä tähän tauluun. Jos tekoon on liittynyt este, esteestä saatu pistemäärä talletetaan myöskin tähän tauluun.
- Pictures - kuvatiedostot. Sisältää järjestelmään siirrettyjen kuvien tiedostonnimet.
Users-taulun kentät:
- ID (long int, primary key) - käyttäjälle annettava numerokoodi
- Name (text 40) - käyttäjän nimi
- Password (text 20) - käyttäjän salasana
- GroupID (long int) - käyttäjän ryhmän ID-koodi
- LocationID (long int) - käyttäjän paikka seikkailussa, jota käyttäjä on pelaamassa
- LastActionTime (double) - päivämäärä ja aika jolloin käyttäjä on viimeksi tehnyt "jotain" järjestelmässä (formaatti vahvistamatta)
- RoundNumber (long int) - Satunnaisluku, joka toimii käyttöoikeusvalvonnan apuna, katso tarkemmin käyttöoikeusvalvontaa käsittelevästä luvusta
Groups-taulun kentät:
- ID (long int, primary key) - ryhmän numerokoodi
- Name (text 20) - ryhmän nimi
- Permissions (long int) - ryhmän käyttöoikeudet. Katso tarkemmin käytyöoikeuden hallintaa käsittelevästä luvusta
- AdventureID (long int) - seikkailu, joka on ryhmän luoma
Adventures-taulun kentät:
- ID (long int, primary key) - seikkailun numerokoodi
- Name (text 20) - seikkailun nimi (seikkailun luojien sisäiseen käyttöön)
- Description (text 255) - seikkailun pelaajalle annettava kuvaus
- FirstLocationID (long int) - Seikkailun ensimmäisen paikan ID-koodi
- ReadyToPlay (long int) - Tosi(<>0) tai epätosi (0) riippuen siitä, onko seikkailu valmis pelattavaksi
Locations-taulun kentät:
- ID (long int, primary key) - paikan numerokoodi
- Name (text 40) - paikan nimi (seikkailun luojien sisäiseen käyttöön)
- Header (text 50) - paikan pelaajille näkyvä nimi
-
AdventureID (long int) - seikkailun, johon paikka kuuluu, ID
-
NoItemsText (text 255) - teksti, joka tulostetaan esinelistan paikalle, jos paikassa ei ole yhtään esinettä
-
UserID (long int) - Paikan luoneen käyttäjän ID
Actions-taulun kentät:
-
ID (long int, primary key) - teon ID-koodi
-
Name (text 40) - teon nimi (seikkailun luojien sisäiseen käyttöön)
-
Description (text 100) - teon pelaajalle näkyvä kuvaus
-
LocationID (long int) - paikan, johon teko kuuluu, ID
-
BeforeMessage (text 255) - ennen tekoa näytettävä teksti (HTML)
-
SuccessMessage (text 255) - teon onnistuneen suorituksen jälkeen näytettävä teksti (HTML)
-
ObstacleClass (text 40) - esteen luokka (hakemisto)
-
ObstacleOptions (text 40) - esteen optioita, merkitys riippuu esteen luokasta
ObstacleName (text 40) - esteen luokan sisäinen nimi
-
ObstacleInstance (text 40) - esteen ajettavan ohjelman nimi
-
UserID (long int) - teon luoneen käyttäjän ID
ActionConditions-taulun kentät
-
ID (long int, primary key) - teon ehdon ID-koodi
-
ActionID (long int) - teon, johon ehto liittyy, ID-koodi
-
Type (long int) - teon ehdon tyyppi. Katso tarkemmin teon ehtoja käsittelevästä luvusta.
-
ItemID (long int) - ehtoon mahdollisesti liittyvän esineen ID-koodi
-
PropertyID (long int) - ehtoon mahdollisesti liittyvän ominaisiiden ID-koodi
-
LocationID (long int) - ehtoon mahdollisesti liittyvän paikan ID-koodi
-
Argument (long int) - ehtoon mahdollisesti liittyvä numeerinen argumentti
ActionParts-taulun kentät
-
ID (long int, primary key) - teon osan ID-koodi
-
ActionID (long int) - teon, johon osa liittyy, ID-koodi
-
Type (long int) - teon osan tyyppi. Katso tarkemmin teon osia käsittelevästä luvusta.
-
ItemID (long int) - teon osaan mahdollisesti liittyvän esineen ID-koodi
-
PropertyID (long int) - teon osaan mahdollisesti liittyvän ominaisiiden ID-koodi
-
LocationID (long int) - teon osaan mahdollisesti liittyvän paikan ID-koodi
-
Argument (long int) -teon osaan mahdollisesti liittyvä numeerinen argumentti
Items-taulun kentät
-
ID (long int, primary key) - esineen ID-koodi
-
Name (text 40) - esineen nimi (seikkailun luojien sisäiseen käyttöön)
-
Description (text 255) - esineen pelaajalle näkyvä kuvaus
-
PictureFile (text 40) - esineeseen mahdollisesti liittyvän kuvan tiedostonnimi
-
AdventureID (long int) - seikkailun, johon esine kuuluu, ID-koodi
-
DefaultLocationID (long int) - paikan, johon esine seikkailun alustuksessa asetetaan, ID-koodi
-
UserID (long int) - esineen luoneen käyttäjän ID
-
Hidden (long int) - epätosi (0) tai tosi (<>0). Jos tosi, niin esine piilotetaan pelaajalta (sitä ei tulosteta pelisivuille)
Properties-taulun kentät
-
ID (long int, primary key) - ominaisuuden ID-koodi
-
Name (text 40) - ominaisuuden nimi (seikkailun luojien sisäiseen käyttöön)
-
Description (text 255) - ominaisuuden pelaajalle näkyvä kuvaus
-
PictureFile (text 40) - ominaisuuteen mahdollisesti liittyvän kuvan tiedostonnimi
-
AdventureID (long int) - seikkailun, johon ominaisuus kuuluu, ID-koodi
-
DefaultValue (long int) - alkuarvo, johon ominaisuus seikkailun alustuksessa asetetaan
-
UserID (long int) - ominaisuuden luoneen käyttäjän ID
-
Hidden (long int) - epätosi (0) tai tosi (<>0). Jos tosi, niin ominaisuus piilotetaan pelaajalta (sitä ei tulosteta pelisivuille)
ItemLocations-taulun kentät
-
UserID (long int) - käyttäjän, jonka esineen paikka tietueessa määritellään, ID-koodi
-
ItemID (long int) - esineen, jonka paikka tietueessa määritellään, ID-koodi
-
LocationID - paikan, jossa esine sijaitsee, ID-koodi
PropertyValues-taulun kentät
-
UserID (long int) - käyttäjän, jonka ominaisuuden arvo tietueessa määritellään, ID-koodi
-
PropertyID (long int) - ominaisuuden, jonka arvo tietueessa määritellään, ID-koodi
-
Value (long int) - ominaisuuden arvo
LocationsBeen-taulun kentät
-
UserID (long int) - käyttäjän, jonka tietue määrittelee käyneeksi jossain paikassa, ID-koodi
-
LocationID (long int) - paikan, joka on määritelty käydyksi, ID-koodi
ActionsDone-taulun kentät
-
UserID (long int) - käyttäjän, jonka tietue määrittelee teon suorittaneeksi, ID-koodi
-
ActionID (long int) - teko, jonka tietue määrittelee suoritetuksi
-
Score (long int) - pistemäärä, joka on saatu tekoon mahdollisesti liitetystä esteestä
Pictures-taulun kentät
-
ID (long int) - kuvan ID-koodi
-
AdventureID (long int) - seikkailun, johon kuva liittyy, ID-koodi
-
FileName (text 100) - kuvan tiedostonnimi
-
UserID (long int) - kuvan järjestelmään siirtäneen käyttäjän ID