Kako modelirati i pospremiti hrpu user-related podataka?

pozdrav,

planiram s prijateljem raditi nekakvu web stranicu za učenje japanskih kanji znakova i pomalo kako razmišljam o tome, shvaćam da nemam jasnu viziju kako ću pospremiti sve podatke vezane za korisnike jer se nisam nikada susreo s nečim tako (relativno) složenim… sve što sam radio vezano uz baze i pospremanje podataka su bile jednostavnije stvari gdje nisam morao razmišljati o ovako nečemu.

podaci o svakom pojedinom useru će biti na primjer:

  • za nekoliko tisuća kanji simbola pospremiti podatke o - količini točnih odgovora, količini netočnih odgovora, najdužem streaku odgovora (uzastopni točni odgovori), duljini trenutnog streaka, da li je neki znak uopće otključan (jer bi se ovisno o uspješnosti trebali otključavati novi znakovi za vježbanje)…

  • onda iste te informacije za vokabular (to su recimo kombinacije od nekoliko znakova koji tvore neku logičku cjelinu kao na primjer znakovi za “big + person = adult” jer se u japanskom tako slažu riječi… i sad opet za sav taj vokabular ista ova priča oko količini točnih i netočnih odgovora i svega ostalog. a tog vokabulara će biti više nego samih kanji znakova…

  • onda na primjer - otključani achievementsi, reputacija i neke ovako uobičajene informacije vezane za usera…

onda druga stvar - informacije o svakom znaku posebno. na primjer, svaki znak bi trebao sadržavati:
sam znak,
opis značenja znaka,
izgovor,
drugi izgovori (jer ovisno o situaciji/kontekstu gdje se koristi, ista značenja imaju drugačije izgovore odnosno u principu se radi o totalno drugim riječima s istim značenjem),
mnemonički opis koji pomaže pri pamćenju značenja znaka,
mnemonički opis koji pomaže pri pamćenju izgovora znaka,
alternativna značenja,
i sl…

da li ovo uopće pospremati u bazu ili ih pohranjivati kao XML fileove u odvojenom folderu budući da to ne bi trebalo biti nešto što će se dinamički previše mijenjati?

meni se sada postavlja pitanje - kako uopće kvalitetno izmodelirati te sve podatke i kako ih i gdje pospremiti? da li koristiti neku standardnu bazu poput mysql-a ili nešto naprednije poput postgre-a? ili nešto poput couchdb-a ili mongodb-a? pospremiti sve lokalno u json ili nešto slično pa onda taj json serijalizirati i tako direktno grunut u bazu? tu mi se postavlja pitanje koliko često updateati podatke jer ako ću gurati cijeli json u bazu, da li to znači da nakon svakog klika kada se neka vrijednost (recimo nekakav broj točnih odgovora promijeni) da moram svaki put taj jedan ogromni json gurat u bazu i updateat ju (to mi se čini kao overkill)? ili to razlomit na recimo da se mora dogodit makar 5-10 promjena da bi se sama baza updateala (tu mi se opet javlja problem - a što ako user u određenom trenutku jednostavno odluči stisnut “x” i zatvorit stranicu, kako tu spriječiti da se podaci izgube?)?

tona je pitanja, a ja sam totalno clueless oko ovoga… ako imate kakvu literaturu ili link za preporučit što bih uopće trebao proučiti vezano uz ovu tematiku, ili ako imate konkretne prijedloge, koji su uopće pristupi ovim problemima i kako se rješavaju, nekakvi best practices ili nešto… bio bih vrlo zahvalan.

ako nešto nisam dovoljno dobro objasnio, recite pa ću se potrudit bolje objasniti.

hvala =)

Ti trebaš izraditi skup procedura ili razreda (ne znam hoćeš li koristiti proceduralnu ili OO-paradigmu ili štogod da hoćeš) koje ćeš u svojem programu koristiti za pristup traženim podacima. Nakon toga implementiraš te procedure/razrede kao “dummyje”: primjerice, ako imaš razred “Korisnik”, koji ima proceduru “ImeKorisnika”, tu proceduru implementiraš tako da ona uvijek vraća neko fiksno ime, recimo “Marko”. Procedura “PrezimeKorisnika” vraća “Polo”. Taj skup procedura/razreda je sloj za pristup podacima. Izgled/dizajn tih procedura/razreda je podatkovni model onakav kakvog koristi tvoj program. Tijekom izrade programa mijenjaš, dorađuješ sloj za pristup podacima, obraćajući pri tome pažnju koje podatke stvarno koristiš na svakom mjestu (web-stranici), nastojeći da se i to reflektira i na dizajnu samog sloja (npr. podaci o odgovorima ti nisu potrebni na stranici gdje korisnik konfigurira svoju e-poštu, pa će se to reflektirati i u dizajnu).

Onda implementiraš te “dummy” procedure na koji god način želiš ili daš nekom drugom da ti implementira. A ako se pokaže lošim, implementiraš taj sloj opet na drugi način. Zapravo, to je jedini način da podržiš različite “backendove” u svom programu i učiniš ga na taj način i prilagodljivim.

znači u principu bi trebao stvari razbiti na cjeline tipa: osnovni user-podaci, podaci o uspjehu kod znakova, podaci o uspjehu kod vokabulara, itd. - i onda napraviti metode za posebno svaki od tih podskupova podataka. i ako u frontendu recimo koristim json - onda bi cijeli jedan takav json objekt koji predstavlja jedan podskup podataka trebao pospremiti u bazu i vraćati nazad po potrebi? to je otprilike ono što si želio reći?

tako nekako sam otprilike i mislio da bi trebalo, ali budući da se radi o dosta podataka (ili je to samo za moj pojam podosta (?), ne znam ni procijeniti da li se tu radi o zbilja velikoj ili nekoj umjerenoj količini podataka koja bi ili ne bi trebala predstavljati problem), nekako mi je u glavi cijelo vrijeme da bi to mogao postati problem što se tiče performansi.

u svakom slučaju, hvala na odgovoru.

Ja ti nisam rekao da bi trebao podskup podataka držati kao JSON i pospremiti u bazu. Možeš ih ti pospremati kao datoteke, bez upotrebe baze. Možeš ih držati u XML-u i spremati u bazu ili datoteku. A možeš napraviti relacioni model i koristiti bazu kako spada. To je totalno irelevantno. Ja sam ti predložio da izradiš posebni podskup procedura za pristup podacima koje će koristiti tvoj program. A implementaciju tih procedura onda možeš napraviti danas ovako, a sutra promijeniti onako – kada sam vidiš što ti je i zašto bitno.