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.:

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.:

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ä.

Looginen rakenne

Taulukko tietokannan taulujen kenttien sisällöstä on liitteenä.

Tietorakenteen keskeisimmät entiteetit (ja tietokannan taulut) ovat:

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:

E-R-Kaavio.

PostScript-versio:

Tietokannan implementaatio tauluineen, kenttineen ja relaatioineen.

Tietotaulujen erityisiä piirteitä

- Käyttäjän nimi on unique

- Käyttäjäryhmän nimi on unique

- Seikkailun nimi on unique

- Paikkojen nimet yhdessä seikkailussa ovat unique

- Esineen nimi yhdessä seikkailussa on unique

- Ominaisuuden nimi yhdessä seikkailussa on unique

Tietokantaliittymämoduuli (Database Interface)

Yleistä

Tietokantaliittymämoduuli on ohjelmiston osa, jota kautta muut ohjelman osat kommunikoivat tietovaraston kanssa. Kaikki tietovarastossa oleva tieto kulkee tietokantaliittymän kautta.

Tietokantaliittymän antamia etuja ohjelmalle ovat mm.:

- Tietokantamoottori on helppo vaihtaa

- Myöskin ei-SQL -pohjainen tietokantamoottori mahdollinen

- Tietokannan taulujen, kenttien jne. nimet helppo vaihtaa

- Tietorakennetta voidaan muuttaa, jopa tauluja jakaa, yhdistää jne.

- Vähemmän virhemahdollisuuksia

Tietokantaliittymämoduulin eräänä tarkoituksena on tarjota muille ohjelman osille "käsitetason" liittymä tietokantaan. Tämä tarkoittaa sitä, että muu ohjelma kommunikoi tietovaraston kanssa tavalla, joka ei ota kantaa

Tässä luvussa kuvataan tietokantamoduulin rakennetta, keskeisiä suunnittelunäkökohtia sekä ongelmakohtia.

Proseduurit

Yksinkertaiset hakuoperaatiot, jotka etsivät long int -tyyppisen pääavaimen mukaisesti halutun tyyppistä tietoa:

Muita hakufunktioita luodaan tarpeen mukaan, esim.

Tällä funktiolla voitaisiin esimerkiksi etsiä käyttäjän nimeä vastaava käyttäjän ID, jolloin kutsu olisi esim.

EntityName- (entiteetti) ja AttributeName- (attribuutti) parametrit voidaan muuntaa tietokannan tauluja ja kenttiä vastaaviksi erityisen muunnostaulukon kautta.

Tällä tavalla erilaisten tarvittavien proseduurien määrä ei nouse erityisen suureksi, sillä jokainen funktio on monikäyttöinen. Funktioita tarvitaan kuitenkin erilaisia riippuen mm. siitä, etsitäänkö pääavaimen perusteella, minkä tyyppisen arvon tai arvoja funktio palauttaa ja minkä tyyppinen on tai tyyppisiä ovat hakuarvot.

Tietojen päivitysoperaatiot (palauttavat muuttamiensa tietueiden lukumäärän), esim.:

Tietojen lisäysoperaatioiden funktiot joudutaan tekemään jokaiselle entiteettityypille erikseen. Esim.

Tietojen poisto-operaatioiden funktiot ovat kuten hakuoperaatioissa. Ne palauttavat kuitenkin poistamiensa tietueiden lukumäärän. Esim.

Tietojen päivittäminen

Tietojen päivittämisessä yleisin operaatio on jonkin tietyn entiteetin attribuutin muunto, mutta myös useiden entiteettien muutokset ovat mahdollisia. Entiteetin attribuuttia päivitettäessä täytyy tutkia, että eheys ja muut vaatimukset täyttyvät. Primary keytä ei voi päivittää.

Tietojen (entiteettien) lisäys

Lisättäessä tietueita ainakin pakolliset attribuutit tulee täyttää. Tietokantaliittymämoduuli huolehtii itse perusentiteettien ID-kenttien laskurista. Perusentiteetin lisäys palauttaa uuden entiteetin ID-arvon onnistuessaan. Entiteettiä lisättäessä tarkistetaan myös haluttujen attribuuttien yksikäsitteisyys ja muita mahdollisesti asetettuja ehtoja.

Tietojen (entiteettien) poisto

Entiteettien poistossa yleisin operaatio on jonkin tietyn entiteetin poisto, mutta myös useiden entiteettien poistot ovat mahdollisia. Jokaisen poiston yhteydessä täytyy tarkistaa, ettei tietokannan eheys rikkoonnu. Toisin sanoen, kaikki taulut joista on relaatio poistettavan entiteetin tauluun, täytyy tutkia. Relaatiossa olevissa tauluissa ei saa olla relaatiota poistettavana olevaan entiteettiin.

Liite: Tietokannan taulujen kenttien kuvaukset.

TableFieldTypeSizeDescription
ActionConditionsIDNumber (Long)4Unique identifier
ActionConditionsArgumentNumber (Long)4Numerical argument for user property tests
ActionConditionsLocationIDNumber (Long)4Meaning depends on action condition type
ActionConditionsPropertyIDNumber (Long)4Meaning depends on action condition type
ActionConditionsItemIDNumber (Long)4Meaning depends on action condition type
ActionConditionsTypeNumber (Double)8Item carried, item not carried, property greater than etc.
ActionConditionsActionIDNumber (Long)4Action ID of the condition (relation to Action)
ActionPartsIDNumber (Long)4Unique identifier
ActionPartsItemIDNumber (Long)4Relation to Items-table. Meaning depends on action part type
ActionPartsArgumentNumber (Double)8Numerical argument for user property using action parts
ActionPartsLocationIDNumber (Long)4Relation to Locations-table. Meaning depends on action part type
ActionPartsPropertyIDNumber (Long)4Relation to Properties-table. Meaning depends on action part type
ActionPartsTypeNumber (Long)4Type of the action: (MOVE, GET, DROP, SETPROP, INCPROP, DECPROP, MOVEITEM)
ActionPartsActionIDNumber (Long)4
ActionsObstacleOptionsText10Options for the obstacle
ActionsSuccessMessageText255Message to the player, if the action was succesful
ActionsBeforeMessageText255Message to the player, before the action is done (before obstacle!)
ActionsObstacleClassText10Type of the obstacle (0=none)
ActionsDescriptionText50Description of the action shown to players
ActionsLocationIDNumber (Long)4Location, at where the action is available
ActionsIDNumber (Long)4ID of the Action
ActionsNameText10Internal name of the action for the game writers
ActionsDoneUserIDNumber (Long)4
ActionsDoneActionIDNumber (Long)4
AdventuresNameText20Name of the adventure
AdventuresIDNumber (Long)4
AdventuresDescriptionText255Description of the adventure
AdventuresFirstLocationIDNumber (Long)4First location of the adventure
GroupsIDNumber (Long)4
GroupsNameText20Name of the user group
GroupsPermissionsNumber (Long)4Permissions of users of this group (e.g. play/write/teacher/administrate)
ItemLocationsLocationIDNumber (Long)4
ItemLocationsUserIDNumber (Long)4
ItemLocationsItemIDNumber (Long)4
ItemsDefaultLocationIDNumber (Long)4Location of the item at the startup
ItemsIDNumber (Long)4ID of the Item
ItemsAdventureIDNumber (Long)4Adventure to which the object belongs to
ItemsNameText20Name of the Item
ItemsPictureFileText20Picture file name of the Item (not necessary)
ItemsDescriptionText255Description of the item
ItemsOwnerGroupIDNumber (Long)4Group that has the modify permissions for this object
LocationsAdventureIDNumber (Long)4Adventure to which the location belongs
LocationsIDNumber (Long)4ID of the Location (0=Nowhere, 1=Carried)
LocationsNameText10Name of the location
LocationsNoItemsTextText255A text, that is displayed if there is no items in the location (e.g. The trashbin is empty)
LocationsOwnerGroupIDNumber (Long)4Group that has the modify permissions for this object
LocationsHeaderText50Longer name of the location
LocationsBeenUserIDNumber (Long)4
LocationsBeenLocationIDNumber (Long)4
PropertiesPictureFileText20Picture file name of the property (not necessary)
PropertiesDefaultValueNumber (Long)4Default value of the property in the adventure
PropertiesOwnerGroupIDNumber (Long)4
PropertiesDescriptionText255Description of the property
PropertiesAdventureIDNumber (Long)4Adventure to which the object belongs to
PropertiesIDNumber (Long)4ID of the property
PropertiesNameText20Name of the property
PropertyValuesUserIDNumber (Long)4
PropertyValuesValueNumber (Long)4Current value of the property
PropertyValuesPropertyIDNumber (Long)4
UsersGroupIDNumber (Long)4ID of the User's group
UsersLocationIDNumber (Long)4Current location of the User
UsersPasswordText10Password of the User (not crypted, since no need)
UsersLastActionTimeDate/Time8Date/Time of the last action of the user
UsersNameText20Name of the User
UsersIDNumber (Long)4ID of the User