Za sada nije dobar dizajn,a li moze da se popravi. Prvo, "Odsustvo" si tretirao kao potpuno nezavisni entitet. sto nije tacno. Odsustvo ne moze da postoji bez zaposlenog. Po tvojoj shemi - moze. Ti kreiras odsustvo, u tabeli Odsustvo, pa ga onda dodelis nekom zaposlenom u veznoj tabeli Zaposleni_Odsustvo. To nije dobro, jer su moguce svakojake greske a i programiranje je teze nego sto treba da bude.
Tebi su dovoljne dve tabele, jedna koja cuva zaposlene, i druga gde se belezi odsustvo. Pri tome je tabela Zaposleni roditelj tabela za tabelu Odsustva (novu), jer za jednog zaposlenog moze da postoji vise odsustava. Pitanje je samo kako napraviti drugu tabelu, Odsustva, tako da je tvoj posao olaksan maksimalo, a da su podaci bezedni i tacni (integritet podataka).
Pokusaj ovako. Neka tabela Zaposleni ostane ista, ili bar skoro ista. Malo bih promenio "Radno vreme". Prvo, ime bi bilo RadnoVreme (bez razmaka izmedju reci, isto vazi i za jos nekoliko kolona u tabeli). Onda bih rekao da je RadnoVreme decimalan boj i upisivao bih koliko sati treba da radi doticni radnik. Mogla bi i neka validacija na koloni da se doda, da ne unosimo gluposti.
Napravi tabelu Odsustva (mnozina, Odsustva, za razliku od tvoje originalne koja je u jednini, Odsustvo):
Odsustva:
{
ID_Zaposleni FK Zaposleni (ID_Zaposleni)
, RadnoVreme AS Decimal -- preisuje se iz tabele Zaposleni.RadnoVreme
, Datum AS datetime
, GodisnjiOdmor as DEcimal -- broj sati na godisnjem odmoru na zadati Datum
, Bolovanje as Decimal -- broj sati na bolovanju na zasati Datum
, Redovno as Decimal -- broj sati na zadati dan u kategoriji REdovno
, Ostalo AS Decimal -- broj sati na zadati dan u kategoriji OStalo
, VanrednaSituacija AS decimal -- broj sati na zadati dan u kategoriji VanrednaSituacija
, Vanredno AS Decimal -- broj sati na zadati dan u kategoriji VanrednaSituacija
CHECK CONSTRAINT: RadnoVreme >= (GodisnjiOdmor + Bolovanje + Redovno + OStalo + VanrednaSituacija + Vanredno)
}
Za svakog zaposlenog, pravi jedan zapis u tabeli Osustva za svaki dan kada je taj zaposleni bio odsutan po bilo kom osnovu. Broj sati se upisuje u odgovarajuce kolone.
Ako uvedes kolonu za 'Proveo sati radeci na poslu', onda ces imati jedn red za svakog radika za svaki dan. To izgleda mnogo, ali se to i inace negde vodi - "sihterica", pa ne smeta da se to unese u kompjuter.
Najvaznija stvar je onaj CHECK CONSTRINT - to ti je VALIDATION RULE na nivou tabele. Tu sprecavas unos kontradiktornih podataka, iliti - gluposti. Ne moze neko biti 8 sati na bolovanju i istog dana jos 5 sati na Godisnjem odmoru, ako je rado vreme samo 8 sati.
Dobices mnogo saveta da ovakvu tabelu Odsustva trebas da normalizujes, da je razbijes na dve tabele, gde se (Datum,KategorijaOdsustva) biti u zasebnim redovima. To ima smisla teorijski, ali onda ne mozes da uspostvis uslov da zbir sati u svim kategorijama ne prelazi dozvoljen broj sati za zadati dan. Imaces teorijski ispravan dizajn, sa velikom sansu da se nesto zabrlja u podacima prilikom unosa. Ako uzmes predlozeno resenje, podaci ce biti maksimalno tacni, nece bit kontradikcije, pa i ako budes sve direktno unosi u tabelu, bez ikakvog programiranja.
Normalizacija tabele Odsustva ima smisla ako se tvoje kategorije odsustva menjaju cesto, sto uglavnom nije slucaj. Znaci, ako jednom postavis tabelu i validaciju, miran si nekoliko godina. Ako neko i trazi da se doda nova kategorija, jednom u 4-5 godina, dodaces kolonu u tabelu i prosiriti validacono pravilo i to je sve. Bolje to nego da reskiras greske i kontradikcije u podacima.
