Navrh databaze

"Zíka Aleš, Ing." Ales.Zika na pel.cb.ds.mfcr.cz
Středa Září 27 14:19:37 CEST 2000


	Zdravim vsechny,

	mel bych takovu prosbu, jestli by mi nekdo zkuseny nemohl trochu
poradit pri navrhu databaze. Dost jsem delal s dBase a Clipperem, ale s SQL
teprve zacinam, takze v tom trochu plavu.

	Mame takovou partu a vyhodnocujeme zavody ve vodnim slalomu na
divoke vode (na OH2000 zase potesili!), nas stary program v Clipperu po
Novellem uz dosluhuje, taxme se rozhodli ho napsat zgruntu znova a zatim to
vypada na Linux a PostgreSQL. V cem je problem: Zavodnik projizdi pres 20
(podle pravidel max. 26) branek a na kazde muze dostat 0, 2 nebo 50
trestnych bodu a ta je treba ulozit v tabulce. Jde mi o to jak je to
nejlepsi?
	Nas puvodni program na to mel proste pole 26 sloupcu B1 az B26, ale
to je dost priserne, strasne blbe se s tim delalo. Napadaji me dve jine
moznosti, bud na body mit jeden sloupec a ukladat je tam jako 26-prvkove
pole, nebo na ne mit extra tabulku, kde by krome jednoznacneho klice na
zavodnika a jizdu byly sloupce branka a body. Ta moznost se zvlastni
tabulkou se mi libi trochu vic, ale mam strach, ze ta tabulka bude hrozne
rozsahla - pri 300 zavodnicich x 2 jizdy x 26 = 15600 radku, jestli to
nebude pomale, navic, kdyz budu chtit zjistit k zavodnikovi body na vsech
brankach, tak mi SQL vrati 26 radku a ja je budu po jednom probirat. Verze s
polem by v tomhle byla lepsi, ale zase bude slozitejsi zjistovani ruznych
statistik typu "na ktere brane je nejvic nastouchano", na to by u zvlastni
tabulky stacily agregacni funkce. Prepokladam spravne, ze na pole agregacni
funkce nefunguji? Jaky na to mate nazor?

	Druhy dotaz se tyka poradi, zavodnici jsou razeni podle vysledneho
casu (cisty cas + body na brankach). Z praktickych důvodu potrebujeme, aby
se dalo primo SELECTem zjistit poradi zavodnika ve vysledkove listine, nas
puvodni program to dela tak, ze nastavi index na vysledek, pak GO TOP a pak
pocita kolikrat musi udelat SKIP nez se dostane na toho, koho hleda - je to
dost hrozny.
	Zatim jsem vymyslel prikaz "UPDATE zavodnik SET poradi = (SELECT
COUNT(*) + 1 FROM zavodnik z WHERE z.vysledek < zavodnik.vysledek)" (pisu to
z hlavy, tak je tam mozna nekde nejaka chybka), ktery by se spoustel
triggerem po kazde zmene vysledku a prepocital poradi pro celou tabulku.
Nenapada nekoho nejaka lepsi moznost? Mozna by to bylo lepsi udelat jako
vypocitany sloupec, ktery by se pokasde vypocetl az pri SELECT, dotazu
nevim?

	Diky za kazdou radu,

			Ales Zika
			Pelhrimov

			e-mail: Ales.Zika na pel.cb.ds.mfcr.cz
				  Ales.Zika na seznam.cz
			SMS:    Ales.Zika na sms.underground.cz




Další informace o konferenci Databases