Logički model baze podataka za ankete
Wednesday, 25.03.2009 – Zidar
Ankete koje imaju ‘multiple choice’ pitanja su danas veome česte. Na svako pitanje nudi se N opcija od kojih učesnik ankete bira jednu. Broj opcija može biti različit od pitanja do pitanja. Neka pitanja zahtevaju jednostavni Da/Ne odgovor, a neka mogu imati i desetak opcija.
Najjednostavniji način da se dođe do valjanog modela je ER analiza. Počnimo opisom problema.
Kroz anketu želimo da postavimo odeđen skup pitanja učesnicima ankete. Ovo može da se kaže i drugačije (isto to samo malo drukčije, kako bi rekao Vuk Karadžić 😉 )
A) Anketa se sastoji od pitanja.
B) Učesnici u anketi odgovaraju na pitanja.
Iz ove dve rečenice počinjemo da crtamo ER dijagram.
Za rečenicu (A) imamo
Za rečenicu (B) imamo:
Ako spojimo rečenice (A) i (B) dobijamo ovakvu sliku:
Poslednja slika se lako prevodi u ovakav model:
Ovakav model omogućuje nam da:
1) Čuvamo više anketa u bazi podataka. Svaka anketa jeste jedan red u tabeli Ankete
2) Za svaku anketu definišemo proizvoljan broj pitanja, sa proizvoljno dugačkim tekstom. Pitanja koja se postavljaju u specifičnoj anketi čuvaju se u tabeli PitanjaAnkete.
U nenormalizovanim rešenjima, svako pitanje je jedna kolona u tabeli, koja se zove MojaVelikaAnketa. Dve ili više anketa sa različitim brojem pitanja u istoj tabeli nisu moguće. Tekst pitanja ne postoji u nenormalizovanom modelu. Tekst pitanja je u nazivu kolone. Ovo znači da ako radite web aplikaciju, tekst pitanja mora da bude hard kodiran na web stranici. Hard kodiranje nije dobra ideja, ni na kraći ni na duži rok.
Normalizovan model omogućuje nam da:
3) za svako pitanje čuvamo ponuđene opcije kao vrednosti, tako i tekst koji ide uz opcije.
Tako nešto u nenormalizovanom modelu ne postoji. Ponovo se opcije moraju hard-kodirati.
Dobar programer će lako napisati kod, koji čita iz normalizovanih tabela i generiše HTML za web stranicu. Vreme utrošeno za pisanje takvog koda je dobro utrošeno. Vreme utrošeno za ukucavanje pitanja i opcija u HTML editor ili neki XML fajl je bačeno vreme, jer je to fizički posao. Kad spomenusmo XML, mnogi će reći da se tekst pitanja i tekst opcija za ponuđene odgovore može čuvati u XML fajlovima. Tačno – može! Ali onda imate deo podataka u bazi, i deo u XML fajlovima, dve razdvojene celine koje treba održavati u vezi. To ne uspeva ni u Americi.
Normalizovani model omogućuje i druge stvari, koje se teško izvode u nenormalizovanom modelu. Na primer, svrha svake ankete jeste da se prebroje odgovori na pitanja, da se vidi koliko učesnika je izabralo opciju a, b ili c na pitanje 17. Normalizovani model to radi u jednom kveriju. Nenormalizovani model traži da se izvrši po jedan kveri za svaku kolonu. Naravno da dobri programeri mogu da očas posla naprave kod, koji trči kroz sve kolone u nenormalizovanoj tabeli i za svaku se onda dinamički sagradi SQL string, pa se to prosledi kroz ADO da server to izvrši. A rezultati se onda pakuju u višedimenzionalne nizove, pa se onda iz tih nizova nešto ispisuje na ekran. Ponovo glupo utrošeno skupoceno vreme. Rešenje koje sam opisao mogu da odrade samo veoma dobri programeri (nije šala, najozbiljnije je). Meni bi bilo strašno žao da izvršnom programeru plaćam skupu satnicu da bi mi on pisao potpuno nepotreban kod zato što dizajn baze podataka ni ne postoji.
Prelaz sa Ankete na na Testove
Ponudjeni model baze podataka za ankete lako postaje model za čuvanje podataka o školskim testovima. Test se od obične ankete razlikuje po tome što za svako pitanje postoji tačan odgovor . Samo jedna od opcija je tačna.
Ako dodate u tabeli PitanjaAnkete kolonu TacanOdgovor, int NOT NULL rešili ste problem čuvanja tačnog odgovora za pitanja. Onda je lako prebrojati koliko tačnih odgovora ima svaki učesnik ankete/testa. Pokušajte to da uradite u nenormalizovanom modelu. Nivo programerskog znanja je još viši nego za statističko prebrojavanje odgovora po opcijama.
6 Responses to “Logički model baze podataka za ankete”
Odličan tekst imenjače!
Ja bih tu napravio par tehničkih izmjena, ali se ne bi puno razlikovalo od tvog rješenja.
By Dejan on Mar 25, 2009
Sto se tice testova zar ne bi bilo lakse imat boolean vrijednost na PonudjeniOdgovori, time bi bio automatski pokriven i slucaj da je vise odgovora tacno. 🙂
Sve u svemu dobar tekst za uvod.
PS.
Interesantno je kako Crow’s Foot notacija nece da umre.
By Dorde on Mar 25, 2009
Bili mi netko moga napravit logicki model za bazu podataka na temu naplata autoceste, ja sam nesto pukusava pa nisam siguran jeli to ispravno. Treba mi za seminarski rad, moze li netko pomoci neka mi posalje na junkoba13@gmail.com, unaprijed se zahvaljujem. ps recimo ulazna naplatna postaj, izlazna postaja, da moze koristi neki jednokratni korisnik i neki preplatnik, evidencija zaposlenih, izdavanje racuna…..
By junkoba on May 28, 2009
Au, ja nisam ni znao da je ovaj tekst objavljen. Mislio sam da sam ga sacuvao kao draft. Cekao sam sam da dodam skripte za kreiranje primera i da pokazem neke kverije i tako to.
Nema veze, neka je objavljeno. Medjutim, moram da ukazem na gresku u dijagramu. Tabela “Odgovori ucesnika” ne valja. Ima jednu kolonu vise . Treba ignosrisati kolonu Opcija. Ovako kako je izpada da se za svakog ucesnika, za svakio pitanje pamte svi ponudjeni odgovori i da je onda jedan cekiran kao tacan. ne valja. Pamti se samo jedna odgovor, a taj mora biti iz skupa ponudjenih u tabeli PonudjeniOdgovori. I PK ne valja ovako kako je na slici. Svaki ucesnik, na svako pitanje moze da upise samo jedan odgovor. Proizilazi da je PK kombinacija (ANketa, Ucesnik, Pitanje) a ne (Anketa, Ucesnik, Opcija, Pitanje). Pogresna kombinacija dozvoljava da se svaki odgovor izabere, sto nije tacno.
Izvinjavam se za ovo, to je uradio Visio, preneo mi ceo PK iz tabela PonudjeniOdgovori a da nisam primetio. Visio to uradi i naknadno. Nist bolje od papira i olovke.
Ako imamo vise od jednog odgovora na pitanje, to je u stvari skup pitanja koja su Yes/No tipa, ali su na anketnom listu grupisana u pitanje tipa “Select all that applies” – “izaberi sve sto je tacno”. Negde na pocetku sam kazao da modeliramo strogo MC pitanja.
Neko je primetio ‘da crow’s foot nece da umre’. A zasto bi umrla? Meni je to veoma slikovito i jasno sta znaci i to mi je dovoljno dobro 🙂
By Zidar on Jun 2, 2009
@Zidar: Sorry, ja sam nasao tvoj tekst u draft listi, pa sam mislio da si umjesto “Publish” kliknuo na “Save Draft”. Znaci, greska je do mene. 🙂
Mozes sad naknadno editovati tekst i izmijeniti/dodati sta zelis, vidis da ima ljudi, kojima je tekst zanimljiv i koristan… Kamo srece, da ima vise ovakvih tekstova…
By Dejan on Jun 3, 2009
Nema problema, 🙂
Imam puno ideja i materijala, samo nije bilo vremena. Nadam se da ce sada biti malcice vise vremena. Treba da popravim ovaj clanak i da dopisem sta sam naomio, neke priemre i tako.
Pokusacu da cesce postujem krace stvari, koje ne zahtevaju toliko vremena.
Sve najbolje 🙂
By Zidar on Jun 3, 2009