Kuinka hakea "ei merkattua" dataa tietokannasta parhaiten?

Liittynyt
17.10.2016
Viestejä
486
Minulla on tekeillä simppeli sovellus, jossa käyttäjältä kysytään satunnainen kysymys, joka haetaan tietokannasta. Mikä olisi paras tapa tai mikä on yleinen tapa, jossa samaa kysymystä ei esitetä kahta kertaa samalle käyttäjälle? Haluaisin kysymysten olevan randomeita joten alusta asti ID kerrallaan ei olisi kiva ratkaisu koska kaikki käyttäjät saisi saman kysymysjärjestyksen.
 
Hei,

Yksi vaihtoehto voisi olla, että sinulla on yhdessä taulussa kysymykset ja attribuutit esim. Kysymys_ID, Kysymys Vastaus.
Toinen taulu on kysytyistä kysymyksistä, jonka attribuutit olisi, Kysymys_ID, Käyttäjä_ID ja käyttäjän vastaus / vastasiko oikein / väärin.

Kun esität kysymystä käyttäjälle, tarkistat ensin toisesta taulusta, onko tämä arvottu kysymys_id jo kysytty tältä käyttäjältä.
 
Ja jos riittää, että saman session aikana ei tule samaa kyssäriä kahdesti, niin tallennat jo näytetyt kysymykset vain sessioon käyttäjälle. Tohon random sampleen on kaikenlaisia tapoja. Joko pidät kirjaa arvotuista ja arvot uuden kun tarvitsee (ei tehokas kun se arvottujen määrä on lähellä koko määrää). Riippuen kielestä, tuota ei edes tarvitse tehdä itse:


Tai sitten teet itse:


Riippuu tosiaan tilanteesta, kuinka hienosti tämä kannattaa ratkoa.
 
Hei,

Yksi vaihtoehto voisi olla, että sinulla on yhdessä taulussa kysymykset ja attribuutit esim. Kysymys_ID, Kysymys Vastaus.
Toinen taulu on kysytyistä kysymyksistä, jonka attribuutit olisi, Kysymys_ID, Käyttäjä_ID ja käyttäjän vastaus / vastasiko oikein / väärin.

Kun esität kysymystä käyttäjälle, tarkistat ensin toisesta taulusta, onko tämä arvottu kysymys_id jo kysytty tältä käyttäjältä.
Mietin tätä kanssa, mutta ongelmia muodostuu jos käyttäjä on vastannut esim 90% kysymyksistä ja kysymyksiä on esim 1000 yhteensä. Randomilla aika pieni todennäköisyys osua ei vastattuun ja voi jäädä hakulooppiin pitkäksi aikaa.

Mulla on jo nyt eri taulu joka pitää kirjaa vastatuista kysymyksistä, tallentamalla vastaajan ja kysymyksen IDn sinne.
 
Ja jos riittää, että saman session aikana ei tule samaa kyssäriä kahdesti, niin tallennat jo näytetyt kysymykset vain sessioon käyttäjälle. Tohon random sampleen on kaikenlaisia tapoja. Joko pidät kirjaa arvotuista ja arvot uuden kun tarvitsee (ei tehokas kun se arvottujen määrä on lähellä koko määrää). Riippuen kielestä, tuota ei edes tarvitse tehdä itse:


Tai sitten teet itse:


Riippuu tosiaan tilanteesta, kuinka hienosti tämä kannattaa ratkoa.
Kiitos. Perehdyn tuohon ja kerron miten kävi.

Tuossa tosiaan vois olla, että session alussa haetaan yhdellä tietokantahaulla kaikki kyseisen käyttäjän vastatut kysymykst ja tallennetaan ne taulukkoon. Sitten käytetään lodashin funktiota, joka hakee aina uniikin numeron kyseisestä taulusta ja tehdään tietokantahaku tämän IDn avulla.
 
Select kysymystauluun joinilla käyttäjältä kysyttyihin kysymyksiin käänteisenä, order by tietokannan random-funtiolla ja rajoitat kyselyn palauttamaan vain yhden rivin (limit 1, fetch 1, tjsp).
 
Select kysymystauluun joinilla käyttäjältä kysyttyihin kysymyksiin käänteisenä, order by tietokannan random-funtiolla ja rajoitat kyselyn palauttamaan vain yhden rivin (limit 1, fetch 1, tjsp).
Toimii tällä! Hakee kaikki mihin ei ole vastattu.

SELECT * FROM Questions JOIN AnsweredQuestions ON NOT Questions.ID = AnsweredQuestions.QuestionID
 
SQL:lla voi lisätä sen satunnaisuuden lisäksi, ellet lisännyt jo. Tietenkin voit hakea useamman kysymyksen yhden sijasta samalla, jos siihen on tarve.

 

Statistiikka

Viestiketjuista
261 816
Viestejä
4 548 227
Jäsenet
74 849
Uusin jäsen
Pizzapäivä123

Hinta.fi

Back
Ylös Bottom