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
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.
