Hei,
tässä ohjelmoin huvikseni erästä tietokanta sovellusta. Tarkoituksenani on oppia, ei copy/pastea koodia. Kysymykseni kuuluu:
Käytössä MySQL kanta. Tarkoitus rakentaa ns. "kyselijä", joka kysyy kysymyksiä (kysymykset tallennettu tietokantaan) ja tallentaa vastaukset tietokantaan. Pulmallisen tilanteesta tekee sen että riippuen vastaukestasi, tulisi seuraava kysymys. Vaikea selittää.. Eli jos ohjelma kysyy: Onko kivaa? <- Jos vastaat ei, ohjelma kysyisi Miksi? Ja jos vastaisit ensimmäiseen kysymykseen Kyllä, niin ohjelma kysyisi että Kuinka kauan on ollut kivaa?
Tälläistä tietokantaa olen miettinyt tähän:
CREATE TABLE kyselyt ( id int(10) auto_increment, knimi varchar(100) NOT NULL, //Kyselyn nimi PRIMARY KEY(id) )TYPE=MyISAM; CREATE TABLE kyselyt_kysymykset ( id int(10) auto_increment, kid int(10) NOT NULL, // kyselyt Kysely ID ke int(1) NOT NULL default '0', //Onko Kyllä / Ei vastaus kysymys text, PRIMARY KEY(id) )TYPE=MyISAM; CREATE TABLE kyselyt_vastaus ( id int(200) auto_increment, kkid int(10) NOT NULL, // kyselyt_kysymykset ID vastaus text, PRIMARY KEY(id) )TYPE=MyISAM; CREATE TABLE kyselyt_tapaus ( id int(200) auto_increment, kyid int(10) NOT NULL, // kyselyt_kysymykset ID vaid int(200) NOT NULL, // kyselyt_vastaus kayttaja varchar(15) NOT NULL, PRIMARY KEY(id) )TYPE=MyISAM;
Onkohan tämä fiksuin tapa ratkaista asia?
Mitäs vaikeaa tuossa. Laitat vaan sinne kysymyksen tietoihin ohjeet ohjelmalle minne edetään jos kysymyksen vastaus on joko a, b tai c.
Asia erikseen sitten kysymykset jotka arvotaan satunnaisesti jollekin vastaajista.
lapm kirjoitti:
Mitäs vaikeaa tuossa. Laitat vaan sinne kysymyksen tietoihin ohjeet ohjelmalle minne edetään jos kysymyksen vastaus on joko a, b tai c.
Asia erikseen sitten kysymykset jotka arvotaan satunnaisesti jollekin vastaajista.
Ei ei, kysymyksiä ei arvota käyttäjän mukaan vaan ne tulevat vastauksen mukaan. Eli jos vastasit kysymykseen 1 vastauksen b on seuraava kysymys eri kuin se mitä olisi tullut jos olisit vastannut kysymykseen 1 vastauksen a.
Kannattaako tuo PHP puoli toteuttaa jotenkin seuraavasti:
Teen funktion joka laskee kuinka monta kysymystä per kysely on ja sitä mukaa näyttää kysymyksiä kun niitä tulee, esim.
Kysymysy 1:
Jos vastaat a -> 1.1
Jos vastaat b -> 1.2
Kysymys 1.1:
Jos vastaat a -> 1.1.1
Jos vastaat b -> 1.1.2
Kysymys 1.2:
Jos vastaat a -> 1.2.1
Jos vastaat b -> 1.2.2
jne.
PHP-skriptin täytyy hakea ennen kysymyksen näyttämistä kaksi asiaa:
- näytettävä kysymys
- mihin kysymykseen siirrytään kustakin vastauksesta
Nämä tiedot saadaan tietokannasta kysymyksen numeron perusteella.
Jos kysymykset ovat pelkkiä kyllä/ei-kysymyksiä, ne voi tallentaa näin:
tunnus kysymys kyllä ei ------------------------------------ 1 ??? 2 3 2 ??? 4 5 3 ??? 6 2
Tässä esim. kysymysten polku voi olla 1->2->5 (vastaukset kyllä, ei) tai 1->3->2->4 (vastaukset ei, ei, kyllä). Tarvittaessa samaan kysymykseen voi siis päätyä useaa reittiä. Jos sama kysymys voi esiintyä monessa kohdassa, mutta siitä pitää jatkaa eri tavalla kysymyshistoriasta riippuen, sama kysymys täytyy tallentaa moneen kertaan tietokantaan eri jatkokysymyksillä.
Jos kysymykseen voi vastata monella tavalla, äskeinen tietokantarakenne toimii niin kauan, kuin vastauksia on hyvin rajallinen määrä (esim. aina enimmillään neljä: a, b, c ja d), mutta joustavampi ratkaisu on tallentaa kukin vastaus ja siirtymä omalle rivilleen:
tunnus vastaus siirto ------------------------------ 1 kyllä 2 1 ehkä 3 1 tuskin 4 1 ei 5 2 usein 6 2 joskus 7 2 harvoin 8
Tällöin toiseen tauluun tallennetaan vielä varsinaiset kysymykset:
tunnus kysymys -------------------- 1 ??? 2 ???
Tämä on yksi mahdollinen ratkaisu, mitään yleispätevää toteutustapaa tuskin onkaan olemassa. Tässä ongelmaksi voi tulla samojen kysymysten suuri määrä, jos esim. kysymyssarja on aina samankaltainen, mutta aiemmat kysymykset aiheuttavat siihen pieniä muutoksia. Mutta jos kysymyksiin pitää liittää monimutkaisia riippuvuuksia, niitä ei välttämättä kannata säilyttää SQL-tietokannassa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.