[ Zidar @ 29.08.2006. 15:06 ] @
Po ugledu na top temu Teaorija vs Praksa, predlazem da odradiomo jos jedan projekat za primer. Ovoga puta nesto sto nije tako svakodnevno kao sto su razna poslovna knjigovodstva. Treba nam nesto sto verovatno nismo radili. Ovako: moji klinci vazdan igraju fudbal ili hokej po nekakvim amaterskim ligama. Igraju se utakmice, sa sudijama, priakzuju se tabele svake nedelje i na kraju se odredi sampion i dele se pehari. Pehari i medalje s dele svima, a sampionioma malo veci nego ostalima.

Nekoliko godina sam pomagao vodeci evidenciju o rezultatim i pravio tabele. Imam sopstvenu bazu i programe za vodjenje liga takmicenja i pracenje statistike utakmica i igraca i sve to lepo radi. Ovo navodim jer mi je jednom Gojko obrisao post kad sam na forumu Matematika pitao za algoritam za odedjivanje ko ce skim da igra, mislio je da mi je to domaci zadatak

Ajde ovako da uradimo. Ja sam kobajagi organizator lige u nekom sportu. Treba mi baza podataka u kojoj cu da pratim sta se u ligi desava - utakmice, rezultati, tabele. Lepo opisem sta hocu, jezikom organizatora lige. Onda se jave majstori da predloze bazu. Pod bazom mislim samo na back end. Necu da se bunim ako neko koristi identity za PK, to se mene ne tice, ja sam kobajagi samo organizator lige i o projektovanju baze ne znam nista. Ali, kobajagi imam sestrica koji studira SQL i moze za mene da sastavlja SELECT upite i da postavlja nezgodna pitanja koja ja onda prenesem na forum te tako malo procistimo dizajn dok ne dobijemo nesto sto ce moci da posluzi kao dobra osnova za front end. Ne mora da bude na kraju samo jedno resenje. Verovatno da ni jedno resenje nece biti perfektno i svako ce biti bolje od drugih u nekim elementima. Nema veze, sto vise razmisljanja i ideja, to bolje.

Ako se prihvata predlog i ima dobrovoljaca da se bave ovim, u sledecem postu dacu opis problema koji se resava pa da se pocne.

[ Dejan Topalovic @ 29.08.2006. 16:03 ] @
Ukoliko ugrabim dovoljno slobodnog vremena i ukoliko budem imao motivacije, rado bih se prikljucio ovoj diskusiji. Ona prethodna je postala malo naporna za mene, pa se nadam da ova nece biti u stilu "moj tata je jaci od tvog tate" prepucavanja...
[ Zidar @ 29.08.2006. 18:23 ] @
Zahvaljujem

Evo ga proces koji treba zamisljena baza podataka da podrzi:

Prati se iz sezone u sezonu, amatersko ligasko takmicenje u nekom sportu. Sport je slican fudbalu/rukometu/kosarci/vaterpolu/hokeju. Daju se golovi i ko da vise, dobio je utkmicu. Za pobedu tim dobija X bodova, za nereseno Y a za poraz Z bodova. Brojevi X, Y, Z se mogu razlikovati od sezone do sezone.

Za svaku sezonu, odredi se lista timova koji ce se takmiciti. Timovi imaju jedinstveno ime, ali ne uvek, moze biti Radnicki iz isa i Radnicki iz Kragujevca, pa im dodelimo takmicarski broj na pocetku sezone. Svaki tim podnosi listu igraca koji ce igrati za njega tokom sezone. Igraci mogu u toku sezone da promene tim.

Svakog vikenda igraju se utakmice. To se zove 'kolo lige'. U svakom kolu, svaki tim igra najvise jednom. Ako je neparan broj timova, u svakom kolu je jedan tim slobodan. Broj kola i ko s kim igra u kom kolu se odedjuje rasporedom utakmica koji se pravi na pocetku sezone. Baza podataka NE MORA da ima modul za pravljenje rasporeda, podrazumeva se da raspored postoji. Znaci, sta pise u rasporedu (Excel fajl ili cak Word), ima se uneti u bazu podataka. Baza mora da spreci greske u prekucavanju, na primer:
- jedan tim u istom kolu se pojavljuje u dve utakmice
- tim igra sam sa sobom - gost i domacin su isto
- nepostojeci tim se pojavljuje

Za svaku utakmicu, u rasporedu se navodi domacin tim, gostujuci tim, predvidjen datum utakmice i predvidejno vreme pocetka utakmice. Svakoj utakmici se dodeljuje sudija i zelimo da pratimo i ko je sudio koju utakmicu. Treba spreciti greske u planiranju - da se ne moze u jednom kolu isti sudija odrediti da sudi dve utakmice.

Po zavrsetku utakmice sudija sastavlja izvestaj u kome pise stvarni datum i vreme pocetka utakmice. Upisuje se rezultat i dodeljeni zuti i crveni kartoni. Upisuje se status utakmice, a moze biti
1. regularno odigrana utakmica, rezultat se vazi
2. utakmica prekinuta zbog vise sile, rezultat se ne vazi
3. utakmica uopste nije ordigrana zbog vise sile
4. jedan od timova je predao utakmicu, upisuje se 1:0 za drugi tim.

Kazne za igrace
--------------
Igrac sa dva zuta kartona automatski mora da preskoci sledecu utakmicu. Igrac sa crvenim kartonom automatski preskace dve utakmice. Pre svake utakmice, sudija proverava koji igraci treba da sede tu utakmicu zbog kazne. Ovo vidi iz izvestaja koji mu se dostavlja iz direkcije lige. Posle utakmice, sudija podnosi izvestaj o dodeljenim kartonima. Upisuje se prezime, ime igraca i registracioni broj. Ovo znaci da se na pocetku sezone registruju svi iraci koji ce igrati za timove i svakom se za tu sezonu, dodeli registracioni broj. Baza ne mora da pamti ko je igrao na kojoj utakmici, ali mora da pamti ko je dobio kakav karton i na kojoj utakmici nece smeti da igra.

Statistike igraca
----------------
Baza ne mora da pamti ko je dao golove, ali bi bilo lepo, zbog statistike.

Rezultati
--------
Posle svakog odigranog kola, pravi se tabela sa ovakvim zaglavljem:
Pozicija, Naziv tima, Broj odigranih utakmica, Broj pobeda, Broj neresenih, Broj poraza, Dato golova, primljeno golova, Broj bodova

Pozicija (mesto na tabeli) se odredjuje tako sto se tabela sortira u sledecem redosledu:
1. najvise bodova
2. najbolja gol razlika (dati minus primljeni golovi)
3. broj datih golova
4. broj odigranih utakmica
5. medjusobni skor

Ako ovih 5 uslova nije dovoljno da se rangiraju timovi na tabeli, onda timovi dele najvisu poziciju. Na primer, ako ima tri tima koji dele trece, cetvrto i peto mesto, svima se u tabeli pise trece mesto. Tim koji dolazi posle njih, bice sesto mesto.
Znaci, pozicija time jeste broj timova koji su bolji od njega plus jedan.

Za tabelu i pomenute izvestaje, treba dati SELECT iskaz koji obezbedjuje trazene podatke. Potrebni su dakle SELECT izkazi za:
1. tabelu posle svakog kola
2. lista igraca koji imaju pravo igranja za svaki tim na datoj utakmici
3. listu kaznjenih igraca koji ne mogu da igraju na datoj utakmici
4. lista strelaca - ko je dao koliko golova
5. lista golmana - ko je primio koliko golova

Sta se trazi od projektanta
-------------------------
1. da predlozi strukturu tabela koja omogucuje da se prati ligasko takmicenje, prema prilozenom opisu.
2. Na osnovu datog opisa, projektant treba da identifikuje najvaznija pravila i da pokaze kako baza podrzava ta pravila. Na primer: pravilo 'tim moze u jednom kolu odigrati najvise jednu utakmicu' podrazno je sa UNIQUE constraint na tabeli tblKola po poljima (KoloID, timID)

Posto sam ja samo dobrovoljni direktor lige, ne razumem se u projektovanje baza podataka ja prema tome ne znam sta su pravila, pa vam ih ne mogu izlistati. Mogu da vam opisujem kako mi to radimo pesice, a prjektant neka vidi sta ce.

[ inherited @ 30.08.2006. 08:21 ] @
Ideja je odlicna. Projekat ni malo nije naivan. Posto sam od onih koji uglavnom prate i pitaju na forumu za baze, zamolicu one koji znaju, da krenu u resavanje projekta. Pa, ako niko i ne zna, verujem da Zidar zna, te nek nastavi sa resavanjem problema kao projektant.
[ Zidar @ 30.08.2006. 13:30 ] @
Hvala na komplimetu, ali poenta je da projekat pokusa neko ko se ovim nije bavio, dakle neopterecen prethodnim iskustvom. Prethodno iskustvo nije uvek prednost.

:-)
[ inherited @ 30.08.2006. 14:01 ] @
Pročitavši text, ovako odokativno, mislim da bi se mogli napraviti, za početak, nekoliko šifarnika ili kako ih već nazivate. Ovako, npr.:
1)ŠIFARNIK KLUBA
2)ŠIFARNIK SEZONA
3)ŠIFARNIK BODOVA
4)IGRAČI (šifra_ kluba, JMBG_igrača,...)
5)ŠIFARNIK SUDIJA
6)ŠIFARNIK KARTONA
7)ŠIFARNIK STATUSA (regularno odigrana utakmica, rezultat se vazi ,...)
8)ŠIFARNIK KAZNI

!?!

[Ovu poruku je menjao inherited dana 30.08.2006. u 16:26 GMT+1]
[ Miloš Baić @ 30.08.2006. 16:04 ] @
Pozdrav,

u jednom postu, čini mi se Zidarevom, rečeno je da te primere i probleme na koje nailazimo pri projektovanju baze podataka, treba što ispravnije i detaljnije približiti nama koji pratimo diskusiju. Dakle, Zidar je izneo sasvim korektno problematiku u ovoj temi, a ja bih vas zamolio da što detaljnije odradite ovu diskusiju.
Možda da počnete sa E-R modelom sistema, normalizacijom...

Hvala unapred.
[ Zidar @ 30.08.2006. 18:20 ] @
Hvala Inherited, dobar pocetak. Imamo dakle sifranike.
Citat:

1)ŠIFARNIK KLUBA
2)ŠIFARNIK SEZONA
3)ŠIFARNIK BODOVA
4)IGRAČI (šifra_ kluba, JMBG_igrača,...)
5)ŠIFARNIK SUDIJA
6)ŠIFARNIK KARTONA
7)ŠIFARNIK STATUSA (regularno odigrana utakmica, rezultat se vazi ,...)
8)ŠIFARNIK KAZNI


Ja kao direktor lige sam priajtno iznenadjen sto mi se projektant baze brzo javio, vidim da se nesto desava, ne razumem bog zna kako, ali imam neka pitanja:

- Moze li malo detaljnije sta bi koji sifranik sadrzao?
Pretpostavljam da je ŠIFARNIK SEZONA spisak sezona - za svaku sezonu po jedan red u spisku. A mogu li da imam vise od jedna lige u istoj sezoni? Na primer, vodim administraciju za fudbalsku ligu, ali i za kosarkasku? Ili, takmicenje je u fudbalu, ali su lige razlicite, zbog uzrasta, pa imam pionire, omladinc i odrasle?

Sta bi bio ŠIFARNIK KLUBA? Mozda si mislio ŠIFARNIK KLUBOVA, kao neki spisak klubova? Svidja mi se. Mozes li mi reci kako znam koji klub igra u kojoj sezoni ili ligi?

ŠIFARNIK BODOVA? Je l' to koliko je ko osvojio bodova?

IGRAČI (šifra_ kluba, JMBG_igrača,...) - ovo mi se svidja, treba nam spisak svih igraca, koji igraju u odredjenoj ligi u odredjenoj sezoni. Isto za ŠIFARNIK SUDIJA.

A ŠIFARNIK KARTONA, je'l to ko je dobio koliko kartona? A jel' nisu to kazne? Ovo bas ne razumem.

A gde su utakmice? A gde se cuva tabela? A jel' moze da neki program sam izracunava tabelu, a samo unesem rezultate?

Sad je red na projektantu da pojasni. Mozda su neka pitanja i zbunjujuca, jer je ne razumem mnogo sta mi je projektant rekao u stvari. nego kao razumem rec sifranik i sad kao pogadjam sta se hoce.
[ chachka @ 30.08.2006. 19:20 ] @
1. Svrhe baze podataka

Svrha ALTUNS baze podataka je da pruži informacije o stanju takmičenja i da pomogne pri donošenje ispravnih odluka u daljem toku takmičenja.


2. Ciljevi baze podataka

Potrebno je obebediti ispranost rasporeda utakmica.
Potrebno je održavati podatke o timovima.
Potrebno je održavati podatke o igračima.
Potrebno je održavati podatke o takmičenju i utakmicama.


3. Potencijalni subjekti

Na osnovu imenica koje se pojavljuju u inicajlnom tekstu problema dolazim do potencijalnih subjekte. Subjekti se u zahtevima najčešće pojavljuju u množini. Subjekti su uopšteno govoreći osobe, predmeti, događaji. Pokušaću da dam i definiciju potencijalnih subjekata.

Spisak potencijalnih subjekata sa njihovim definicijama (sortiran po abecedi):
Bod – Bod je nagrada koju tim dobija za postignut uspeh u odigranoj utakmici.
Dodela crvenog kartona – Disciplinska mera koju sudija izriče igraču kojom se igrač udaljava iz utakmice.
Dodela žutog kartona – Disciplinska mera koju sudija izriče igraču kao upozorenje na nepravilno ponašanje.
Gol – Gol je događaj na utakmici kojim se meri uspešnost tima.
Igrač – Igrač je registrovana osoba koja učestvuje u takmičenju.
Izveštaj -
Izveštaj o dodeljenim kartonima – Izveštaj o dodeljenim kartonima je zaključak o izrečenim disciplinskim merama na jednoj utakmici.
Kazna – Kazna je disciplinska mera zabrane igranja utakmice igraču. Kazna se izriče na osnovu lošeg ponašanja igrača na predhodnim utakmicama.
Kolo -
Lista igrača -
Lista timova – Lista timova je skup timova koji se međusobno takmiče u jednoj sezoni.
Raspored utakmica – Raspored utakmica je spisak utakmica sa datumom i vremenom održavanja.
Sezona - Sezona je kontinuirani vremenski period u kojem se održava takmičenje.
Sudija – Sudija je kvalifikovana osoba koja održava regularnost utakmice.
Tim – Tim je skup igrača koji zajedno učestvuju kao jedna strana u takmičenju.
Utakmica – Utakmica je takmičenje između dva tima.



4. Potencijalne karakteristike

Takođe iz teksta problema dolazim do potencijalnih karakteristika koje moramo da čuvamo u bazi. Karakteristike se u zahtevima najčešće pojavljuju u jednini.

Spisak potencijalnih karakteristika
pobeda
nerešeno
poraz
ime tima
takmičarski broj
domaći tim
gostujući tim
predvidjen datum početka utakmice
predviđeno vreme početka utakmice
stvarni datum početka utakmice
stvarno vreme početka utakmice
rezultat
status utakmice
prezime igrača
ime igrača
registracioni broj


5. Pitanja za direktora lige

a) Da li se direktor slaže sa iznetim stavkama pod 1 i 2 o svrsi i ciljevima?


Neki potencijalni subjekti su mi bez definicije, dok mi se neke definicije ne sviđaju, što znači da nisam razumeo njihovu ulogu te da moram tražiti dodatna pojašnjenja od naručioca projekta. Imam i neke dileme oko spiska potencijalnih karakteristika. Nastavak pitanja:

b) Dodela crvenog kartona / Dodela žutog kartona
Definicije su mi previše slične. Da li grešim u njima?

c) Izveštaj.
Navodi mi se pitanje: Izveštaj o čemu, o kome? Izveštaj o završetku utakmice? Da li već postji propisana papirna forma za popunjavanje (koju bih rado pogledao ako postoji)? Da li je primerenije taj izveštaj primenovati u recimo 'zapisnik o utakmici' ili 'sudijski zapisnik'?
Recimo da jedan igrač u istoj utakmici dobije dva žuta kartona, te zbog toga i crveni. Da li se u zapisnik uvode svi kartoni ili se uvodi samo crveni?

d) Izveštaj o dodeljenim kartonima.
Ovaj izveštaj (zapisnik?) je samo podskup predhodnog izveštaja, to jest predhodni izveštaj sadrži sve podatke koji se pojavljuju i u ovom izveštaju.

e) Kazna
Da li se može izreći i kazna neigranja usled događaja koji nisu (ili nisu mogli biti) sankcionisani odgovarajućim kartonima?

f) Kolo
Apsolutno ne mogu da definišem kolo! Pomoć!

g) Lista igrača
Rečeno je da timovi prijavljuju na početku sezone igrače koji će igrati za njih. Takođe je rečeno da igrači u toku sezone mogu menjati tim. Kako se onda nov igrač prijavljuje za igru? Da li se igrač koji je napustio tim jednostavno briše iz spiska prijavljenih igrača?

h) Sezona
Nisam baš zadovoljan sa ovom definicijom. Da li mi se može još malo pojasniti pojam sezone?

i) takmičarski broj
Da li sam dobro shvatio da se takmičarski broj dodeljuje od sezone do sezone. Da li to znači da isti tim može imati različit takmičarski broj u dve sezone?

j) registracioni broj
Slična pitanja se nameću kao i za predhodni takmičarski broj!

k) rezultat
Šta je to rezultat? Da li se on sastoji od broja datih golova domaćeg tima i broja datih golova gostujućeg tima?

l) status utakmice
Da li se utakmica sa statusom 3 pa i 2 ikada odigravaju? Da li im se dodeljuje nov termin u rasporedu?


6.

Ovde ću se za sada zaustaviti. Sigurno nisam još popisao sve subjekte i karakteristike, a možda sam ih i izmešao. To mi ni nije bio cilj u ovoj fazi. Svakako ću se još vratiti na originalni tekst problema kad dobijem odgovore na pitanja
[ Miloš Baić @ 30.08.2006. 19:51 ] @
Ovi bi možda mogla biti polazna osnova u sređivanju šifarnika, na osnovu onoga što je
inherited predstavio. Pa, ajde da ovo moje izmenimo i doradimo kompletnije na osnovu
vaših sugestija. Recimo da se vodi fudbalska liga.

-- #(Primary Key)
-- $(Foreign Key)

SIFARNIK_UZRASTA(#ID_Uzrasta, Naziv_Uzrasta) -- pioniri, omladinci i odrasli
SIFARNIK_SEZONA(#ID_Sezone, Naziv_Sezone, Pocetak, Kraj)
SIFARNIK_KLUBA(#ID_Kluba, Naziv_Kluba, Mesto, Adresa)
SIFARNIK_REZULTATA(#ID_Rezultata, Naziv_Rezultata, Broj_Bodova) -- pobeda,nereseno,poraz
SIFARNIK_IGRCA(#ID_Igraca, Ime, Prezime,...,$ID_Kluba)
SIFARNIK_SUDIJA(#ID_Sudije, Ime, Prezime,...,$ID_Uzrasta)
SIFARNIK_KARTONA(#ID_Kartona, Boja, Znacenje)
SIFARNIK_LIGA(#ID_Sezone, #ID_Uzrasta, #ID_Kluba)

BTW, nisam išao dalje, jer smatram da prvo treba korektno odraditi šifarnike, pa onda
možemo dalje razvijati ostale bazne tabele.

p.s. nisam video da je chachka postovao pre mene, pa ako ovo moje remeti koncepciju,
izvinjavam se.
[ Andreja Dulovic @ 31.08.2006. 09:36 ] @
evo mog predloga:


SEZONA (IDsezona, Naziv)

LIGA (IDliga, Naziv)

UTAKMICA (IDutakmica, Datum, vreme, IDsudija, IDliga, IDsezona, IDtim1, IDtim2)

SUDIJA (IDsudija, Ime)

IZVESTAJ (IDizvestaj, IDsudija, IDutakmica, IDteren, datum, vreme, IDrezultat)

TEREN (IDteren, Naziv, Lokacija, IDtimVlasnik)
[pretpostavka je da je tim1 domacin, a tim2 gost u tabeli UTAKMICA, ali je ostavljena sloboda u slucaju da makar jedna utakmica mora da se odigra na terenu treceg tima, pa ako ne postojala tabela TEREN ta cinjenica bi bila izgubljena]

KARTON (IDizvestaj, IDigrac, tip_kartona, minut)

REZULTAT (IDrezultat, Definicija, reseno_penalima, izIgre_ili_sluzbeni, dodatne_info)
[rezultat je u stvari "status" iz specifikacije, ali ima jos neke kolone koje za koje mi se cini da mogu biti od koristi, na primer utakmica se moze zavrsiti "sluzbenim" rezultatom, ako na primer navijaci jednog tima prebiju sudiju :) pa liga odluci da kazni taj tim, i tako neke slicne situacije. zanimljivo bi bilo i znati da li je utakmica dobijena na penala ili iz igre."definicija' je tekstualni opis koda rezultata.]

BODOVI (IDsezona, IDbod, brBodova)
[posto je u specifikaciji receno da se bodovi za pobedu i neresen rezultat mogu razlikovati od sezone do sezone, mora da postoji ova tabela]

LISTA_SEZONE (IDsezona, IDtim)
[koji timovi igraju u kojoj sezoni.]

KOLO_LIGE (IDkolo, IDsezona, datum)
[datum neka bude subota, ako se igra vikendom. i dalje je potreban datum u tabeli utakmice jer se utakmica moze igrati i u nedelju. mada se taj podatak moze izvuci iz kombinacije polja tabela KOLO_LIGE i UTAKMICA, mislim da je potreban jer se moze desiti da makar jedna utakmica odigra nekog dana koji nije vikend, i onda nece biti nacina da se ta cinjenica zapamti ukoliko ne postoji kolona "datum" u tabeli UTAKMICA/IZVESTAJ.]

TIM (IDtim, Naziv)

IGRAC (IDigrac, Ime, IDtim)

TRANSFER (IDigrac, IDtim, datum)
[ovo je neophodno ako ce biti potrebno raditi statistiku koliko je igrac dao golova dok je bio u nekom timu i slicno. datum oznacava datum dolaska u IDtim, tako da je omogucena pretraga po uslovu "sta je uradio igrac dok je bio u tom_i_tom timu).]

GOL (IDgol, IDutakmica, IDigrac, minut, IDtip_gola)

TIP_GOLA(IDtip_gola, Opis)
[cini mi se da bi bilo lepo imati podatak o tipu gola, da li je dat iz penala, iz igre, ili iz prekida, jer imam utisak (nisam siguran) da to moze biti zanimljivo za statistiku, posto nije isto da li je neki igrac dao gol iz penala ili iz igre. mozda postoje jos neki tipovi golova koji mogu biti od interesa, ali ne znam..]

REZULTATI(IDsezona, IDliga, IDkolo, Pozicija, Naziv tima, Broj odigranih utakmica, Broj pobeda, Broj neresenih, Broj poraza, Dato golova, primljeno golova, Broj bodova)
[ovo sam samo prekopirao iz specifikacije, i dodao prve tri kolone, posto mi je ponestalo vremena za razmisljanje. :)]


Deo specifikacije:
Citat:
Baza mora da spreci greske u prekucavanju, na primer:

ovo se moze resiti programski tako sto ce se prilikom svakog unosa utakmice u bazu proveravati zadati uslovi i ako nisu zadovoljeni, upis ce biti blokiran, i bice izdato upozorenje o gresci. mislim da je te uslove moguce proveriti i odrzavati na osnovu ovakvih struktura tabela.



inace, mislim da bi bilo interesantije da je specifikacija na pocetku zadata tako da simulira stvarnu zivotnu sitaciju u kojoj poslodavac (koji nema u glavi koncept baza podataka) daje lose i neprecizne specifikacije, te bi mi na osnovu njegovih daljih prohteva trebalo da menjamo bazu, cisto da vidimo kako bi to izgledalo u praksi. najbolje bi bilo da simuliramo i prozivimo neciju "anegdotu" iz zivota, pa da probamo da se "izborimo" sa virtuelim poslodavcem. :)


pozdrav,
andreja
[ Zidar @ 31.08.2006. 14:55 ] @
Vremenska razlika od 6 sati zaista cini cuda. Daje nam vremena da razmotrimo stvari na miru.

Kao direktor decije lige, zahvaljujem trojici konsultanata koji pokusavaju da rese problem. Evo dodatnih objasnjenja.

Mi smo u stvari sportski klub, koji organizuje i vodi grupa gradjana. Registrovani smo kao non-profit biznis. To znaci da imamo pravo da naplacujemo ucesce u nasim takmicenjima (ligama) a da sav prikupljeni novac mora da se potrosi na organizovanje takmicenja.

Organizujemo za sada bejzbol na leto i hokej preko zime. Hteli bismo da od sledece godine organizujemo i fudbal (evropski). Izraz 'sezona' jeste jedan takmicarski ciklus. Za bejzbol, sezona pocinje u maju i zavrsava se sredinom jula. Za hokej, sezona pocinje u oktobru i zavrsava se u martu. Ovo 'pocinje' i 'zavrsava' je gledano iz ugla ucesnika -utakmice za bejzbol pocinju umaju a zavrsavaju u julu.

Za organizatore kluba i sezone, posao pocinje mnogo ranije. Tako, za bejzbol, negde u februaru mi oglasimo da cemo sledeceg proleca/leta organizovati ligu za decu. Postavimo oglase u obliznje osnovne i srednje skole, u obliznju hokej arenu, po parkovima i vecim zgradama. Krajem marta pocinje registracija. Roditelji koji zele da im deca igraju, prijavljuju decu. To se radi licno. U nekoj skoli ili mesnoj zajednici uzmemo jednu sobu i tokom nekoliko dana tu dolaze roditelji da prijave decu. Uznmemo osnovne podatke - ime, prezime, pol, godiste, telefon, email i adresu. Vecinu dece i roditelja znamo jer su i ranije bili ukljuceni u neke aktivnosti. na kraju, svi smo iz istog komsiluka pa se znamo makar iz vidjenja. Odredjen broj dece je uvek nov - u najmladjim kategorijama, a i u starijim, uvek se neko doesli ili tek pocne da se 'bavi sportom'. Po pravilu, ako familija ima vise dece, sva su ona ukljucena, svak u svom uzrastu. Posle registracije sledi "try-out" - ocenjivanje kvaliteta, da bi mogli da decu razvrstamo u timove priblizno jednake snage. Za jedan vikend ih sve dovedemo na teren i trazimo da odrade odredjene elemente igre. Da li znaju da uhvate lopticu, da je bace, da udare onim stapom po loptici, koliko brzo trce. Za hokej gledamo da li znaju da klizaju, koliko dobro, kako rukuju pakom, koliko su brzi, precizni i slicno. Raspon kvaliteta je ogroman, pa u istom timu imate decu koja pojma nemaju ali i potencijalne buduce zvezde. Poenta je da igraju svi koji zele i da se lepo druze. Balansiranjem snaga timova postizemo da niko ne bude hronicni gubitnik. Istina, na kraju je neko na prvom mestu, neko na poslednjem, ali svako ima bar neku pobedu i poneki poraz. Ako se tokom sezone desi da je neki tim prejak ili preslab, mi jednostavno izpremestamo igrace, tako da odnos snaga bude ravnomerniji. Otuda ono da igrac moze da promeni tim tokom sezone. Timovi su svrstani u starosne kategorije, tako da govorimo kategoriji 'ne stariji od 10 godina', 'ne stariji od 12', 'ne stariji od 14' i slicno. Klupskim propisima se definise znacenje 'ne stariji od 10 godina' i nije tako striktno. Starosne kategorije mi nazivamo divizije (Division 'Under 12' ili Divison 'Born 1991'). U svim timovima igraju i decaci i devojcice, a moze i odvojeno, kako se vec dogovorimo i zavisno od toga koliko ima kog pola. Ako ima malo devojcica, podelimo ih medju timove da svuda bude po neka. Aki ih ima puno, bekada organizujemo posebnu ligu za njih.

Svaki tim ima trenera koji je neko od roditelja i on dobrovoljni i bez naknade obavlja tu duznost. Moze biti i pomocnik trenera, ako ima dobrovoljaca. Treneri zadzuju opremu na pocetku sezone - lopte, mreze za golove, pakove za trening, cunjeve. boce zavodu i slicno. Treneri preuzimaju dresove na pocetku sezione i dlee ih deci. Broj na dresu je ujedno i identifikacioni broj igraca u okviru tima. Brojevi na dresovima nisu sekvencijalni, nego predstavljaju brojeve cuvenih igraca. na primer, svaki fudbalski tim imao bi 25 (Zigic) ili 11 (Dzajic). U bejzbolu i hokeju cesti su brojevi tipa 27, 88, 77, 92. Bitno je samo da su brojevi jedinstveni u okviru tima. Cesto brojeve po svom nahodjenju postavlja firma kod koje narucimo dresove.

Utakmice se igraju na terenima koji pripadeju obliznjim skolama ili gradskom komunalnom preduzecu koje brine o parkovima. Upotreba terena se placa i na pocetku sezone mi procenimo koliko cemo imati timova i ugovorimo odredjen broj terena. To se finansira novcem prikupljenim od ucesnika. deo novca dolazi i od sponzora. Mnogi roditelji imaju sopstvani biznis, i odluce da daju donaciju klubu. Na ovaj nacin se obara pojedinacna cena i omogucuje i deci slabijeg materijalnog stanja da ucestvuju. Za uzvrat, na dresovima koje daca nose, ispisuje se ime sponzora. Bas kao Crvena Zvezda i Toyota. Pored toga, kad objavimo tabele sa rezultatima, pore imena tima pise i ime sponzora. Na primer tim 'North York Rangers' ima sponzora 'Morgan Architects' i na tabeli se pojavljuje ime 'North York Rangers - Morgan Architects'. Broj timova po diviziji je mali, obicno 4-5 pa je lako napraviti raspored ko ce skim da igra u kom kolu. Svako kolo se igra za jedan vikend. Normalno da ne zelimo da jedna tim igra dev utakmice jednog vikenda, a neko ni jednu. Tacno, za svaku utakmicu se dodeljuje jedan od terena i to pise u rasporedu. Ni jedan tim nema svoj 'domaci' teren. Za bejzbol imamo u principu tri igralista i ona su nasa svake subote i nedelje od podne do uvece. Tu moramo da udenemo sve utakmice, svih divizija.
Ipak je vazno ko je domacin a ko gost. U bejzbolu domacin prvi pocinje, a u hokeju domacin i gost moraju da budu na odredjenim stranama za vreme utakmice i imaju zasebne odeljke gde idu kad su iskljuceni. Rasporedom se postize da svaki tim bude domacin i gost priblizno isti broj puta. Posto je sezona dugacka, aima malo timova, onda svako svakoga igra po nekoliko puta.

Pitanje zutih i crvenih kartona predlazem da izbacimo iz razmatranja. Mi smo liga za ddcu, koju vode roditelji. stoga, ne zelimo uopste da imamo situacije gde bi neko bio kaznjen neigranjem. Ako neko previ probleme, ukaze se roditelju na to i ako treba dete se dovede u red na druge nacine. Za osam godina ne pamtim da smo iamli u bejzbolu ili hokeju kaznu neigranja. U fudbalu je drugacije. Vrlo su retki crvani kartoni, ali se desi da poneko dobije dva zuta, ako nista ono zbog sudija koji vezbaju strogocu.

Sudije su posebna prica. Oni moraju da su registrovani pri asocijaciji malih liga kojoj i mi pripadamo. To su obicno starija deca, 15 godina i vise koja su nekada igrala za nasu ligu pa sada uce i da sude. Na pocetku sezone formiramo listu sudija sa kojima cemo raditi. Sudije sa liste, tokom date sezone. pokrivaju sve timove i divizije. Izmedju dva kola ima cela sedmica. u toj sedmici, koordinator lige dodeljuje sudijama utakmice. Posto su to nasa deca, vodi se racuna kad je koji sudija na raspolaganju, ko je koliko iskusan i slicno. Sve se to obavi telefonom i licnim kontaktom, tako da sudije znaju na koji teren i kada treba da idu. Sudijama se placa to sto rade. Negde u ovom procesu smo zamislili da sudijama dostavimo informaciju ko ne bi smeo da igra na sledecoj utakmici zbog kazne. Ponavljam, ovo sa kaznama mozete da izostavite iz razmatranja, ali bi bilo lepo da se resi. Znaci, moze, ali nije obavezno. Posle utakmice, treneri potpisu zapisnik. U zapisnku pise rezultat utakmice. U gol spotrovima, pise se kad su pali golovi i ko ih je dao, pa i 'vrsta gola' - penel i iz igre. U bejzbolu se pisu pogodjene loptice i osvojeni poeni za igrace. U hokeju se pisu i minuti koje igrac provede u boksu za iskljucene (penalty minutes).

Same rezultate vodi osoba zvana 'score keeper', u slobdnom prevodu 'referent za tabelu'. Obicno trener pobednickog tima telefonom ili e-mailom obavestava score keeper-a o rezulatatima, iste veceri ili sledeceg dana. Onda score keeper zavede rezultate u raspored i preracuna tabelu.Tabela se onda postavi na oglasnu tablu i web site, a nekada se e-mailom posalje trenerima, zajedno sa azuriranim rasporedom. Desi se nekada da dodje do greske - javi s epogresan rezultat ili score keeper zameni pobednika i gubitnika i slicno. Ukoliko s egreska otkrije odmah, odmah se i ispravi. Ponekda medjutim, greska se ne primeti odmah, nego cak pred kraj sezone, posle 15 utakmica se otkrije da je u drugom kolu pogresno unet rezultat. Tada se greska sipravi i preracuna se nova tabela. Sto se tice tabele, uvek se vazi samo tekuca tabela. prethoden nisu od znacaja. Obicno cuvamo ne koje su objavljene na table (jedna preko druge se zakace spenadlama), ali svakoga interesuje samo ona koja je najsvezija. znaci, nema potrebe da cuvamo u bazi kakva je tabela bila posle svakog kola. iNteresuje nas samo poslednje stanje.

Eto tako su meni objasnili kako funkcionise kucna liga (house league)

Nadam se da sam odgovorio svima, ako ne nadalje idu konkretna pitanja i konktretni odgovori.

Veoma mi se dopada pristup koji ima Chachka, da se prvo formalno definisu pravila. Iz ovoga sto sam ispricao da se izvuce formalna lista pravila. Uz malo srece, kad se napravi model tabela, moci cemo da idemo po listi, jedno po jedno pravilo i da vidimo kako je podrzano u modelu. Ako se ja pri tome setim jos necega, videcemo sta cemo.

Kad dodje do konkretnih tabela, meni bi kao laiku bilo jako zgodno da mi pokazete tabele koje gradite sa nekim kobajagi podacima. Lakse mi je da shvatim o cemu se radi i da primetim sta ne vallja ili da postavim neko glupo pitanje. Tako, uz ovo
Citat:
SEZONA (IDsezona, Naziv)
LIGA (IDliga, Naziv)
UTAKMICA (IDutakmica, Datum, vreme, IDsudija, IDliga, IDsezona, IDtim1, IDtim2)
SUDIJA (IDsudija, Ime)
IZVESTAJ (IDizvestaj, IDsudija, IDutakmica, IDteren, datum, vreme, IDrezultat)
dobro bi dosli i primeri sa podacima.

Setite se, ja sam laik za komjutrka posla. I ovo je iterativan proces u kome vi pokusavate iz mene da izvucete bitne informacije, a ja uporno na netehnicki nacin pricam o tome kako radi liga. Iz moje price vi u stvari pravite specifikaciju (listu pravila) sa kojima cu se ja na kraju sloziti i onda idemo u gradjenje sistema. Rekoh, iterativan proces, pa ce biti mozda nekoliko krugova price dok ne isteramo sve na cistac.

:-)


[ Dejan Topalovic @ 01.09.2006. 00:28 ] @
Hm, da ne bismo previse otisli u sirinu i zakomplikovali citav proces, predlazem da se fokusiramo samo na jedan sport, npr. fudbal.
Ja sam evo zapoceo sa izradom ER dijagrama sa entitetima, pa cu vidjeti da do ponedeljka prilozim ER dijagram sa detaljnijim opisom i primjerima podataka za pojedine entitete.
[ Zidar @ 01.09.2006. 14:45 ] @
Zahvaljujem svima na podrsci ideje. Sa velikom zadovoljstvom ocekujem sledecu sedmicu pa da razmotrimo sta imamo.

Odgovori na Chackina konkretna pitanja:
Q: a) Da li se direktor slaže sa iznetim stavkama pod 1 i 2 o svrsi i ciljevima?
A: Naravno uz pojasnjenje:
Potrebno je obebediti ispranost rasporeda utakmica. => tacno dva zahteva a) da svaki tim u jednom kolu bude rasporedjen najvise jedamput i b) da gostujuci i domaci tim ne mogu da budu isto

Q:b) Dodela crvenog kartona / Dodela žutog kartona
Definicije su mi previše slične. Da li grešim u njima?
A: zahtev za pracenjem kartona se ukida, nema potrebe razmatrati dalje

Q:Navodi mi se pitanje: Izveštaj o čemu, o kome? Izveštaj o završetku utakmice? Da li već postji propisana papirna forma za popunjavanje (koju bih rado pogledao ako postoji)? Da li je primerenije taj izveštaj primenovati u recimo 'zapisnik o utakmici' ili 'sudijski zapisnik'?
A: posle utakmice sledi sudijski izvestaj, ili zapisnik o utakmici, ako hoces. Za neke sportove postoji papirni obrazac, za neke ne. Izvestaj je vise kao informacija. Minimum podataka u toj informaciji jeste rezultat i status utakmice. Informacija se moze dostaviti usmeno, telefonom, e-mailom, kako bilo, vazno je da score keeper i koordinator lige saznaju rezultat i status utakmice. Moj zahtev nije da se napravi izvestaj, nego da se napravi nekakva struktura u bazi podataka koj moze tu informaciju da sacuva. Front end je potpuno nebitan u ovom momentu. Kad napravite bazu i ja kao direktor lige usvojim to, onda cu da odem na forume Access/VB/NET i slicno i da trazim da mi naprave aplikaciju

Q: f) Kolo
Apsolutno ne mogu da definišem kolo! Pomoć!
A: Matematicki, bilo bi ovako: skup utakmica u kojima ucestvuje maksimalan moguc broj timova i svaki tim se pojavljuje ne vise od jedamput. Na primer, ako ima 8 timova u ligi, u jednom kolu odigrace se 4 utakmice i ucestvuju svi timovi. Ako ima 9 timova u ligi, moze se iskombinovati 4 utakmice a jedan tim preskace to kolo. Koliko kola ce biti tokom sezone? To je stvar dogovora. Obicno se tezi da svaki tim odigra sa svakim timom bar jednu utakmicu. Dakle, ako ima N timova, bice barem N-1 kola. ako je timova malo, a sezona je dugacka, onda se ciklus od N-1 kola ponavlja M puta. NBA igra tako - timovi igraju jedni s drugima vise nego jednom. Isto i tako NHL (National Hockey League, USA+Canada)
Srpski receno - ako se utakmice igraju vikendom, sto se odigra jednog vikenda, to je kolo.
U rasporedu, utakmica se odredjuje kolom u kome se igra. Kolo se odredjuje rednim brojem i nekim datumom. Kaze se
"Utakmice sesnaestog kola kolo, Subota 30 August 2003" Ovo znaci da se na vikend u kome je Subota, Aug 30 2003 igra sesnaesto kolo lige. pre toga se igralo petnaest kola.

Q: g) Lista igrača
Rečeno je da timovi prijavljuju na početku sezone igrače koji će igrati za njih. Takođe je rečeno da igrači u toku sezone mogu menjati tim. Kako se onda nov igrač prijavljuje za igru? Da li se igrač koji je napustio tim jednostavno briše iz spiska prijavljenih igrača?
A: Ili timovi prijavljuu igrace, ili rukovodstvo lige napravi timove od prijavljene dece. Da bi se izbalansirala snaga timova, ili iz bilo kog drugog razloga, igraci se mogu premestati iz tima u tim. Igrac se naprosto iz jednog spiska prebaci u drugi.

Q: h) Sezona
Nisam baš zadovoljan sa ovom definicijom. Da li mi se može još malo pojasniti pojam sezone?
A: Nema precizne definicije. Takmicarski ciklus? Ocekuje se da je to 'aksiomatski' jasno. Sezona je vremenski period u kome ce se odigrati sve utakmice i na kraju proglasiti pobednik. Nekada mi imamo dve sezone u toku istog leta. Ako je malo timova, recimo 4, treba nam 6 nedelja da svako sa svakim igra po dva puta. A terene smo dobili na deset nedelja. Ako ih ne iskoristimo, iduce godine komunalno preduzece nece nam dati te termine. Zato mi kazemo ovako: prvih 6 nedelja je regularna sezona. Onda jos tri nedelje igramo play-off, ali opet po liga sistemu, svako sa svakim tacno po jednom. To je ukupno 6+3=9 nedelja. Ostaje jos jedna. U toj desetoj nedelji mozemo da igramo naknadne utakmice, ako treba, ili da organizujemo turnir, na kome ce se igrati po kup sistemu, bilo sta, samo da zadrzimo termin. Cesto s eorganizuje piknik sa takmicenjem u individualnim vestinama. na primer, ko brze otrci od gola do gola, ko moze dalje da sutne ili baci loptu, koji golman moze da odbrani vise penala. Omiljeno takmicenje je potapanje direktora lige u bacvu sa vodom. Iznad velikog bureta sa vodom namesti se stolica koja je podesena da lako ispadne iz ravnotese i u koju sedne direktor lige. Klinci ga gadjaju mekanim gumenim lopticama dok ga ne potope. Naledu, organizuju se zabave na ledu uz muziku, sa deda mrazom i slicno.
Sto se tice baze podataka, prvih 6 nedelja je jedna sezona, play off je druga sezona, a sve u okviru istog leta.

Q:i) takmičarski broj
Da li sam dobro shvatio da se takmičarski broj dodeljuje od sezone do sezone. Da li to znači da isti tim može imati različit takmičarski broj u dve sezone?
A: Timovi se nanovo formiraju za svaku sezonu. Takmicarski broj se timu dodeljuje u okviru jedne sezone. Svaka sezona je nezavisna i zaokruzena celina. nema nikakve vezesa prethodnim sezonama. Nama je znacajno koja deca ucestvuju vise sezona i nas sistem za registraciju dece moze da prepozna povratnike, pa ne prekucavamo adresu i licne podatke, ako nije bilo promena. Timovima i ne mora da se dodeli nikakv broj, ne psotoji propis o tome. Koristimo brojeve jer se tako lakse pravi raspored. Naime, postoje tablice za kombinovanje timova po kolima. Probajte da iskombinujete ko skim igra ako imate 8 timova, videcete da nije lako. Zato je nekad neko napravio tablice u kojima pise nesto kao:

Kolo 1:
1 : 5
2 : 6
3 : 7
4 : 8

Kolo 2:
1 : 6
2 : 7
3 : 8
4 : 5


Q:j) registracioni broj
Slična pitanja se nameću kao i za predhodni takmičarski broj!
Aok je u timu, igarc mora imati jedinstven broj, onaj sto pise na dresu. kad promeni tim, daje mu se drugi broj, jer dobija drugi dres.


Q:k) rezultat
Šta je to rezultat? Da li se on sastoji od broja datih golova domaćeg tima i broja datih golova gostujućeg tima?
A: Na kraju svake utakmice, neko je pobedi a onaj drugi izgubio. U nekim sportovima moze da bude i nereseno. pobedio je onaj ko je dao vise golova/koseva/poena U fudbalu postoji pobeda, poraz i nereseno. U odbojci postoji samo pobeda i poraz. U kosarci uglavnom postoji pobeda i poraz, ali bi moglo i nereseno, ako se tako dogovorimo.

Q: ) status utakmice
Da li se utakmica sa statusom 3 pa i 2 ikada odigravaju? Da li im se dodeljuje nov termin u rasporedu?
A: Prekinute i nezapocete utakmice mogu ali i ne moraju da se odigraju. Pred kraj sezone, ukoliko bi rezultat neodigrane ili prekinute utakmice bitno uticao na redosled na tabeli, onda se cini svaki napor da se utakmica odigra. Ako nema uticaja, onda se ne igra. Da li je bitno ili nebitno, to odlucuje organizator lige na neki nacin. Ako se utakmica ima odigrati, menja joj se planirani termin. Iako s etermin promenio, utakmica se i dalje vodi kao utakmica odredjenog kola. Na primer, u trevem kolu, Subote, 5 Juli 2003, zbog provale oblaka nije odigrana utakmica. Ako se odluci da se utakmica igra 6. Septembra 2003, promeni se datum pocetka utakmice ali se ta utakmica vodi kao utakmica drugog kola. Nema potrebe da se preracnaju sve tabele posle svakog kola, promenice se samo poslednja tabela.


[ broker @ 02.09.2006. 07:11 ] @
Jedna opaska, kozmeticke prirode. Onzke timova bi valjalo da budu slovne, kao neka vrsta skracenice od imena, ogranicene na recimo maksimalno cetiri slova. Tako bi bilo mnogo prepoznatljviije nego kada se korsite brojevi, a mogle bi da budu upotrebljavane svigde gde je neprakticno da se prikazuje pun naziv tima.
[ chachka @ 02.09.2006. 13:05 ] @
Pregledajući dosadašnju prepisku sa direktorom lige naišao sam na stvari koje me bune. Pominju se golovi i vrste golova, pominje se lista golmana, a onda se kaže mi organizujemo bejzbol ligu. Dalje spominje se samo pojam trener, ali ne i da li je to trener za hokej, fudbal, bejzbol. Isti je slučaj i sa terenima. Da li jedan igrač može da učestvuje u bezbol ligi i u hokejaskoj ligi.

Kada se radi o organizovanju takmičenja, tada su svi sportovi slični. Treba obezbediti teren, termin, sudiju, timove za održavanje utakmice. Ishod utakmica je takođe isti, neko je pobedio, dok je drugi izgubio, ili je bilo nerešeno. Rezultat se uvek izražava odnosom dva broja )broj golova, broj optrčavanja, broj koševa), gde pobednik ima veći broj.

Kada se radi o statistici sportovi se itekako razlikuju. Ko je dao koliko golova, ko je postigao home-run, ko je proveo 5 minuta na klupi za kažnjene igrače. Zapisnici o toku utakmice se razlikuju, kaznene mere se razlikuju.

Moje pitanje direkturu lige je: Da li ostaje pri tome da se baza pravi za sve sportove od interesa (bejzbol, fudbal, hokej) ili da se baza pravi za konkretan sport (a dobar deo prepiske navodi na fudbal, što je Dejan i predložio)?


Dalje, ako sam dobro svatio, radi se o JEDNOM sportskom klubu koji organizuje i takmičenje u bejzbolu i takmičenje u hokeju i svi timovi su u nadležnosti JEDNOG sportskog kluba. Jedino o čemu klub ne utiče je sertifikovanje sudija.
[ Dejan Topalovic @ 02.09.2006. 13:18 ] @
Jos nisam cuo da je neko direktor i fudbalske lige, i hokejaske, i bejzbol lige...

Ajd da svedemo to samo na fudbalsku ligu, ako moze, jer cemo ovako samo otici u sirinu i zakomplikovacemo cijelu diskusiju mijesanjem razlicitih sportova.
Ja sam skoro gotov sa ER dijagramom, pa cu ga okaciti veceras ili sutra, nakon cega mozemo davati daljnje sugestije, prijedloge, izmjene...
[ inherited @ 02.09.2006. 16:46 ] @
Verujem da model baze sa vise sportova je pravi profesionalni projekat.

Ali, zaboravljate jedno.
Sam Zidar je napomenuo da projekat treba biti namenjen ljudima koji
uce modelovanje baze, projektovanje. Iskreno, malo teze se snalazim u pracenju
projekta kad je u pitanju vise sportova.
Bilo bi lepo da odradimo ovo vezano za fudbal, pa tek onda mozda, nesto slozenije.

Nadam se da mi necete zameriti na komentaru i unapred se zahvaljujem, ako uvazite
moj post.
[ delalt @ 03.09.2006. 10:28 ] @
Tema je veoma zanimljiva.
Mislim da bi trebali da se u početku složimo oko nekakve osnovne terminologije i naziva.
Lakše ćemo kasnije svi pratiti i dograđivati.
Citat:
Zidar:
Sta se trazi od projektanta
-------------------------
1. da predlozi strukturu tabela koja omogucuje da se prati ligasko takmicenje, prema prilozenom opisu.
2. Na osnovu datog opisa, projektant treba da identifikuje najvaznija pravila i da pokaze kako baza podrzava ta pravila. Na

primer: pravilo 'tim moze u jednom kolu odigrati najvise jednu utakmicu' podrazno je sa UNIQUE constraint na tabeli tblKola

po poljima (KoloID, timID)

Posto sam ja samo dobrovoljni direktor lige, ne razumem se u projektovanje baza podataka ja prema tome ne znam sta su

pravila, pa vam ih ne mogu izlistati. Mogu da vam opisujem kako mi to radimo pesice, a prjektant neka vidi sta ce.

1.1 Trebalo bi prvo da definišemo nazive i kolone prostih tabela, tj. šifarnika ili registara.

Ovdje nam može najviše pomoći sam direktor i u startu ćemo smanjiti moguća "vozanja",
u smislu "zaboravio sam da vam kažem da mi vodimo evidenciju i o ...". Ovakva situacija je u stvari i najčešća u praksi.
Neke od njih su već očigledne, predložiću neke nazive, a vi dodajte ili ih promijenite. Važno je da probamo da svi koristimo kasnije iste nazive.
Neka direktor (on je ipak glavni ) na kraju odluči koji su nazivi i za njega prihvatljivi i intuitivni (pošto je on laik za eventualne skraćenice...), a mi da se držimo toga.
I odmah pitanje za njega: neka dobro pogleda ove i ranije šifarnike i razmisli o svakom šifarniku posebno.
Potrebno je da se prisjeti kakvi su još osnovni podaci potrebni, bilo gdje da se trebaju pojaviti, recimo na spiskovima za sudije, na internetu, treba li evidencija
o roditeljima, školama ili još o nečemu što do sada nije spomenuo. Znači, kao da utakmice još nisu počele, samo pravimo
liste sportova, timova, igrača... Treba li voditi evidenciju o zaduživanju opreme (lopte, dresovi, palice...), zbog čega bi bilo
neophodno napraviti i šifarnik sportske opreme (stvari).
Što se tiče popunjavanja tabela nekakvim podacima, bilo bi dobro da nam direktor da već gotove spiskove timova, igrača... Tako će njemu to biti najpribližnije i lako prepoznatljivo, a mi ostali možemo koristiti iste nazive, da ne izmišljamo.

-----------------------------------------------------------------------------------------------------------
SPORTOVI (ovaj šifarnik možda nije ni potreban, ali možda nije ni loše zbog preglednosti)
sportID, NAZIV (ovdje može biti unesen i samo naziv jednog sporta, recimo FUDBAL, ako pratimo samo taj sport)

-----------------------------------------------------------------------------------------------------------
TIMOVI (prost spisak svih timova iz svih sportova, sa osnovnim generalijama)
timID, ŠIFRA, NAZIV, ADRESA, MJESTO, EMAIL, WEB_ADRESA, SLIKA, TRENER, POMOĆNIK, SPORT, DIVIZIJA, SPONZOR

pojašnjenje samo za neke kolone:
SLIKA - zbog objavljivanja na webu možda bi trebalo da se može prikazati i amblem tima ili grupna slika
TRENER, POMOĆNIK - prezime i ime trenera i pomoćnika trenera (možda napraviti i poseban šifarnik trenera i pomoćnika
sa generalijama?)
SPORT - naziv sporta u kome se tim takmiči (unosi se NAZIV iz tabele SPORTOVI)
DIVIZIJA - starosna kategorija kojoj tim pripada
SPONZOR - kratki naziv glavnog sponzora tog tima (SNAZIV iz tabele SPONZORI)

-----------------------------------------------------------------------------------------------------------
IGRAČI (spisak svih igrača koji učestvuju, iz svih timova i sportova)
igracID, JMBG, PREZIME, IME, POL, DATUM_ROĐENJA, ADRESA, MJESTO, EMAIL, TELEFON

pojašnjenje samo za neke kolone:
DATUM_ROĐENJA - odavde se može izvući godina zbog svrstavanja u starosnu kategoriju (DIVIZIJA)
napomena: ovdje ne treba stavljati kolonu kojem klubu pripada, jer se to u sezoni može mijenjati
-----------------------------------------------------------------------------------------------------------
TERENI (spisak svih terena, za sve vrste sportova, na kojima će se odigravati utakmice)
terenID, NAZIV, MJESTO, VRSTA

pojašnjenje samo za neke kolone:
VRSTA - travnati, beton, led (da se samo zna za koji sport se može koristiti)

-----------------------------------------------------------------------------------------------------------
SUDIJE (spisak svih sudija koje će suditi, za sve sportove)
sudijaID, JMBG, PREZIME, IME, POL, DATUM_ROĐENJA, ADRESA, MJESTO, EMAIL, TELEFON, SPORT

-----------------------------------------------------------------------------------------------------------
SPONZORI (prost spisak svih sponzora za sve sportove, sa osnovnim generalijama)
sponzorID, SNAZIV, NAZIV, ADRESA, MJESTO, EMAIL, WEB_ADRESA, SLIKA, TEKST

pojašnjenje samo za neke kolone:
SNAZIV - kratki naziv ili skraćenica sponzora
NAZIV - puni naziv sponzora

-----------------------------------------------------------------------------------------------------------
TRENERI (spisak svih trenera i pomoćnika, za sve timove)
trenerID, JMBG, PREZIME, IME, POL, DATUM_ROĐENJA, ADRESA, MJESTO, EMAIL, TELEFON

-----------------------------------------------------------------------------------------------------------
Dodajte još šifarnika, za koje mislite da su potrebni.
Generalno za sve tabele, svaku od onih ID kolona bi možda bilo dobro definisati tako da nije samo broj, već možda skraćeni
naziv tima, sponzora..., skraćeno prezime_ime igrača, sudije..., naravno da je jednoznačno. Ovo samo zbog nekakve
preglednosti onog ko unosi u tabele sa relacijama (na primjer u tabelu TIMOVI_IGRAČI).
Ovdje se nisam zadržavao na detaljima kao što su UNIQUE kolone, indeksi, koje kolone smiju biti nepopunjene (recimo SLIKA)...


1.2 Kad se dogovorimo o šifarnicima, onda možemo praviti tabele u kojima će biti određene relacije.

Daću samo jedan primjer:
-----------------------------------------------------------------------------------------------------------
TIMOVI_IGRAČI (ovo je tabela koja povezuje šifre timova (timID) i šifre igrača (igracID), sa datumima od kada do kada je
određeni igrač u timu. Datumi rješavaju problematiku praćenja mogućih transfera igrača. Na primjer, za određeni tim se upiše od kada (DATUM_OD) je u njegovom sastavu neki igrač. Ako bude potrebe da taj igrač iz bilo kog razloga u sezoni promijeni tim, onda se prvo upiše DATUM_DO kada je bio u tom timu, pa se u ovoj tabeli doda novi red sa šifrom novog tima, šifrom igrača i DATUM_OD kada je u tom novom timu. Tako se može dobiti statistika o transferima igrača u toku sezone (ili više sezona), koliko je utakmica odigrao u nekom timu itd... Kad se budu dijelile diplome može se upitom dobiti lista svih igrača koji su igrali za određeni tim, pa makar i u jednoj utakmici i time doprinijeli uspjehu.)
timigracID, timID, igracID, DATUM_OD, DATUM_DO, BROJ_NA_DRESU, OCENA_KVALITETA_IGRACA

pojašnjenje samo za neke kolone:
OCENA_KVALITETA_IGRACA - stavljam u ovu tabelu jer igrač može imati visoku ocjenu za fudbal, ako se nalazi u tom
timu, ali kad se zbog nedostatka igrača ili želje prebaci u tim za hokej gdje je totalni početnik, onda dobija drugu nižu ocjenu. Ovo je važno zato da bi se mogla pratiti ujednačenost snaga timova (sumiranjem ocjena igrača dobija se nekakva ocjena tima - mogući favoriti).

-----------------------------------------------------------------------------------------------------------
Zatim bi trebalo definisati tabelu sezona i utakmica u određenom sportu, rezultati, kartoni...
Znači, posao za projektante, uz eventualne konsultacije sa direktorom o detaljima u pojedinim sportovima,
uz pretpostavku da smo dobro osmislili šifarnike i da neće biti potrebe da ih mijenjamo (odnosno što manje).

Nadam se da nisam zakasnio sa ovim prijedlozima, mnogi su vjerovatno dosta već odmakli u svom radu, pa se nemojte ljutiti.
[ Dejan Topalovic @ 03.09.2006. 23:20 ] @
Evo kako sam ja to sve shvatio i kako sam na primjeru fudbalske lige slozio dizajn baze, odnosno napravio ER dijagram.



- PROCES -

Za fudbalsku ligu u sezoni 2006/2007 organizator (npr. direktor lige) prima prijave potencijalnih igraca.
Tabele: ORGANIZATORI, SEZONA, PRIJAVE

Moze postojati vise liga, a u svakoj lizi moze biti zastupljeno vise timova, sastavljenih od razlicitih uzrasta nekog kluba.
Tabele: LIGA, KLUB, UZRASTI, KLUB_UZRASTI, TIMOVI, LIGA_TIM

Svaki tim se sastoji od odabranih igraca na raznim pozicijama. Svaki tim ima trenera i proizvoljan broj sponzora.
Tabele: TIMOVI, IGRACI, POZICIJE, TRENERI, SPONZORI, SPONZOR_TIM

Za sezonu se u svakoj lizi odredjuje koliko ce se igrati kola.
Tabele: SEZONA, KOLA, LIGA

U svakom kolu se igra odredjen broj utakmica.
Tabele: KOLA, UTAKMICE

Utakmica se u zadano vrijeme igra na predvidjenom terenu. Zna se ko je domacin, ko je gost, ko sudi.
Tabele: UTAKMICE, TERENI, SUDIJE

Na utakmici se prate razni podaci, npr. koji igrac je dao gol i u kojoj minuti, kao i koji igrac je dobio karton.
Tabele: UTAKMICE, GOLOVI, KARTONI, IGRACI

Nakon utakmice se igraci ocjenjuju, evidentuje se rezultat i status utakmice, a delegat ili sudija pise izvjestaj.
Tabele: UTAKMICE, IGRACI, OCJENE, IGRAC_OCJENA, IZVJESTAJI, SUDIJA


U toku sezone neki igrac moze preci u neki drugi klub ili zbog starosne dobi preci u isti klub, ali u tim sa starijim uzrastom.
Tabele: IGRACI, PRELASCI, KLUBOVI, UZRASTI, KLUB_UZRASTI, TIMOVI

Detaljniji opis svakog entiteta/tabele, kao i moguce SQL izraze, napisacu sutra, jer sad idem spavati. :)

Ovo je samo radna verzija, a ocekujem od vas sugestije i daljnje prijedloge, kako bismo poboljsali postojeci ER dijagram i sklopili optimalnu bazu.

Ja sam obradio samo fudbalsku ligu, ali mozemo pokusati kasnije prosiriti i na vise sportova...
[ chachka @ 04.09.2006. 08:22 ] @
@Zidar: Pored neodgovorenih pitanja iz mog predhodnog posta imam još jedno pitanje za naručioca projekta.
Svrha i ciljevi baze koje sam postavio ne pokrivaju pripremu za takmičenje (regrutovanje dece, odlučivanje o broju timova, podela timova po divizijama). Da li naručioc (u daljem obraćanju Zidar) želi da se baza proširi i na ovaj segment rada sportskog kluba?



Rezimiraću neke svoje zaključke:
- Postoji samo jedan klub..
- Za jedan sport postoji samo jedna liga.
- Liga se deli na divizije.
- Sve ovo je pod pokroviteljstvom jednog sportskog kluba.
- Timovi nisu registrovani kod državnih institucija (čitaj timovi nisu pravna lica), nego je to klub.
- Sponzori formalno pravno sponzorišu rad kluba kao celine. Internim aktima (dogovorima) kluba se odlučuje kako se sredstva troše.


Čini mi se da ovde nemamo hijerarhije tipa:
- FIFA -> Fudbalski Savez Srbije -> Fudbalski Klub Crvena Zvezda -> Prvi Tim FK CZ,
- Sportsko Društvo Crvena Zvezda -> Košarkaški Klub Crvena Zvezda -> Kadeti KK CZ.



@Dejan
Pošto očekuješ sugestije, na prvi pogled:
- Tim može da ima maksimalno jednog igrača. To je kapiten, ali gde je sastav tima? Odnosno kako je Zidar definisao: Gde je lista igrača?
- Ostatak ne mogu komentarisati jer mi se viđenje problema dosta razlikuje (jedan klub, jedna liga, klub = organizator).



Šaljem i svoj dosadašnji rad, ali on nije bog zna šta, jer imam još dosta nerazjašnjenih pitanja. Još sam u fazi analize.
[ Dejan Topalovic @ 04.09.2006. 09:37 ] @
Citat:
chachka: @Dejan
Pošto očekuješ sugestije, na prvi pogled:
- Tim može da ima maksimalno jednog igrača. To je kapiten, ali gde je sastav tima? Odnosno kako je Zidar definisao: Gde je lista igrača?
- Ostatak ne mogu komentarisati jer mi se viđenje problema dosta razlikuje (jedan klub, jedna liga, klub = organizator).
Ma nisam mislio da tim ima max jednog igraca, nego sam u zurbi obrnuo relationship izmedju te dvije tabele (parent -> child). :) Evo sad kad sam detaljnije pogledao, ima jos veza medju tabelama, koje nisu pravilno postavljene. Ispravicu to u iducoj beta verziji. :)

Nazalost, nemam sad vremena da detaljno procitam cijeli tvoj tekst, ali vidjecu veceras ili sutra kako si ti to zamislio i poslozio... Da li bi mogao i ti napraviti ER dijagram po svom rjesenju?

Da li je mozda jos neko u medjuvremenu napravio ER dijagram za svoje vidjenje baze?


@Zidar: Ne bi bilo lose, kad bi postavio listu pitanja sa selektovanjem podataka iz baze, kako bismo ta pitanja mogli pretvoriti u SQL izraze...
Npr. "koliko je golova bilo na toj i toj utakmici?", "Koliko je golova dao taj igrac u sezoni?" ili "Izlistaj izvjestaj sa te i te utakmice"...
[ Andreja Dulovic @ 04.09.2006. 10:33 ] @
@Zidar
Citat:
dobro bi dosli i primeri sa podacima.

mislim da nema potrebe da upoznajemo klijenta sa strukturom tabela i samom implementacijom baze. ima vise razloga zbog kojih mislim da je to lose. prvi i osnovni je taj sto ce klijet brzo poceti da nam "soli pamet". :) :)

Citat:
Setite se, ja sam laik za komjutrka posla. I ovo je iterativan proces u kome vi pokusavate iz mene da izvucete bitne informacije, a ja uporno na netehnicki nacin pricam o tome kako radi liga. Iz moje price vi u stvari pravite specifikaciju (listu pravila) sa kojima cu se ja na kraju sloziti i onda idemo u gradjenje sistema. Rekoh, iterativan proces, pa ce biti mozda nekoliko krugova price dok ne isteramo sve na cistac.

kad bi ovo bila stvarna situacija, ja nikad ne bih krenuo od projektovanja baze i smisaljanja tabela, vec bi rad na tom zapoceo tek kad specifikacija bude totalno jasna i kad korisnik "aminuje" GUI i funkcije koje ocekuje da program izvrsava. prvo bih napravio "funkcionalni model" programa, gde korisnik moze da "klikce" i simulira rad (da bih video sta ocekuje i gde ga program intuitivno "vodi"), pri tome mi govoreci sta bi jos hteo da program moze da radi. tek onda bih razmatrao tabele i bazu. mislim da pravljenje baze i definisanje tabela i upita pre nego sto se uradi ovaj prethodni korak nema mnogo smisla, no, to je moje misljenje...


@Dejan Topalovic
da li kolona "Stari broj dresa" u tabeli PRELASCI postoji zbog situacije kad igrac u okviru istog tima promeni broj dresa (posto ne mogu da se setim ni jedne druge situacije u kojoj bi taj podatak trebalo cuvati)?

[ Dejan Topalovic @ 04.09.2006. 11:13 ] @
@Andreja: Sve kolone u tabelama su proizvoljne, pa tako i kolona sa starim i novim brojem dresa. Npr. kad igrac predje u novi tim, moze se desiti da dobije novi broj dresa, pa se moze sacuvati informacija o novom i starom broju dresa.

Primijetices da sam u nekim tabelama naveo kolone "BLABLA", jer je ovo samo ipak radna verzija i podlozna je cestim promjenama, kojih ce naravno biti. :)
[ chachka @ 04.09.2006. 11:51 ] @
Citat:
Dejan Topalovic: Da li bi mogao i ti napraviti ER dijagram po svom rjesenju?

Da, naravno. Napraviću propratni ER dijagram čim se usaglasim sa Zidarom šta se projektuje. Recimo, ciljevi koje sam ja postavio pred bazu ne pominju predsezonu ili upravljanje opremom.

Moram prvo analizirati šta Zidar hoće i da li ga ja dobro razumem. Nažalost to je spor proces kada se odvija preko foruma.
[ Andreja Dulovic @ 04.09.2006. 13:47 ] @
@Dejan
u pravu si, nisam video "blabla" kolone u ostalim tabelama, pa sam mislio da je u pitanju konacna verzija. :)
[ Zidar @ 05.09.2006. 18:12 ] @
Ponedeljak u Kanadi bio neradan dan, pa smo ga proveli - na utakmici. Odveli starije dete na neki teren 150 km od Toronta. Dosle sudije iz obliznjeg mesta, timovi odigrali, SC Swansea : Humberland 5:3, Swansea (nasi) uknjizio 3 poena a dvojica nasih dobili zute kartone.

Pre nego pokusam da odgovorim na konkretna pitanja, da ponovim jos jednom sta se trazi a sta ne.
Sta se trazi:
Opste:
Trazi se model baze podataka koji omogucuje da se zapise ko igra (timovi) i kojim su rezultatima zavrsene utakmice u nekom takmicenju tokom jedne sportske sezone. U svakom takmicenju (ligi) ucestvuju razlicte starosne kategorije (divizije) .
- Sezona je jedan takmicarski ciklus u jednom sportu.
- model treba da podrzi razne timske sportove, koji su slicni fudbalu
- Postoje razlicte starosne kategorije (divizije) u okviru jednog sporta
- U okviru svake divizije, u datoj sezoni i sportu, igraju dati timovi.
- Timovi imaju sponzore, recimo tacno jednog. Ime sponzora treba da se pojavi u tabeli uz ime tima.
- u istom momentu, klub moze da oragnizuje nekoliko razlicitih takmicenja u razlicitim sportovim i starosnim divizijama

Utakmice:
Utakmice se igraju po unapred utvrdjenom rasporedu, na zadatom mestu (terenu) u zadato vreme.
- Utakmice su grupisane u kola.
- U svakoj utakmici uscevuju dva tima.
- Svaki tim u svakim kolu moze se pojaviti najvise jednom.
- Sve divizije jednog sporta medjusobno dele terene. Ne sme se dozvoliti da na jednom terenu u isto vreme budu dve utakmice.


Sudije:
- Utakmicama se dodeljuje sudija.
- Da bi se sudija dodelio utakmici, mora biti na spisku sudija za taj sport za datu sezonu.
- Sudije u jednom sportu, sude svim divizijama
- Ako je osoba moze da sudi utakmice vise sportova, vodi se u svakom spisku posebno
- Ne sme se dozvoliti da jedan sudija bude dodeljen na dve razlicite utakmice u isto vreme, makar utakmice bile u razlictim divizijama

Stanje na tabeli::
Na osnovu rezultata odigranih utakmica izracunava se tabela, kao u fudbalu. Zahtev: napraviti skup objekata (vievws, stored procedures) koji kao razultat izbacuju tabelu. Uzeti u obzir sve utakmice koje su odigrane do momenta izracunavanja tabele, a koje nisu iz nekog razloga ponistene. Timovi se rangiraju po broju osvojenih bodova, po gol/kos/run razlici, po broju odigranih utaknica.

Kad je model gotov, uneti nekolko test podataka, rezultate nekoliko utakmica u nekoliko kola i pokazati da uradjeni view/stord procedure moze da korektno izracuna tabelu.

U odgovoru Dejanu Topalovicu i Chachki dao sam primer sezone, timova i ostalo.

Sta se ne trazi:
Ne trazi se program (forme, izvestaji). nema veze sta ce biti, web ili windows, to se nista ne zna i nije bitno u ovom momentu. Ne trazi se pracenje ocena igraca, pozicija u timu, ko je dao golove ili vrsta gola, to se nista ne trazi. ne trazi se pracenje registracije igraca, da li su uplatili pare, koji im je telefon, nista od toga

Pozeljno ali nije obavezno:
Nije obavezno da se prate igraci (IZMENA u odnosu na prvobitni zahtev) Iz ovoga sledi da se izbacuje i pracenje kazni - ko ne sme da igra sledecu utakmicu. Ovo jeste bio zahtev prvobitnmo, ali se skida odlukom direktora kluba. To mozemo da dodamo kasnije.


Konkretna pitanja:
Da probam da ogovorim redom:
@Broker:
Citat:
Jedna opaska, kozmeticke prirode. Onzke timova bi valjalo da budu slovne, kao neka vrsta skracenice od imena, ogranicene na recimo maksimalno cetiri slova.

A: Moze i tako. razlog sto koristimo brojeve je tablica za pravljenje rasporeda. U toj tablici se timovi oznacavaju rednim brojevima, pa tako radimo i mi. Tablicu za pravljenje rasporeda objasnio sam u prethodnom postu

@Dejan Topalovic:
Shema baze koju si dao ima i vise stvari negos to je trazeno. Nije potrebno pratiti: prijave, Organizatore i Prelaske, Pozicije u timu, Ocjene. Isto nije neophodno partiti vrste golova i ko ih je dao, dovoljan je rezultat. Sve sto si naveo, moze da prodje, ali nije obavezno.

Q:
Citat:
Jos nisam cuo da je neko direktor i fudbalske lige, i hokejaske, i bejzbol lige...

A: Tacno, niko nije direktor sve tri lige, to je potpuno necvazno. Ali postoje tri direktora, mada ni to nije vazno jer necemo cuvati u bazi ko je direktor. Ostaje potreba da cuvamo u bazi podatke o sve tri lige, za ovu godinu, p za sledecu, pa opet sledecu. Podaci iz proslosti ce naprosto sedeti u bazi, necemo im se vracati. Ali ne zelimo sistem koji ce nam za svaku sezonu generisati po jedan fajl. Na primer, sve se uradi u Accessu, za tacno jedan sport, tacno jednu sezonu i onda za sleecu sezonu pocinjemo od istog takvog ali praznog Access fajla. Mi to ne zelimo. Zelimo ovako:
- unesemo rekord u tabelu koja sadrzi spisak svih sezona, kao:

Sezone:
ID Sport Sezona
1 , Fudbal, leto 2005
2 , Hokej , zima 2005-2006
3 , Baseball, leto 2006

Starosne kategorije - divizije:
ID Sport Sezona
1 , Fudbal, leto 2005, 'godiste 1991'
2 , Fudbal, leto 2005, 'godiste 1993'
3 , Fudbal, leto 2005, 'godiste 1995'
4 , Hokej , zima 2005-2006, 'decaci atom'
5 , Hokej , zima 2005-2006, 'decaci bantam'
6 , Hokej , zima 2005-2006, 'decaci midget'
7 , Hokej , zima 2005-2006, 'devojcice atom-bantam'

Onda definisemo timove, za svaku diviziju u okviru date sezone. Na primer, spisak timova izgleda nekako ovako:
Citat:

Fudbal, sezona 'leto 2005', Divizija 'godiste 1991':
1. Orlovi, sponzor 'Ujedinjeni zidari'
2. Panteri, sponzor 'Denatl Oriantal'
3. Lavovi, sponzor 'Kwiki Mart'
4. Ratnici, sponzor 'Simpsons and Co.'

Fudbal, sezona 'leto 2005', Divizija 'godiste 1993':
1. Ratnici, sponzor 'Master Carpet'
2. Rendzeri, sponzor 'Cofee Shop'
3. Lavovi, sponzor 'Deantal oriental'
4. Jastrebovi 'Di Nota Asphalt'
5. Kobre 'Silva Architects'


Onda dodelimo igrace koji su u tim timovima. Ovako izgleda spisak:
Citat:

Fudbal, sezona 'leto 2005', Divizija 'godiste 1991':
Tim: Orlovi, sponzor 'Ujedinjeni zidari'
Trener : Dragoslav Sekularac
Igraci:
Marko Markovic, broj dresa 88
John Smith, broj dresa 47
Zorica Brunclik, broj dresa 7
Paris Hilton, broj na dresu 12
Brad Pit, broj na dresu 45


Onda definisemo utakmice koje ce se igrati u datoj sezoni i grupismo ih u kola. Ostavimo prazan prostor da upisemo mesto (igraliste) i vreme, jer to radimo kasnije, ne u momentu kad se sastavlja raspored, odmah posle toga, ali POSLE satsvljanja rasporeda. Isto tako ostavimo prazan prostor da upisemo rezultate. Onda posle svakog kola upisujemo rezultate i izracunavamo tabelu. Ne moramo da cuvamo kopije tabela iz kola u kolo. Ako moze da se napravi query koji bi izracunao tabelu zakljcno sa zadatim kolom ili datumom, bilo bi super, ali nije obavezno. Dovoljno je izracunati tabelu koja uzima u obzir sve utakmice koje se u trenutku izracunavanja nalaze u bazi i imaju rezultat i nisu ponistene.

Chachka:
Q:
Moje pitanje direkturu lige je: Da li ostaje pri tome da se baza pravi za sve sportove od interesa (bejzbol, fudbal, hokej) ili da se baza pravi za konkretan sport (a dobar deo prepiske navodi na fudbal, što je Dejan i predložio)?
A: Ne vidim razlog da se fokusiramo na jedan sport. Fudbal uzimamo kao primer jer ga svi najbolje razumemo. Bejzbol ima pobede, poraze i nereseno, bas kao i fudbal ili kosarka. Hokej ima iskljucenja i kazne neigranja sledece utakmice, bas kao i fudbal, Kosarka to nema, 5 licnih ne znaci neigranje sledece utakmice, ali je to ne cini mnogo razlicitom od fudbala ihokeja, pa i bejzbola.


Citat:
Rezimiraću neke svoje zaključke:
- Postoji samo jedan klub..

A: Klub je firma koja organizuje takmicenja. Klub sam po sebi ne ucestvuje ni u kakvom takmicenju. Timovi su ucesnici takmicenja.
Q:
Citat:
- Za jedan sport postoji samo jedna liga.
- Liga se deli na divizije.

A: Tacno. U takmicarskom smislu (utakmice) svaka divizija je liga za sebe. Divizije u jednom sportu medju sobom dele terene i sudije. Tako, ne moze se jedan sudija dodeliti da sudi utakmicu u diviziji 'godiset 93' i istovremeno da sudi utakmicu u diviziji 'godiste 97'. Jasno je da hokej sudija ne moze da sudi fudbal. Ali nije iskljuceno da je ista osoba sudija i za hokej i za fudbal. U tom slucaju mi vodimo tu osobu na dva mesta, u listi sudija za fudbal i u listi sudija za hokej.
Q:
Citat:

- Sve ovo je pod pokroviteljstvom jednog sportskog kluba.
- Timovi nisu registrovani kod državnih institucija (čitaj timovi nisu pravna lica), nego je to klub.
- Sponzori formalno pravno sponzorišu rad kluba kao celine. Internim aktima (dogovorima) kluba se odlučuje kako se sredstva troše.

A: Tacno.

Q:
Citat:
Čini mi se da ovde nemamo hijerarhije tipa:
- FIFA -> Fudbalski Savez Srbije -> Fudbalski Klub Crvena Zvezda -> Prvi Tim FK CZ,
- Sportsko Društvo Crvena Zvezda -> Košarkaški Klub Crvena Zvezda -> Kadeti KK CZ.

A: Tacno. Ovo postoji, ali mi ne razmatramo taj slucaj. Nas klub se na primer zove Warren Park (Sportsko Društvo Crvena Zvezda) i ima odseke za hokej, bejzbol, fudbal (Košarkaški Klub Crvena Zvezda) Svaki odesk organizuje svake godine interno takmicenje, kucnu ligu, "house league" gde igraju sva deca koja se uclane u klub te gidine. U gradu ima jedno 200 takvih klubova i na nivou grada se oni takmice u nekakvim medjuklupskim ligama, ali to nije predmet naseg zadatka. I te medjuklupske lige na nivou grada, regije, provincije imaju isti problem i potrebu - da organizuju prate svoje takmicenje i da
na kraju proglase pobednika. Gradska liga u hokeju ima 10,000 (dest hiljada) dece, u 12 starosnih kategorija (divizija) i tri nivoa kvaliteteta, po 15-20 timova u diviziji, gde svaki tim odigra 35-40 utakmica u sezoni.

Svi koji su dali strukturu tabela - sifranika: Zahvaljujem, deluje OK, izbacite sta se ne trazi, proverite da li zadovoljava unesite malo podataka i da vidimo da li ce view da izbaci korektnu tabelu. Onda cemo da trazimo sta ne valja.



[ chachka @ 06.09.2006. 11:37 ] @
Podelio sam fajl kojeg sam ranije poslao u tri fajla.

1. fajl sa postfiksom '1 - opis' je pokušaj da svoje razmišljanje prebacim na papir. U u njemu je opis i tok metode rada.
2. fajl sa postfiksom '2 - dodaci' sadrži konkretne produkte rada. To su razne tabele, spiskovi, definicije do kojih sam došao tokom predhodno spomenutog postupka
3. fajl sa postfiksom '3 - prepiska' je jednostavno copz/paste teme na forumu, uz eventualna izbacivanja komentara koji nisu usko vezani za projekat. Na ovaj način sve zahteve i dopune imam na jednom mestu pa mi je laka pretraga (find).

Radovi su još u toku. Prvenstveno postujem stanje projekta jer tokom rada vršim česte izmene, brisanj, dodavanje u fajlu 2. To su mi radne tabele i nepratim njihova pređašnja stanja, nego mi je samo bitan aktuelni sadržaj. Zato ih sada postujem da budu snapshot trenutnog stanja projekta.

Ovo još nije nešto što je za prikazivanje naručiocu projekta. Jedino što bi se u ovoj fazi moglo prikazati jeste 'Dodatak 0 - Svrha i ciljvi baze podataka'. Ali naručilac je to već video i stim se složio.

Izvinite što sporo ide, kriv je fajl 1.

Radovi se nastavljaju...

[ Zidar @ 06.09.2006. 19:11 ] @
@ Chachka:
Hvala Chachka na dokumentima. meni kao kolegi se jako dopadaju. Kao direktoru kluba, opis postupka ne bih razumeo, ali to i nije namenjeno direktoru kluba. Kao narucilac posla bio bih jako zadovoljan da druga dva dokumenta postoje, jer mi pokazuju da konsultant pokusava da odradi korektan posao i zato sto saista liche na nekakvu dokumantaciju, gda kao pise sta se otprilike hoce.

Narucilac posla misli da je zahtev zapisan korektno. Sad ocekuje tabele. Narucilac posla ne razume se u tabele pa mu se ono sto je Chachka napisao u Dodacima cini OK. Provera ce da pokaze ako nesto ne stimuje.

@ Ostali:
Za ostale: da li mogu da pocnem da unosim podatke u tabele koje su ponudjene u prethodnim postovima?
[ inherited @ 06.09.2006. 20:24 ] @
Citat:

Za ostale: da li mogu da pocnem da unosim podatke u tabele koje su ponudjene u prethodnim postovima?

Bilo bi lepo, ako imate vremena, tabele predstaviti SQL kodom. Mislim da bi tada projekat bio potpun za edukovanje.
chacka?
Zidar?
[ chachka @ 07.09.2006. 15:22 ] @
Citat:
inherited: Bilo bi lepo, ako imate vremena, tabele predstaviti SQL kodom.

Od mene će biti.


Inače evo nastavka. Treći fajl (prepiska) nisam postovao pošto nije menjan. Dodao sam ovaj put i četvrti fajl (matrica tabela) koji sam koristio kao pomoćnu tabelu. Obratite pažnju da on sadrži više sheet-ova.

Imam i dodatna pitanja za naručioca projekta pre nego što nastavim.

1. Fokusirajmo se na jednu ligu, npr bejzbol i jednu sezonu npr sezonu Leto 2006. Bejzbol liga je 2006 podeljena na nekoliko divizija. Da li će sve divizije igrati tačno 15 kola, ili će jedna divizija odigrati 13 kola, a neka druga divizija 11 kola?

2. Fokusirajmo se na jednu ligu. Interesuje me odnos jedne sezone prema divizijama. Pošto broj timovi varira od sezone do sezone, da li to variranje utiče i na divizije? Da li svake sezone imate isti broj divizija?
Ovde imam i jedno potpitanje. Rečeno je da ako ima puno devojčica formirate posebnu LIGU za njih. Da nisam ja to pogrešno interpretirao. Da li se u tom slučaju formira posebna LIGA ili posebna DIVIZIJA u okviru postojeće lige? Meni je logičnije da je to posebna divizija, pošto se dele tereni i sudije (a možda i treneri), a mnogo je teže i praviti raspored takmičenja ako su dve lige u pitanju.
[ Zidar @ 07.09.2006. 18:35 ] @

Q: 1. Fokusirajmo se na jednu ligu, npr bejzbol i jednu sezonu npr sezonu Leto 2006. Bejzbol liga je 2006 podeljena na nekoliko divizija. Da li će sve divizije igrati tačno 15 kola, ili će jedna divizija odigrati 13 kola, a neka druga divizija 11 kola?
A: OK, neka bude jedna liga.

2. Fokusirajmo se na jednu ligu. Interesuje me odnos jedne sezone prema divizijama. Pošto broj timovi varira od sezone do sezone, da li to variranje utiče i na divizije? Da li svake sezone imate isti broj divizija?
A: Broj divizija svake sezone se menje, broj timova po diviziji je promenljiv - zavisi od broja dece u datom uzrastu.

Q: Ovde imam i jedno potpitanje. Rečeno je da ako ima puno devojčica formirate posebnu LIGU za njih. Da nisam ja to pogrešno interpretirao. Da li se u tom slučaju formira posebna LIGA ili posebna DIVIZIJA u okviru postojeće lige? Meni je logičnije da je to posebna divizija, pošto se dele tereni i sudije (a možda i treneri), a mnogo je teže i praviti raspored takmičenja ako su dve lige u pitanju.

A: Ovde rec LIGA pravi kofuziju. Kad kazem 'liga u okviru sezone' to znaci otprilike isto sto i divizija. Dakle, 'liga' = 'divizija'. Mogu da igraju u okviru iste sezone u Julu devojcice i decaci pomesano, to je jedan divizija i jedna liga. Onda u augustu napravimo novu ligu, novo takmicenje, samo za devojcice.

Izvinjavam se za konfuziju, nisam ni bio svestan da sam koristio dva termina za ono sto je us sustini isto. Dobar analiticar medjutim istera stvari na cistac. U ovom slucaju, Chachka je odlicon reagovao i naterao direktora lige da i sam shvati da je liga i divizija isto. Barem u nasem slucaju. Ne pominjite mi cetiri grupe druge lige u bivsoj Jugoslaviji. To bilo bi jedna liga, cetiri divizije. U nasem sportskom klubu je sve to isto.

Da izbegnemo dalju konfuziju, pojednostavimo zahtev do kraja sve, ovako:
- jedan sport je u pitanju
- Postoji nekoliko grupa timova koji mogu da igraju medjusobno. (takmicarske grupe, lige, divizije, i bilo koji drugi naziv)
- Oni igraju po liga sistemu, svako sa svakim, tacno jednom, u okviru svoje grupe.
Na primer: u skoli se igra fudbal, prevenstvo skole po odeljenjima. Sva odelenja drugog razreda igraju medjusobno, sva odelenja trecg razreda igraju medjusobno, ne moze treci razred protiv prvog ili drugog, znaci, u okviru svoje grupe koja je definisana nekako, nije vazno kako. A nastavnica fiskulture hoce da prati rezultate i postavi tabelu na skolskoj oglasnoj tabli svakog ponedeljka. Svi igraju na skolskom rukomatnom igralistu.
- Ako se sva takmicenja po grupama odigravaju na istim terenima, i sude im iste sudije, jasno je da se dve utakmice ne mogu odigravati u isto vreme na istom terenu.
- Isto ovo vazi i za sudije, pa mozemo da izbacimo i sudije iz igre: 'jedan sudija ne moze da bude na dve utakmice u isto vreme' je ekvivalentno recenici 'jedan teren ne moze da se koristi za dve utakmice u isto vreme' kako resite za terene, analogno ce biti i za sudije, pa da ne gubimo vreme.

Znaci, zaboravite na sudije. Ostaje uslov da se svakoj utakmici dodeli teren u dato vreme. Sve utakmice traju isto, pa se teren dodeljuje na po jedan sat. Sve utakmice pocinju u pune sate. Znaci, ako je teren dodeljen jednoj utakmici na dan 12 Jul 2007, 16:00 sati, ni jedna druga utakmica ne moze da se igra na tom terenu 12 Jula 2007 u 16:00 sati. Ovo bi trebalo da bude jednostavnije nego upotreba terena Od - Do.


[ delalt @ 08.09.2006. 01:15 ] @
Evo i nekakvo moje rješenje Amaterskog Ligaškog Takmičenja U Sportovima (ALTUS v.0.01).
Nazvao sam malo drugačije, da ne dođe do zabune
Naravno, još je u ranoj fazi, znači, samo da se uključim u diskusiju.

U prilogu su dijagram, SQL fajl i baza (ako je mognem okačiti).

Opisaću dijagram:
Tabele SEZONE, SPORTOVI, TIMOVI, IGRACI, SUDIJE, DIVIZIJE, SPONZORI, TERENI su šifarnici kod kojih je važno obezbijediti jednoznačnost podataka.
To sam riješio UNIQUE indeksima po kolonama JMBG (za tabele IGRACI, SUDIJE, a može i treneri).
Znači, npr. u tabeli IGRAČI se jedan igrač upisuje samo jednom, bez obzira na pol, uzrast, pripadnost nekom timu... Isto važi i za sudije.
Za ostale šifarnike to je polje XXXX_ID, u nedostatku nekog drugog koje bi bilo pogodno.

Tabele UTAKMICE, UTAKMICE_IGRACI, TIMOVI_IGRACI, SPORTOVI_SUDIJE predstavljaju tabele relacija među pojedinim šifarnicima, važnim za praćenje pojedinih događaja.

U tabeli UTAKMICE vodi se evidencija o svim utakmicama i njihovim rezultatima, bez obzira o kojoj sezoni, sportu, kolu, diviziji se radi. U njoj se UNIQUE indeksima po određenim kolonama ili više njih, a i sa CHECK CONSTRAINTS i REFERENTIAL CONSTRAINTS sprečava unošenje po zahtjevima:

Citat:
Zidar:
Baza mora da spreci greske u prekucavanju, na primer:
- jedan tim se u kolu pojavljuje u dve utakmice
- tim igra sa samim sobom
- nepostojeci tim se pojavljuje
- da ne moze u istom kolu jedan sudija suditi dve utakmice


Ovdje sam ja u CHECK CONSTRAINTS dodao i provjeru da su oba tima iz iste divizije.
Pitanje za direktora: da li je ovo potrebno i treba li još nešto provjeravati kod utakmica?

Ovdje mi je potrebna pomoć "ostalih". Provjera da "jedan tim se u kolu pojavljuje u dve utakmice" je urađena polovično, UNIQUE INDEX-ima po kolonama SEZONA,SPORT,KOLO,DOMAĆIN i SEZONA,SPORT,KOLO,GOST. Treba spriječiti i situaciju da isti tim bude jednom upisan kao domaćin, a drugi put kao gost, znači, dva puta pojavljivanje u istom kolu iste sezone.

Za STATUS utakmice, pored vrijednosti 1,2,3,4 koje su već navedene, dodao bih još i vrijednost "0" - predviđena, još ne odigrana utakmica.
U tabelu UTAKMICE se unose samo šifre timova iz tabele TIMOVI.

Tabela TIMOVI_IGRACI se koristi za praćenje transfera igrača i kretanje unutar tima (POZICIJA), bez obzira na sezonu, sport, kolo.... Upisuju se šifre TIM, IGRAC, DATUM_OD kada je igrač u tom timu, na određenoj poziciji, koji broj dresa nosi i kakvu mu ocjenu daje trener za igranje baš na toj poziciji.
Kad igrač iz bilo kog razloga napusti tim ili promijeni poziciju, upiše se DATUM_DO.
Za igrača koji ga mijenja upisuju se u novi red šifre TIM, IGRAC, DATUM_OD kada je igrač u tom timu, na određenoj poziciji, koji broj dresa nosi i kakvu mu ocjenu daje trener za igranje baš na toj poziciji. Slično je i kada igrači mijenjaju pozicije u istom timu.
Lista trenutno aktivnih igrača jednog tima se dobija SQL upitom kod koga se za postavlja uslov šifra tima i da je polje DATUM_DO prazno, uz JOIN na tabelu IGRACI, da se dobiju prezime, ime, JMBG, adresa...
Treneru će možda dobro doći podaci o transferima i ocjenama igrača...
Vezano za spisak igrača koji su učestvovali na nekoj utakmici se dobija SQL upitom gdje se
kao uslov prate šifre timova, igrača i uz DATUM_OD da je manji od datuma održavanja utakmice i DATUM_DO da je prazan ili da je veći (igrač je prijavljen u tim prije samog održavanja utakmice, a nije ga kasnije napustio ili je to učinio poslije održavanja utakmice). Ovime je zadovoljen uslov da igrači mogu u toku sezone da promijene tim.

Citat:
Zidar:
Ako se tokom sezone desi da je neki tim prejak ili preslab, mi jednostavno izpremestamo igrace, tako da odnos snaga bude ravnomerniji. Otuda ono da igrac moze da promeni tim u toku sezone.


Ovdje bi trebalo ubaciti nekakve provjere, na primjer da li su sve pozicije u timu popunjene, da tim bude kompletan za utakmicu, da li možda ima viška igrača...
Za sada ću se zadržati na ovome, pošto trener to lako može sam da prati.

U tabeli UTAKMICE_IGRACI vodi se u stvari evidencija o uspjesima i kaznama za pojedine igrače. Kolone su same po sebi dosta jasne, ali je tabela dosta grubo napravljena, jer mi trebaju nekakva pojašnjenja. Recimo, ako na fudbalskoj utakmici igrač da auto gol. Da li mu to upisivati kao -1 (za statistiku voditi kao regularni golovi minus auto golovi) ili ih voditi odvojeno i ne sabirati.
Za hokej, a pogotovo za bejzbol mi je nepoznato šta sve treba evidentirati (kakve i kako se mjere kazne, kakve sve mogu biti pozicije igrača, postoje li posebno vrednovani poeni kao "trica" u košarci...?).
Ova tabela je važna i zbog zahtjeva da se mogu pratiti kažnjeni igrači koji ne treba da igraju na nekim od sledećih utakmica.
Znam da je ovaj zahtjev kasnije izbačen odlukom direktora, ali bih ipak želio da probamo da ga riješimo. Ovo isto važi i za novu odluku da se prati samo jedan sport, čini mi se da neće previše komplikovati ako se prati više sportova.
Još jedno pojašnjenje u vezi ove tabele. Ona će po svojoj prirodi imati nepopunjena polja,
na primjer, u fudbalu nema vrijeme isključenja igrača, kao kazna.
I prateći više sezona, tu će biti relativno malen broj podataka, tako da neće bitno utjecati na veličinu i brzinu baze. Onaj ko bude radio interfejs može u zavisnosti od sporta o kome se radi da prikazuje samo neophodne kolone. Ako bude potrebno može se podijeliti i u više manjih tabela.

Za sada nisam uradio upite koji bi dali tabele rangiranja i rezultata, ali biće i to.
Naravno, sve sugestije i primjedbe su dobrodošle.

Prikačio sam određene fajlove, a iako je zahtjev da se samo isprojektuje, mislim da svi koji ovo probavaju imaju i nekakvu testnu bazu. Možda bi bilo lijepo da vidimo kako je ko implementirao koristeći MySQL, PostgreSQL, Interbase, Firebird, MSSQL... ili nekakvu manje poznatu bazu. Okačite to i dajte nekakve propratne napomene, šta je u pitanju, koja verzija servera, čime napraviti backup/restore, kako najlakše pogledati...
Ja sam probao sa Firebird 1.5.3, dijagram sam pravio besplatnim alatom IBEasy+ v.1.5.1,
na Windowsu. Inače je firebird baza u jednom fajlu i dovoljno je raspakovati i kopirati kao takvu, ko se ne snalazi sa restore i otvoriti i pogledati alatom. Objasnite postupak za druge baze.
Ako šta zapne, za sva pitanja idite na podforume, da ne miješamo u ovoj temi.
[ chachka @ 08.09.2006. 12:48 ] @
Komentarisacu druge projekte cim stignem. Cini mi se da je tema odumire.

Postujem stanje projekta, i napokon imam ER dijagram.

[ Zidar @ 08.09.2006. 15:49 ] @
Zahvaljujem Chachki i Delalt na prilozima.

Komentarisacu Chachkin prvo, jer mi je to najbrze, a Delalt i resenja ponudjena ranije u diskusiji - pogledacu cim stignem, nesto danas, nesto posle vikenda. Zakacicu word dokumant sa komentarima za Chacku. Na kraju je dat i zahtev za SELECT iskaze koji ce trebati da bismo odgovorili na neka pitanja kad baza krene u produkciju. Molim da svi koji zele da rade svoju verziju modela pogledaju zahteve za SELECT izrazima.
[ chachka @ 08.09.2006. 16:40 ] @
Citat:
delalt: Treba spriječiti i situaciju da isti tim bude jednom upisan kao domaćin, a drugi put kao gost, znači, dva puta pojavljivanje u istom kolu iste sezone.

I ja sam uočio da je to problem. To se može obezbediti upotrebom UNIQE i FOREIGN KEY, ali se tada lepa tabela UTAKMICE mora razbiti do neprepoznavanja na 3-4 tabele. To nema smisla.
Nažalost još ne postoji CREATE ASSERTION ni u jednom SUBP-u, pa će se sigurno morati upotrebiti proceduralni stil programiranja.

Citat:
delalt: Za STATUS utakmice, pored vrijednosti 1,2,3,4 koje su već navedene, dodao bih još i vrijednost "0" - predviđena, još ne odigrana utakmica.

Da, a druga mogućnost je da se NULL status smatra još neodigranom utakmicom.

Citat:
delalt:
U tabeli UTAKMICE_IGRACI ...... Ona će po svojoj prirodi imati nepopunjena polja ..... Ako bude potrebno može se podijeliti i u više manjih tabela.

Tabela UTAKMICE_IGRACI po mom ukusu ima previše NULL polja. To je znak da se radi o tabeli koja nije dobro projektovana. To je ono što sam i ja napomenuo naručiocu projekta - da se kazne i statistike razlikuju od sporta do sporta. Da je istrajano u zahtevima za statistikom (to će biti dopuna, GARANT :) ), verovatno bi se u mom modelu pojavile posebne tabele za fudbal, bejzbol, hokej. To je to što kažeš da se tabela podeli u više manjih. Glasam za podelu.

JOŠ NEŠTO:
Nazalost tvoj CHECK
Code:

ALTER TABLE "UTAKMICE" ADD CONSTRAINT "CH_UTAKMICE_1"
  CHECK (    (UTAKMICE.DOMACIN <> UTAKMICE.GOST)
         AND ((SELECT T1.DIVIZIJA
                 FROM TIMOVI T1
                WHERE T1.TIM_ID = UTAKMICE.DOMACIN)
               =
              (SELECT T2.DIVIZIJA
                 FROM TIMOVI T2
                WHERE T2.TIM_ID = UTAKMICE.GOST)));

jeste pokriven SQL standardom, ali ga guta samo FireBird/InterBase. Upotrebom SELECT-a u CHECK-u se može sprečiti slučaj kojeg sam prvog citirao.

[Ovu poruku je menjao chachka dana 08.09.2006. u 18:01 GMT+1]

[Ovu poruku je menjao chachka dana 08.09.2006. u 18:01 GMT+1]
[ Zidar @ 08.09.2006. 19:22 ] @
Pogledao sam samo sliku modela baze koju je prilozio Delalt. Komentari su u zakacenom fajlu.

Sto se tice problem da domaci i gostujuci tim ne budu isti tim, zar ne moze prosto ( CHECK Domacin <> Gost ) ?
[ chachka @ 08.09.2006. 19:32 ] @
Delalt je mislio na rešavanje problema kad u istom kolu staviš u jednoj utakmici da igraju Tim1 - Tim2, a u drugoj Tim2 - Tim1.
[ inherited @ 09.09.2006. 13:00 ] @
E, sad, ako ste usvojili model baze, napravili sve prepiske, dodatke..., ajde Zidar posto si narucilac projekta napravi sve u jednom, sto su chacka i delat odradili. Radi preglednosti, snalazenja, itd. Ako ima jos stvari koje treba doraditi, sacekacemo, ali neka se zavrsi sve u jednom usvojenom modelu (ER dijagram, spisak tabela
sa konacnim atributima, sql kod, a ne bi bilo lose staviti u ER diagram, iznad relacije njenu vrednost, znacenje (1:1,1:N,N:M)).

p.s. ne treba dozvoliti da projekat odumre, treba samo korektno da se zavrsi, a i prema nama koji s uzivanjem pratimo.
[ delalt @ 10.09.2006. 22:20 ] @
Hvala svima na komentarima.
Čini mi se da svi imamo nekakve redovne obaveze, pa ne bi trebalo ovo još objedinjavati.
I vikend nekad treba iskoristiti baš za odmor .
Ja sam napomenuo da je moj dijagram još u ranoj fazi, sa dosta nedovršenih stvari.
Potrudiću se i da objedinim i praćenje golova i kazni (mislim i da je Chacka za ovo, a i drugi),
iako je ovo kao zahtjev kasnije izbačeno. Mislim da bi izvještaj u bilo kojem sportu bio baš nepotpun
bez evidencije o postignutim golovima (poenima...). Zato molim direktora da mi samo još malo pojasni
pravila hokeja, bejzbola... što se tiče igrača, pogodaka i kazni, ili je sve o ovome rečeno?
A ako postoji još kakav sport koji je u planu u bliskoj budućnosti, da i njega malo pojasni.
Ako ovo ne bude baš trebalo, na kraju ću lako izbaciti, da se uklopimo u konačne zahtjeve.
Zato sam i ostavio kolone, u nekim tabelama, koje se zovu SPORT...
Ako se ne kraju odlučimo da pratimo samo fudbal, tu će biti ograničeno samo na unos "FUDBAL" (ili šifre za fudbal).
Komentari i prijedlozi su i dalje dobrodošli.
[ Zidar @ 11.09.2006. 14:26 ] @
[Quote]Delalt je mislio na rešavanje problema kad u istom kolu staviš u jednoj utakmici da igraju Tim1 - Tim2, a u drugoj Tim2 - Tim1.[/quote]
U pravu set 100%. Ovoga se nisam setio. Odlicna observacija konsultanta
U modelu koji je predlozio Chachka dakel mozemo da obezbedimo sledece:
1. ni jedan tim ne moze da bude domacin vise od jednom u jednom kolu (UNIQUE constraint UC1)
2. ni jedan tim ne moze da bude gost vsie od jednom u jednom kolu (UNIQUE constraint UC2)
3. tim ne moze da igra protiv samog sebe (CHECK)
Sta ne mozemo da pokrijemo - isti tim moze u istom kolu da bude jednom gost a jednom domacin. Gresim, nije tacno da ne mozemo, mozemo, ako je baza koju koristimo prati SQL standard. Delalt je tacno (verujem) napisao kako se to izvodi, a Chachka je odlicno primetio da to moze samo u dve baze, a ne moze recimo u ORACLE ili SQL, ne na taj nacin. Valjda bi trigger morao da se pise, da to obezbedi.

Ako bismo malo drugacije modelovali utakmice i timove, i problem "jedan tim gost/domacin u istom kolu" bi mogao da se resi. Pitanje je samo da li je to vredno truda i problema koje donosi. Ako pazljivo pogledamo tabelu Utakmice, u svim ponudjenim modelima imamo Domacin, Gost kolone. Formalno, to je narusavanje 2NF mislim. Svaka utakmica 'ima' dva tima. Ako ih ziovenmo Tim1 i Tim2 onda se lakse vidi da narusavamo 2NF. To je isto kao kad bi stavili u fakturi kolone Proizvod1, proizvod2, proizvod3...ProizvodN. Zbog tog narusavanja 2NF imamo dav UNIQUE constraints i CHECK i problem da pokrijemo zahtev "jedan tim ne sme biti gost i domacin u istom kolu". Ako bi timovi bili u dodatnoj tabeli TimoviKojiIgarjuUtakmicu, bilo bi Utakmica : TimoviKojiIgarjuUtakmicu= 1 : 2. Jedan jedini UNIQUE Constraint na tabeli TimoviKojiIgarjuUtakmicu bi obezbedio da
- svaki tim u jednom kolu se pojavljuje ne vise od jednom => ne moze biti Tim1 i Tim 2 istovremeno. Takodje sledi da se ne moze pojaviti dva puta u istom kolu i sledi da ne moze da igra protiv samog sebe, jer svi ovi uslovi narusavaju jedan te isti UNIQUE constraint. Ja ipak ne preporucujem ovaj nacin, jer se ni u jednom SQL sistemu, ni po standardu ne moze obezbediti trazeni kardinalitet. Mozete nekako (triggeri?) da obezbedite da utakmica nema vise od dva tima u tabeli TimoviKojiIgarjuUtakmicu, ali ne mozete da garantujete da ce uvek biti bas dva. Mozete da sprecite da se obrise jedan od dva tima, ali na INSERT idu jedn po jedan. Sta ako prvi ISNERT prodje, a drugi ne? Reci cete - resenje je stored procedure, ali ko ce da mnatera programera da koristi store procedure. Stored procedure su ekvivalentne resenju na front endu. Znaci, teorijski, kardinalnost se ne moze ili se jako tesko obezbedjuje bez oslanjanja na front end.

Ja u praksi koristim model koji je dao Chachka, a uslov da se jedan tim ne moze pojaviti u jednom kolu vise od jednom, bilo kao gost ili domacin obezbedjujem algoritmom za kombinovanje timova, koji za svako kolo uzima svaki tim tacno po jednom. Znaci, opet se oslanjam na front end. ne kazem da se ne treba oslanjati na front end, samo kazem da se ponekad bez front enda ne moze.

Kad budete izracunavali tabelu iz tabele Utakmice koja ima kolone Domacin i Gost, opet ce vas udariti po glavi narusavanje 2NF, keviriji ce bit prilicno zakukuljeni. Ipak, te cete kverije napisati jednom u zivotu i gotovo. Ostali stvari koje ce doci kad se bude pravio front end - prezentacija podataka korisniku, unos, editovanje su monog, ali mnogo, laksi ako se prihvati ovakva nepotpuna normalizacija. bar je meni bilo mnogo lakse.

Medjutim, kad dodje do zapsivanja kazni, opet problemi. Kako cete da zpiste kazne za igrace koje su zaradili na jednoj utakmici, za oba tima? Zamislajmo neki FK sa tabele Utakmice na tabelu Kazne. FK, ali sa kojih polja? Ispada (Utakmica,Domacin) u tabeli Utakmice motra da odgovara (Utakmica,Domacin) u tabeli Kazne. Ali, isto tako mora (Utakmica,Gost) da odgovara (Utakmica, Tim) u tabeli Kazne. A to ne moze da se postavi u SQL. Da pravimo jednu tabelu za kazne koje se pripisuju Gostu i jednu za kazne koje se pripisuju Domacinu? Tek onda ulazite u probleme.

Kad sam malo razmislio o svemu ovome, odlucio sam da redukujem pocetni zahtev. To je problem relacionih baza. Do jenog nivoa slozenosti, moguce je napravidi razumljiv model. Kad se predje odredjeni prag, stavri se eksponencijalno usloznjavaju. Tada je pravo vreme da se malo model denormalizuje. Kad nastupa pravi trenutak za denormalizaciju, tesko je reci. Tu pocinje umetnost, pocinje ulogu da igra praksa i iskustvo a prestaje da bude primarna teorijska nauka. Na zalost, programeri su sve bolji i bolji i na front endu se bukvalno sve moze resiti. Zbog toga se mnogi projekti prerano rastanu sa normalizacijom. Sve flat tabele sa po 250 kolona, lepo spakovane u SQL ili ORACLE a timovi programera vredno rade na odrzavanju baze i super s eosecaju jer je bukvalno savki, pa i najprostiji zahtev pravi programerski izazov. A dobri programeri uzivaju u izazovima.

Posto mislim da smo dostigli tacku posle koje se nas model veoma usloznjava, ne mislim da pravim 'potpun model' kako je Inherited zatrazio
Citat:
ajde Zidar posto si narucilac projekta napravi sve u jednom, sto su chacka i delat odradili. Radi preglednosti, snalazenja, itd

ako neko hoce, uzmite Chachkin model i dodajte 'sport'. Onda dodajte recimo Sudije, tako da svaki sudija moze da sudi samo sport za koji je kvalifikovan. Rezultujuci model ne bi trebao da narusi nist od ovoga sto vec imamo, treba samo dodati po kolonu ili dve tu i tamo, i jos po neku tabelu. Videcete da nije ni malo jednostavno.

Postojeci model je u praksi sasvim dovoljan. Ako ga prodate fudbalskom savezu sta vas briga za kosarku i bejzbol. Mali klubovi koji imaju vise sportova su dovoljno mali da se tacni poadci mogu obezbediti veoma lako 'rucnim nacinom i kontrolom'. Ako je Laza sudija za hokej, a Pera sudija za bejzbol, malo je verovatno da ce ih direktor kluba pomesati. Ako se i napravi greska, to se lako ispravlja, i na terenu i u bazi - greska nije skupa.

Zato bih da zastanemo ovde sa razvojem modela. Ostaje zahtev da se naoisu kveriji koji izracunavaju tabelu i odgovaraju na pitnja koja sam postavio u postu od petka.

[ chachka @ 11.09.2006. 16:15 ] @
Nisam jos procitao gornji post :)

Saljem trenutno stanje. Jos nisam zavrsio, jer:
- nisam obradio sva pravila poslovanja
- nisam obradio sve zahteve za informacijama
- nisam resio sigurnost baze

Nisam uradio zabranu preklapanja termina, jer je to prica za sebe! Takodje nisa zadovoljan pogledom koji generise stanje na tabeli jer jos nezna da sortira tabelu po petom kriterijumu (medjusobni skor timova) niti jos ispisuje pozicije.

Zadrzao sam dugacka imena u SQL skripti sto moze da zasmeta nekim DBMS-ima. Mrzelo me da ih skracujem, koliko god to glupo zvucalo. Ja cesto koristim atribute cija su imena 20 znakova. Preterujem ali ne mogu da se izlecim :)

Delalt je u pravu da se projekti ne mogu spajati. I nije poenta u spajanju. Sta fali da imamo 2-3 pa i 5 nezavisnih projekata? Svako moze posle da odabere svog favorita. SLOBODA IZBORA.

Model je pretrpeo izmene, saljem i SQL skript.

SQL skript sam podelio na 3 dela:
- Standardni - koji bi trebao da prodje na vecini DBMS-a (ako se ne varam IB nece progutati zbog CASE i COALESCE). Ovde su i INSERT-i za popunjavanje tabela sa kodovima.
- PostgreSQL - ovo nije alternativa, nego nastavak prethodnog ali radjen tako da prolazi na PostgreSQL-u. Ovde su prvenstveno resene funkcije za generisanje i proveru sifre trenera i deteta (nije vise igrac!), i njihovo automatsko dodeljivanje nakon INSERT-a. Ovde je resen i CREATE ASSERT upotrebom trigera koji brani da se jedan tim pojavi dva puta u istom kolu.
- Testni podaci - ovde su neki moji test podaci.

Projekat sam izdelio na vise fajlova, a poslao sam i sve u jednom fajlu da nemorate da skidate jedan po jedan.


@narucilac projekta
Ipak se moram vratiti na vezu izmedju kola i divizija. Rekli ste da "Broj kola jeste broj timova u diviziji minus jedan”. Ako jedna divizija ima 4 tima a druga 7 timova, prva divizija ce se zavrsiti nakon 3 nedelje, a druga ce se igrati jos cele tri nedelje. Zasto deca iz prve divizije ne odigraju jos jedan krug utakmica (tj jos tri kola svako sa svakim)? Rekli ste da je cilj da se svi igraju!

[ chachka @ 11.09.2006. 16:19 ] @
Nemoze vise od 7 fajlova :(
[ chachka @ 11.09.2006. 16:47 ] @
Citat:
Zidar: Ako bismo malo drugacije modelovali utakmice i timove, i problem "jedan tim gost/domacin u istom kolu" bi mogao da se resi. Pitanje je samo da li je to vredno truda i problema koje donosi.

Ne vredi

Citat:
Zidar: Formalno, to je narusavanje 2NF mislim.

Mislis na narusavanje 1NF - ponavljajuce grupe atributa.
U svakom slucaju ni ja nisam za dodavanje jos jedne tabele, niti mi se cini da ovo narusava 1NF jer UVEK ima TACNO 2 ucesnika u utakmici. Utakmica je takmicenje izmedju dva tima (citajte moje definicije :) i to je jedinstvena cinjenica (iskaz) koja zasluzuje da se nalazi na jednom mestu (tabeli).
Ja 1NF interpretiram "ako postoji atribut koji se ponavlja varijabilno od slucaja do slucaja pa se nekad pojavi 4 puta, nekad 7 puta, a nekad 12".
Ni jedan DBMS koliko ja znam ne dozvoljava varijabilan broj atributa (kolona) u svojim tabelama, pa stoga ni jedna tabela ne moze da narusi 1NF.

Citat:
Zidar: Znaci, opet se oslanjam na front end.

Tako ce biti (u ovom sliucaju) dok se ne implementira CREATE ASSERTION (CHECK izmedju vise tabela)!

Citat:
Zidar: ako neko hoce, uzmite Chachkin model i dodajte 'sport'. Onda dodajte recimo Sudije, tako da svaki sudija moze da sudi samo sport za koji je kvalifikovan.

Uradicu to ja ako narucioc projekta bude trazio (Ima da traje do Nove Godine :). Cak sam mislio da je odustajanje od kazni i sudija samo odlaganje i ostavljanje necega i za 'Sve ovo lepo radi, ali mi sad ocemo i ....'.

[Ovu poruku je menjao chachka dana 19.12.2008. u 09:11 GMT+1]
[ Zidar @ 11.09.2006. 17:59 ] @
Q:@narucilac projekta
Ipak se moram vratiti na vezu izmedju kola i divizija. Rekli ste da "Broj kola jeste broj timova u diviziji minus jedan”. Ako jedna divizija ima 4 tima a druga 7 timova, prva divizija ce se zavrsiti nakon 3 nedelje, a druga ce se igrati jos cele tri nedelje. Zasto deca iz prve divizije ne odigraju jos jedan krug utakmica (tj jos tri kola svako sa svakim)? Rekli ste da je cilj da se svi igraju!

A: Sve je tacno sta kazes. Bolje je recin 'minimalan broj kola u ligi da bi svako sa svakim igrao bar po jedamput jeste N-1, N = broj timova'. Naravno da cemo samo ponoviti sve utakmice, dokle god ima raspolozivih terena i vreme to dozvoljava.

Sto se tice dopune modela kaznama, registracijam, listom strelaca - i dalje stoji da je to direktor kluba izbacio iz zahteva. rekao mu bratanac da to moze da se uradi, ali ce strasno da zakomplikuje i poskupi ceo projekat. Posto je broj pojava kazni jako mali, dovoljan je i najobicniji rokovnik, batali kompjutere.

Ovo nema veze sa bazama podataka, ali lepo je da se zna: Nas klub namerno ne zeli da vodi listu strelaca niti bilo kakve druge individualne statistike. Akcenat je na timskom radu, da je sve uspeh tima. Zbog ogromen razlike u kvalitetu dece, jasno je da u realnom zivotu u ovakvom tipu organizovanja sportskih aktivnosti, u svakom timu postoje deca koja dominiraju i igraju gotovo sami. Nas cilj je ne da najbolji postanu jos bolji, nego da najslabiji pristignu one bolje. Za najbolje, koji zele da jos vise napreduju, postoje drugi vidovi takmicenja, na visem takmicarskom nivou. Tamo nema milosti. Bas kao i srpska prva liga u fudbalu, igraju najbolji, ostali sede na klupi i gledaju sa nadom da jednom mozda uskoce u prvi tim ako dobiju sansu. Nase osnovo pravilo je su 'absolutno nema favorizovanja dece, svi dobijaju podjednaku minutazu na utakmicama i svi su podjednako vazni za uspeh tima' Svi koji pomazu u klubu, treneri, orhanizatori, svi su na istoj talasnoj duzini tako da nema nikave potrebe za prisilom i preteranom kontrolom.

Pogledacu SEELCT izkaze i racunanje stanja na tabeli.

@Chachka:
Q: Nisam uradio zabranu preklapanja termina, jer je to prica za sebe! Takodje nisa zadovoljan pogledom koji generise stanje na tabeli jer jos nezna da sortira tabelu po petom kriterijumu (medjusobni skor timova) niti jos ispisuje pozicije.
A: Ako bas hoces prbaj to da odradis, a mozes i da ostavis gde je. Dovoljno je slozeno i ovako. Ako se zakomplikuje mnogo, mnogi ljudi nece dalje moci da prate

Hteo sam malo i da pokazem kako izgleda zivot projektanta baze. U realnm zivotu, narucioci su mnogo gori nego ja u opisvanju problema. Ja sam se zaista trudio da opisem zahtev, dakle STA treba da se uradi, bez sugerisanja KAKO to u stvari izvesti. I pored truda da budem kratak i jasan, pola vremena smo potrosili da razjasnimo i shvatimo sta se u stvari hoce. Posle je sve bilo cista tehnika. Setite se toga kad se pojavi neko sa zahtevom da mu se uradi 'mali programcic' za ovo ili ono. Zasto 'mali'? Zasto 'programcic'? Ikonica na desktopu je mala. A iz ikonice, ko zna sta je sve i kolko je malo ili veliko.

Tema je do danas (11 sep 2006) imala preko 750 razgledanja, sto znaci da nismo promasili temu.

Hvala svima na saradnji


[Ovu poruku je menjao Zidar dana 11.09.2006. u 22:02 GMT+1]
[ delalt @ 13.09.2006. 21:47 ] @
Citat:
Zidar:
Sto se tice dopune modela kaznama, registracijam, listom strelaca - i dalje stoji da je to direktor kluba izbacio iz zahteva. rekao mu bratanac da to moze da se uradi, ali ce strasno da zakomplikuje i poskupi ceo projekat. Posto je broj pojava kazni jako mali, dovoljan je i najobicniji rokovnik, batali kompjutere.

Evo, neću više da forsiram proširenje zahtjeva. Chachka se stvarno potrudio i uradio dosta posla. Iz njegove priložene dokumentacije može se štošta naučiti.
Ja sam krenuo malo sa širim obimom zahtjeva, zbog kojih sam se u samom početku odlučio za određeni dizajn tabela.
Eto, i sam "malen" zahtjev da se osigura da se isti tim ne može dva puta pojaviti u istom kolu jedne sezone može dosta da iskomplikuje i promijeni dizajn baze. Ovo je bio zahtjev od samog početka, ali zamislite da je to napomenuto na samom kraju, kad je već skoro završeno, napisani SQL upiti... Vrati vas skoro na početak, redizajn tabela, mora ići i redizajn međusobnih zavisnosti, SQL upiti se mijenjaju ili pišu ponovo. Još ako takvih zahtjevčića ima više, skoro pa dupli posao.
Zato sam predvidio mogućnost da se radi o više sezona, više sportova, da treba voditi evidenciju o igračima i njihovom transferu ili odlasku iz tima kroz duži vremenski period, tako i o rezultatima i kaznama na svakoj utakmici. Napominjem da neću da proširujem konačne zahtjeve, ali ću još samo postaviti malo modifikovan dijagram (i dalje nezavršen), zbog ideje kako riješiti onaj već pomenuti problem "da se isti tim ne može dva puta pojaviti u istom kolu jedne sezone". Jedno rješenje je već pomenuto, ako bude moguće koristiti SELECT unutar CHECK-a.
Drugo rješenje je dodavanje jedne pomoćne tabele UT_CHK i korištenje trigera. Triger u ovu pomoćnu tabelu za svaki jedan red u tabeli UTAKMICE upisuje dva reda u tabelu UT_CHK, jedan za domaćina (u kolonu DG se upisuje "1", a drugi za gosta (u kolonu DG se upisuje "2"). Ostale kolone se prepisuju iz tabele UTAKMICE. Sad se još postave UNIQUE indeksi, a transakcija obezbjedi da se uvijek upišu ili obrišu oba reda za istu utakmicu.
Tako se zadržavaju u tabeli UTAKMICE dvije kolone (DOMAĆIN i GOST) jer je takva struktura dosta pogodna (Zidar je to detaljno pojasnio), a pomoćna tabela služi samo zbog onog uslova, i na nju ne treba više obraćati pažnju ni onaj ko radi interfejs, a ni onaj ko koristi bazu. Možda rješenje nije baš uobičajeno, ali možda nekome nekad i riješi problem.
Ostalo zanemarite, trebalo bi i za neke druge tabele takođe koristiti SELECT unutar CHECK, ali to neću dalje razmatrati. Međutim, ovakvi CHECK-ovi bi mogali da skrate dosta posao (puno prije Nove godine).
Eto, i ovo se uklapa u temu "Teorija vs. praksa", po SQL standardu je, a ne može se koristiti u praksi čak i u nekim poznatijim DBMS-ovima.
I dalje ostaje poziv da okačite svoja rješenja, a interesuje me i implementacija na raznim DBMS-ovima (da li ovo može da prođe).
Code:
CREATE TABLE "UT_CHK" 
(
  "SEZONA"     VARCHAR(8) NOT NULL,
  "SPORT"     VARCHAR(8) NOT NULL,
  "KOLO"     VARCHAR(8) NOT NULL,
  "TIM"     VARCHAR(8) NOT NULL,
  "UTAKMICA_ID"     VARCHAR(8) NOT NULL,
  "DG"     SMALLINT NOT NULL,
CONSTRAINT "PK_UT_CHK_1" PRIMARY KEY ("UTAKMICA_ID", "DG")
);

CREATE UNIQUE INDEX "IDX_UT_CHK_1" ON "UT_CHK"("SEZONA", "SPORT", "KOLO", "TIM");


CREATE TRIGGER "TRIG_UTAKMICE_1" FOR "UTAKMICE" 
ACTIVE BEFORE INSERT POSITION 0
as
BEGIN
INSERT INTO UT_CHK (SEZONA, SPORT, KOLO, TIM, UTAKMICA_ID, DG)
VALUES (UTAKMICE.SEZONA, UTAKMICE.SPORT, UTAKMICE.KOLO,
UTAKMICE.DOMACIN, UTAKMICE.UTAKMICA_ID, 1);
INSERT INTO UT_CHK (SEZONA, SPORT, KOLO, TIM, UTAKMICA_ID, DG)
VALUES (UTAKMICE.SEZONA, UTAKMICE.SPORT, UTAKMICE.KOLO,
UTAKMICE.GOST, UTAKMICE.UTAKMICA_ID, 2);
END

CREATE TRIGGER "TRIG_UTAKMICE_2" FOR "UTAKMICE" 
ACTIVE BEFORE UPDATE POSITION 0
as
BEGIN
UPDATE UT_CHK
SET UT_CHK.SEZONA = UTAKMICE.SEZONA, UT_CHK.SPORT = UTAKMICE.SPORT,
UT_CHK.KOLO = UTAKMICE.KOLO, UT_CHK.TIM = UTAKMICE.DOMACIN
WHERE ((UT_CHK.UTAKMICA_ID = UTAKMICE.UTAKMICA_ID) AND (UT_CHK.DG = 1));
UPDATE UT_CHK
SET SEZONA = UTAKMICE.SEZONA, SPORT = UTAKMICE.SPORT,
KOLO = UTAKMICE.KOLO, TIM = UTAKMICE.GOST
WHERE ((UT_CHK.UTAKMICA_ID = UTAKMICE.UTAKMICA_ID) AND (UT_CHK.DG = 2));
END

CREATE TRIGGER "TRIG_UTAKMICE_3" FOR "UTAKMICE" 
ACTIVE BEFORE DELETE POSITION 0
as
BEGIN
DELETE FROM UT_CHK WHERE (UT_CHK.UTAKMICA_ID = UTAKMICE.UTAKMICA_ID);
END  

/* I još jedan CHECK za tabelu UTAKMICE, za neke dodatne uslove: */

CHECK (
(UTAKMICE.DOMACIN <> UTAKMICE.GOST)
AND
/* DA SU IZ TIMOVI ISTE DIVIZIJE */
((SELECT T1.DIVIZIJA FROM TIMOVI T1
WHERE T1.TIM_ID = UTAKMICE.DOMACIN) =
(SELECT T2.DIVIZIJA FROM TIMOVI T2
WHERE T2.TIM_ID = UTAKMICE.GOST))
AND
/* SUDIJA MORA BITI REGISTROVAN ZA ODREDJENI SPORT */
((SELECT COUNT(*) FROM SPORTOVI_SUDIJE
WHERE ((SPORTOVI_SUDIJE.SUDIJA = UTAKMICE.SUDIJA) AND
(SPORTOVI_SUDIJE.SPORT = UTAKMICE.SPORT))) >= 1)
AND
/* TEREN MORA BITI NAMIJENJEN ZA ODREDJENI SPORT */
((SELECT COUNT(*) FROM TERENI_SPORTOVI
WHERE ((TERENI_SPORTOVI.TEREN = UTAKMICE.TEREN) AND
(TERENI_SPORTOVI.SPORT = UTAKMICE.SPORT))) >= 1)
[ Zidar @ 14.09.2006. 16:17 ] @
[Quote]ali ću još samo postaviti malo modifikovan dijagram (i dalje nezavršen), zbog ideje kako riješiti onaj već pomenuti problem "da se isti tim ne može dva puta pojaviti u istom kolu jedne sezone". Jedno rješenje je već pomenuto, ako bude moguće koristiti SELECT unutar CHECK-a.
Drugo rješenje je dodavanje jedne pomoćne tabele UT_CHK i korištenje trigera. Triger u ovu pomoćnu tabelu za svaki jedan red u tabeli UTAKMICE upisuje dva reda u tabelu UT_CHK, jedan za domaćina (u kolonu DG se upisuje "1", a drugi za gosta (u kolonu DG se upisuje "2"). Ostale kolone se prepisuju iz tabele UTAKMICE. Sad se još postave UNIQUE indeksi, a transakcija obezbjedi da se uvijek upišu ili obrišu oba reda za istu utakmicu.
Tako se zadržavaju u tabeli UTAKMICE dvije kolone (DOMAĆIN i GOST) jer je takva struktura dosta pogodna (Zidar je to detaljno pojasnio), a pomoćna tabela služi samo zbog onog uslova, i na nju ne treba više obraćati pažnju ni onaj ko radi interfejs, a ni onaj ko koristi bazu. Možda rješenje nije baš uobičajeno, ali možda nekome nekad i riješi problem.
[/quote]
Svako resenje koje omogucuje da se kaze " na pomocnu tabelu ne treba više obraćati pažnju ni onaj ko radi interfejs, a ni onaj ko koristi bazu. " zasluzuje ocenu ODLICAN. Mozda triger moze da se napise na ovaj ili onaj nacin, manje ili vise efikasan i elegantan, to nema veze. kako god da se pise, pise se samo jednom i onda se na njega zaboravi. To je poenta. Napisi i zaboravi na to, radice sledecih 100 godina.

Odlicna ideja.
[ chachka @ 14.09.2006. 21:23 ] @
Resenje jeste zanimljivo, ali posto Interbase/FireBird podrzava SELECT u CHECK-u to se moze uraditi i sa prostim
Code:

/* Sledi Interbase/FireBird specifican SQL */

ALTER TABLE UTAKMICE
  ADD CONSTRAINT CH_UTA_JEDAN_TIM_U_JEDNOM_KOLU
  CHECK (0 = (SELECT COUNT(*)
                FROM utakmice
               WHERE sezona = NEW.sezona
                 AND sport = NEW.sport
                 AND kolo = NEW.kolo
                 AND (gost = NEW.domacin OR domacin = NEW.gost)));

Ovaj SELECT usput proverava i da je domacin <> gost pa poseban CHECK za to nije potreban.


Drugi nacin: Ako se vec uvode triggeri u igru onda se mogu napraviti trigger-i after insert i after update koji rade istu stvar bez uvodjenja nove tabele.
Code:

/* Sledi Interbase/FireBird specifican SQL */

CREATE EXCEPTION E_TIM_VEC_IGRA_KOLO "Tim se vec igra u kolu!";

SET TERM ^ ;

CREATE TRIGGER "TAI_UTA_JEDAN_TIM_JEDNO_KOLO" FOR "UTAKMICE" 
ACTIVE AFTER INSERT POSITION 0
AS
  DECLARE VARIABLE l_broj INTEGER;
BEGIN
  SELECT COUNT(*)
    FROM utakmice
   WHERE sezona = NEW.sezona
     AND sport = NEW.sport
     AND kolo = NEW.kolo
     AND (gost  = NEW.domacin OR domacin = NEW.gost)
    INTO l_broj;
  IF l_broj <> 0 THEN
    EXCEPTION E_TIM_VEC_IGRA_KOLO;
END ^ 

CREATE TRIGGER "TAU_UTA_JEDAN_TIM_JEDNO_KOLO" FOR "UTAKMICE" 
ACTIVE AFTER UPDATE POSITION 0
AS
  DECLARE VARIABLE l_broj INTEGER;
BEGIN
  SELECT COUNT(*)
    FROM utakmice
   WHERE sezona = NEW.sezona
     AND sport = NEW.sport
     AND kolo = NEW.kolo
     AND (gost  = NEW.domacin OR domacin = NEW.gost)
    INTO l_broj;
  IF l_broj <> 0 THEN
    EXCEPTION E_TIM_VEC_IGRA_KOLO;
END ^ 

SET TERM ; ^

COMMIT WORK;


U svakom slucaju delalt-ovo resenje jeste trik kojeg vredi zapamtiti.
[ delalt @ 15.09.2006. 23:50 ] @
@Chachka
Trigeri su ovdje najelegantnije i najefikasnije rješenje. Izbjegava se dodatna tabela, izbjegavaju se suvišni inserti
i trigeri. Jedino dopuna da bi možda bolje bilo napraviti jedan onakav kao što si predložio,
u BEFORE INSERT OR UPDATE.

Ta dodatna tabela mi je pala na pamet kad sam čitao Zidarev komentar:
Citat:
Zidar:
Ako bismo malo drugacije modelovali utakmice i timove, i problem "jedan tim gost/domacin u istom kolu" bi
mogao da se resi. Pitanje je samo da li je to vredno truda i problema koje donosi. Ako pazljivo pogledamo tabelu Utakmice, u svim ponudjenim modelima imamo Domacin, Gost kolone. Formalno, to je narusavanje 2NF mislim.
Svaka utakmica 'ima' dva tima.Ako ih ziovenmo Tim1 i Tim2 onda se lakse vidi da narusavamo 2NF. To je isto
kao kad bi stavili u fakturi kolone Proizvod1, proizvod2, proizvod3...ProizvodN. Zbog tog narusavanja 2NF
imamo dav UNIQUE constraints i CHECK i problem da pokrijemo zahtev "jedan tim ne sme biti gost i domacin
u istom kolu". Ako bi timovi bili u dodatnoj tabeli TimoviKojiIgarjuUtakmicu, bilo bi Utakmica :
TimoviKojiIgarjuUtakmicu= 1 : 2. Jedan jedini UNIQUE Constraint na tabeli TimoviKojiIgarjuUtakmicu bi
obezbedio da - svaki tim u jednom kolu se pojavljuje ne vise od jednom => ne moze biti Tim1 i Tim 2 istovremeno. Takodje sledi da se ne moze pojaviti dva puta u istom kolu i sledi da ne moze da igra protiv samog sebe,
jer svi ovi uslovi narusavaju jedan te isti UNIQUE constraint. Ja ipak ne preporucujem ovaj nacin, jer se ni u
jednom SQL sistemu, ni po standardu ne moze obezbediti trazeni kardinalitet. Mozete nekako (triggeri?)
da obezbedite da utakmica nema vise od dva tima u tabeli TimoviKojiIgarjuUtakmicu, ali ne mozete da
garantujete da ce uvek biti bas dva. Mozete da sprecite da se obrise jedan od dva tima, ali na INSERT idu
jedan po jedan. Sta ako prvi ISNERT prodje, a drugi ne? Reci cete - resenje je stored procedure, ali ko ce da
natera programera da koristi store procedure. Stored procedure su ekvivalentne resenju na front endu. Znaci,
teorijski, kardinalnost se ne moze ili se jako tesko obezbedjuje bez oslanjanja na front end.

Ja u praksi koristim model koji je dao Chachka, a uslov da se jedan tim ne moze pojaviti u jednom kolu vise
od jednom, bilo kao gost ili domacin obezbedjujem algoritmom za kombinovanje timova, koji za svako kolo
uzima svaki tim tacno po jednom. Znaci, opet se oslanjam na front end. ne kazem da se ne treba oslanjati
na front end, samo kazem da se ponekad bez front enda ne moze.Kad budete izracunavali tabelu iz tabele
Utakmice koja ima kolone Domacin i Gost, opet ce vas udariti po glavi narusavanje2NF, keviriji ce bit prilicno
zakukuljeni. Ipak, te cete kverije napisati jednom u zivotu i gotovo. Ostali stvari koje ce doci kad se bude
pravio front end - prezentacija podataka korisniku, unos, editovanje su monog, ali mnogo, laksi ako se prihvati
ovakva nepotpuna normalizacija. bar je meni bilo mnogo lakse.

Medjutim, kad dodje do zapsivanja kazni, opet problemi. Kako cete da zpiste kazne za igrace koje su zaradili
na jednoj utakmici, za oba tima? Zamislajmo neki FK sa tabele Utakmice na tabelu Kazne. FK, ali sa kojih polja?
Ispada (Utakmica,Domacin) u tabeli Utakmice motra da odgovara (Utakmica,Domacin) u tabeli Kazne. Ali, isto
tako mora (Utakmica,Gost) da odgovara (Utakmica, Tim) u tabeli Kazne. A to ne moze da se postavi u SQL.
Da pravimo jednu tabelu za kazne koje se pripisuju Gostu i jednu za kazne koje se pripisuju Domacinu?
Tek onda ulazite u probleme.

Iz ovog se vidi da bi najbolje bilo imati obije varijante na raspolaganju, timove kao DOMACIN i GOST u jednom
redu, a u drugoj varijanti jednu kolonu TIM uz obavezno dva inserta, update-a ili brisanja, za domaćina i za
gosta. Pa zašto to onda i ne uraditi, napuštajući pravila koja bi trebalo poštovati, ako će to svima olakšati život.
Ne kažem da će baš i olakšati, ali tema je "Teorija vs. praksa", pa bi se moglo diskutovati o ovome zašto to baš
ne valja. Ja sam dao primjer kako se pomoćna tabela može iskoristiti za provjeru duplih, ali mogla bi se iskoristiti
i za npr. vezu prema nekim drugim tabelama, ako je pogodnija od tabele UTAKMICE. Dodavajući (duplirajući) još
neke ili sve podatke mogla bi poslužiti da uprosti upite potrebne za nekakve izvještaje.
Znači, treba imati na umu da su te dvije tabele podjednako ažurne jer su unutar transakcija i o tome se brine
DBMS. Na kraju dobijete dvije tabele sa istim podacima, različito složene. Pogodno i za pravljenje interfejsa,
a pogodno i za onoga ko bi trebao da pravi upite za složene izvještaje, možda i za onog ko dizajnira (zavisno
od toga šta bi još naručilac posla mogao tražiti).
Naravno, ovo mi se čini veoma pogodno baš za ovaj slučaj praćenja amaterskog ligaškog takmičenja. Količina
podataka je relativno mala, utakmice se održavaju vikendima i to je veoma mala količina podataka, pa dupliranje
nije nikakav problem. Takođe je i frekvencija upisa veoma mala (na kraju dana se upišu rezultati utakmica i još
ponešto, a ako bude potrebno i poneka izmjena). Izvještaji su vjerovatno potrebni sedmično (izvuku se i okače
na oglasnu tablu ili internet). Sve u svemu, nikakav problem za DBMS. Veći je problem onemogućiti greške pri
upisivanju. S druge strane, kod veće količine podataka i visoke frekvencije upisa ili izmjena podataka, ili više njih istovremeno upisuje i čita podatke pri sporim vezama, ovakvo rješenje je sigurno neprihvatljivo.
Pošto se ovdje ipak radi o dizajnu baze, ne bi bilo loše pojasniti zašto ovo valja ili zašto ne valja.
Na greškama se ipak najbolje uči.

Još samo da ispravim jedan moj propust. Zidar se bio potrudio da prokomentariše moj prvi dijagram (dao je to
u prikačenom fajlu Delalt_Comments.doc), bio sam spremio odgovore, ali ih nisam odmah okačio, imao sam
još nekakva podpitanja, pa evo sada:

Q: 1. Imamo tabelu Sezone i mogu da unesem stvari kao:
SezonaID Naziv
1 Kosarka Aug 2006
2 Hokej 2006-2007
3 Oktobar 2006
4 Fudbal, 2007
A: Predviđena je samo da se unose vremenski periodi, bez oznake sporta (postoji posebna tabela SPORTOVI),
sa nekakvom skraćenicom i punim opisom npr.:
SezonaID Naziv
2005 sezona 2005
L05 leto 2005
Z0506 zima 2005/2006
NT0506 mali novogodišnji turnir 2005/2006

Q: 2. Imamo tabelu Divizije, ali ne vidim u kakvoj je vezi Divizija i sezona. U kolonu Sezona u tabeli Divizija
mogu da unesem bilo sta, ne vidim FK od Sezone.
A: Tabela DIVIZIJE je samo šifarnik, trebao bih napraviti još jednu tabelu za vezu, SEZONE_DIVIZIJE, međutim,
na samom početku je rečeno da je raspored timova i utakmica za jednu sezonu već gotov, (Word ili Excel
dokument, koji samo treba unijeti u bazu). U tabeli UTAKMICE vidi se kojoj sezoni koja utakmica pripada
i koji timovi igraju. Timovi pripadaju određenoj diviziji, pa se može napraviti nekakva veza i provjera. Pošto je
rečeno da je moguće praviti mješovite timove (dječaci, djevojčice, ili miješano), onda mogu pripadati i različitim
divizijama, a ipak da igraju međusobno. Zato nisam pravio direktnu vezu.

Q: 3. Ako vec imam sportove, ne vidim da su tereni zavisni od sportova. Sta me sprecava da za hokej ili
odbojku odaberem teren ‘Bazn na Tasmajdanu’. Bolje je da se sportovi izbace iz modela, rekli smo na kraju
da radimo jedan sport.
A: Riješeno tabelom TERENI_SPORTOVI

4. Timovi pripadaju divizijama . OK
5. Timovi imaju sponzora. OK
4. Timovi pripadaju odredjenom sportu.OK, ali cemo zanemariti Sportove nadalje.

Q: 5. Timovi imaju Tim ID. Imaju i Takmicarski Broj. Cemu sluze ove dve kolone?
A: TIMOVI je šifarnik, Takmičarski broj mi nije pogodan za PK, može da se ponavlja iz sezone u sezonu

6. Tabela Sponzori kontrolise unos sponzora u tabelu Timovi. OK
7. Postoji tabela Igraci – svi koji su platili clanarinu. OK
8. postoji tabela Timovi_Igrace, ko je u kom timu, OK, imamo i ko je od kada igrao do kada. I to je OK,
veoma lepo. Izgleda da ‘Ocena Kvalietet Igraca’ se menja od tima do tima. Zanimljivo, i verovatno dobro,
jer se moze pratiti progres igraca. Moze na pocetku sezone da bude los, pa do kraja predje u kategoriju
‘solidan’. Lepo prosirenje od strane projektanta.

Q: 9. Utakmice-Igraci nije potrebna tabela, rekli smo da ne pratimo ko je igrao na kojoj utakmici,
da olaksamo model.
A: U tabelu UTAKMICE_IGRACI upisuju se samo dešavanja na utakmici (šifra utakmice i vrijeme i šifra
igrača koji je postigao pogodak ili dobio kaznu...) a ne spisak svih igrača. Malo sam promašio sa nazivom
tabele. Ova tabela ima kolonu UTAKMICA koja referencira na tabelu UTAKMICE, u kojoj su datumi i
šifre domaćina i gosta. Po ovim šiframa timova, može se upitom, za dati datum održavanja utakmice
preko tabele TIMOVI, TIMOVI_IGRAČI i IGRAČI doći do naziva timova i spiska igrača tih timova koji su
igrali baš na toj utakmici, bez obzira na ranije transfere.
Ovo je urađeno zato što je moguće da baš posuđeni igrač iz nekog drugog tima postigne pogotke i pobjedu
timu, a onda se vrati i nastavi igrati sezonu za svoj matični tim. Ne bi bilo lijepo izostaviti njegovo ime iz
spiska igrača tog tima.

Q: 10. Utakmice: ne vidim iz modela da me nesto sprecava da iamesam timove. Moze “KK Cibona” da igra
protiv “OFK Beograda”, ako nepazljivo kucam. KK = kosarkaski klub, FK = fudbalski klub. Navedeni primer
je malo verovatan, ali moguc. Medjutim, moguce je pomesti timove iz razlicitih divizija, cak i ako se
zadrzimo na jednom sportu. Tabela Utakmice nema podatak koji nam kaze o kojoj se diviziji radi.
A: Postoji CHECK koji provjerava da su iz iste divizije ili za isti sport

[Ovu poruku je menjao delalt dana 16.09.2006. u 10:05 GMT+1]