Tietokantasovellus: drinkkiarkisto Harjoitustyön määrittelydokumentti Henrik Mansnerus Helsinki 20.8.2010 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
Sisällysluettelo 1 Johdanto...3 1.1 Järjestelmän tarkoitus...3 1.2 Toimintaympäristö...3 1.3 Rajaukset...3 1.4 Toteutusympäristö...4 2 Yleiskuva järjestelmästä...5 2.1 Sidosryhmäkaavio...5 2.2 Käyttäjäryhmät...5 3 Käyttötapaukset...6 3.1 Anonyymit...6 3.2 Rekisteröityneet...6 3.3 Ylläpitäjät...6 3.4 Tarkennusta...6 4 Järjestelmän tietosisältö...7 4.1 Drinkkiviite...7 4.2 DrinkkiID...7 4.3 Käyttäjä...8 4.4 Ehdotus...8 5 Käyttöliittymän hahmotelma...9 6 Relaatiotietokantakaavio...10 6.1 Create table -lauseet...10
1 Johdanto 1.1 Järjestelmän tarkoitus Tarkoituksena on kehittää drinkkiarkisto, jonne ihmiset voivat lisätä reseptejä jo kannassa olevien jatkoksi. Käyttäjät voivat luonnollisestikin myös selata reseptejä ja hakea niitä monipuolisilla hakuehdoilla. Tämä olisi luultavasti jokin City-lehden sivuilta löytyvä juttu tms. Oikeassa elämässä tämä voisi saada suhteellisen isojakin käyttäjämääriä, jolloin toteutukseen pitäisi kiinnittää erityistä huomiota. Jollekin firmalle tämä voisi olla brändikuvaa vahvistava juttu. Tai sitten jonkun yksityishenkilön hyvää hyvyyttään tekemä sivu ja silloin olisi todennäköisesti tarkoitus saada hieman mainostulojakin. 1.2 Toimintaympäristö Sen verran yksinkertaisesta sivustosta on kyse, että tähän riittää laitevaatimukseksi tietokone/kännykkä/pda, jossa on webbiselain. Varsinkin kun nyt ei tehdä mitään AJAXia tai muuta sellaista. 1.3 Rajaukset Saatan jättää tiedostosta lukemisen toteuttamatta, muuten olisi tarkoitus tehdä järjestelmästä suhteellisen kattava. Miettiessäni palvelun rakennetta mieleeni juolahti toteuttaa kaikenlaisia automaattisia drinkkiehdotusten tarkistuksia manuaalisen työn minimoimiseksi, mutta epäilen sen kasvattavan työn laajuutta liiallisesti. Ajattelin myös vaihtoehtoisten sekoitussuhteitten mahdollistamista. Ajattelin jonkinlaista koodia Drinkkiviite-tauluun, jossa olisi talletettuna eri ainesten tilavuusprosentit järjestyksessä Aines1, Aines2, Tämänkään toteuttamisesta minulla ei ole vielä mitään hajua. Jos vaihtoehtoisuudet jätetään välistä, ainesosien tallettamisessa raakoina stringeinä kuhunkin drinkkiin erikseen liittyen helpottaisi tietenkin toteutusta. Tämän voisi varmaankin toteuttaa optimaalisemmin. Tietokannasta tulee toki suhteellisen pieni, mutta potentiaalinen suuri käyttäjämäärä tällaisella palvelulla ehkä muuttaa tilannetta?
1.4 Toteutusympäristö Toteutan sovelluksen Windows-ympäristössä ja käytän tarvittaessa laitoksen järjestelmiä etäyhteyden ylitse. Järjestelmä tulee käyttämään PHP:tä sivujen tuottamisessa ja lomaketietojen välityksessä, tietokanta on PostgreSQL. Todennäköisesti käytän vaivan helpottamiseksi Atomik-kehystä, joka sisältää luullakseni myös rajapinnan PHP:n ja PostgreSQL:n välille.
2 Yleiskuva järjestelmästä 2.1 Sidosryhmäkaavio 2.2 Käyttäjäryhmät Anonyymit Rekisteröityneet Ylläpitäjät
3 Käyttötapaukset 3.1 Anonyymit Rekisteröityminen palveluun Drinkkien haku ja selaus Drinkin ehdotus Salasanan resetointi 3.2 Rekisteröityneet Sisään-/uloskirjautuminen Drinkkien haku ja selaus Drinkin ehdotus Salasanan vaihto 3.3 Ylläpitäjät Sisään-/uloskirjautuminen Drinkkien haku ja selaus Drinkin lisääminen (tekn. toteutus mahdollisesti ehdottamisen kautta) Drinkin hyväksyminen Käyttäjän bannaus Drinkin editointi 3.4 Tarkennusta Haku ja selaus ovat melko triviaaleja, kuten myös sisään- ja uloskirjautuminen (normaali toteutus evästeiden avulla) sekä käyttäjän bannaus, drinkin editointi, salasanan vaihto/resetointi ja rekisteröinti. Drinkkiä voi kuka tahansa ehdottaa. Anonyymien ja rekisteröityneiden käyttäjien ehdotusten erotus ja maineen käyttöönotto tehnee webmasterin työn hieman helpommaksi drinkkien hyväksymisen osalta, varsinkin mikäli palvelusta tulee suosittu.
4 Järjestelmän tietosisältö 4.1 Drinkkiviite Attribuutti Arvojoukko Kuvailu Nimi String Useiden mahdollisten saman drinkin nimien toteuttamista varten. Tämä tietokohde on olemassa monien saman drinkin eri nimien kätevää toteuttamista varten. Yksi drinkkiviite liittyy tasan yhteen uniikkiin drinkkiin (DrinkkiID) ja triviaalisti yhteen drinkkiin voi liittyä monta drinkkiviitettä. Drinkkiviite tunnistuu nimen ja DrinkkiID-yhteyden perusteella. 4.2 DrinkkiID Attribuutti Arvojoukko Kuvailu Surrogate int Drinkin mahdollinen moninimisyys vaatii keinoavaimen käyttöä tunnistamiseen. Juomalaji String Triviaali. AltJuomalaji String Tarpeellinen, mikäli jonkin drinkin voidaan katsoa kuuluvan moneen lajiin. Aines1 String Suppean toteutusmallin ratkaisuni drinkkikohtaisten ainesten tallettamiseen Aines2 String ja erityisesti sekoitussuhteiden yksinkertaiseen implementoimiseen... Aines10 String
Tämä kohde sisältää kunkin uniikin drinkin tiedot. Vaihtoehtoisen juomalajin tarpeellisuus on minulle vielä drinkkejä paremmin tuntematta arvoitus. Drinkkiin liittyy tasan yksi käyttäjä (drinkin ehdottaja/lisääjä). 4.3 Käyttäjä Attribuutti Arvojoukko Kuvailu Surrogate int Keinoavaimella koodataan, onko käyttäjä anonyymi, admin vai tavallinen. Nimi String Muille näkyvä käyttäjänimi. Salasana-hash heksaluku Asiakkaan tietoturvasta tulee huolehtia. Sähköposti String Triviaali. Sukupuoli int Periaatteessa tämähän olisi 2-bittinen arvo. Ikä int Ja tämä 7-bittinen. Maine int +1 hyv. ehdotuksesta, rekisteröityneet voivat antaa vandaalille -1 per drinkki Melko triviaali. Rekisteröityminen tekee palvelun käytön kiinnostavammaksi ja parantaa myöhemmin integraatiota sosiaalisiin medioihin. Käyttäjää kohden voi olla monta drinkkiä ja ehdotusta. 4.4 Ehdotus Attribuutti Arvojoukko Kuvailu Surrogate int Keinoavain käytössä kärsimättömien käyttäjien tuplapainallusten varalta. Nimi String Tämä attribuutti kopioidaan Drinkkiviite-tauluun hyväksymisen jälkeen. Juomalaji String Samalla loput attribuutit kopioidaan DrinkkiID-tauluun, keinoavain poislukien. AltJuomalaji String Aines1 String.. Aines10 String Kun uusien drinkkien ehdotus on kaikille sallittua, tällainen väliaikaisrakenne lienee mielekkäin ratkaisu. Sisältää siis kaikki drinkkiin ja drinkkiviitteeseen tarvittavat attribuutit.
5 Käyttöliittymän hahmotelma Aloitussivuun tulee sisältymään haku ja totta kai sisään- ja uloskirjautuminen. Kaavion moniriviset sivut viittaavat siihen, että kyseisestä sivusta on eri versiot mainituille käyttäjäryhmille. Aloitussivun toiminnallisuus sisältyy kaikkiin muihin sivuihin.
6 Relaatiotietokantakaavio 6.1 Create table -lauseet CREATE TABLE Drinkkiviite ( Nimi varchar(50) PRIMARY KEY, Surrogate SERIAL PRIMARY KEY, FOREIGN KEY (Surrogate) references DrinkkiID (Surrogate) ); CREATE TABLE DrinkkiID ( Surrogate SERIAL PRIMARY KEY, Juomalaji varchar(20) NOT NULL, Aines1 varchar(20) NOT NULL, Aines2 varchar(20) NOT NULL, Aines3 varchar(20) NOT NULL, Aines4 varchar(20) NOT NULL, Aines5 varchar(20) NOT NULL, Aines6 varchar(20) NOT NULL, Aines7 varchar(20) NOT NULL, Aines8 varchar(20) NOT NULL, Aines9 varchar(20) NOT NULL, Aines10 varchar(20) NOT NULL, Käyttäjä varchar(20) NOT NULL, FOREIGN KEY (Käyttäjä) references Käyttäjä(Surrogate) );
CREATE TABLE Käyttäjä ( Surrogate SERIAL PRIMARY KEY, Nimi varchar(20) NOT NULL, SalasanaHash char(32) NOT NULL, --miten saa tyypiksi heksaluvun? Sähköposti varchar(40) NOT NULL, Sukupuoli boolean, --sovinistinen tulkinta, voi olla myös NULL Ikä int NOT NULL, Maine int NOT NULL ); CREATE TABLE Ehdotus ( Surrogate SERIAL PRIMARY KEY, Nimi varchar(50), Juomalaji varchar(20) NOT NULL, Aines1 varchar(20) NOT NULL, Aines2 varchar(20) NOT NULL, Aines3 varchar(20) NOT NULL, Aines4 varchar(20) NOT NULL, Aines5 varchar(20) NOT NULL, Aines6 varchar(20) NOT NULL, Aines7 varchar(20) NOT NULL, Aines8 varchar(20) NOT NULL, Aines9 varchar(20) NOT NULL, Aines10 varchar(20) NOT NULL Käyttäjä varchar(20) NOT NULL, FOREIGN KEY (Käyttäjä) references Käyttäjä(Surrogate) );