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.
Objavljeno u: Best practice, Modelovanje podataka, MS Access, MS SQL Server, Opšta teorija, SQL, Uncategorized | Ukupno komentara: 6 »