POLITECHNIKA WROC艁AWSKA
WYDZIA艁 ELEKTRONIKI
Kierunek: Automatyka i Robotyka (AIR)
Specjalno艣膰: Komputerowe Sieci Sterowania (ARK)
PROJEKT BAZY DANYCH
Rozgrywki sportowe
Autorzy:
Mateusz G膮siorek
Pawe艂 Ruci艅ski
Prowadz膮cy prace:
dr in偶. Grzegorz Mzyk
WROC艁AW 2012
Projekt zosta艂 wykonany w programie Oracle Client Express 11 - Application Express 4.0.2.00.09
Temat:, Jako przyk艂ad do implementacji wzi臋to pod uwag臋 niepe艂n膮 (10 zespo艂贸w) polsk膮 lig臋 pi艂ki no偶nej (Ekstraklasa).
Baza sk艂ada si臋 z dw贸ch tablic:
TABELA: TEAMS odpowiadaj膮ca za numer ID dru偶yny (wyj膮tkowy dla ka偶dej) oraz jej nazw臋 zapisan膮 w kolumnie odpowiadaj膮cej danej ID. Obie kolumny nie mog膮 przyjmowa膰 warto艣ci NULL, ju偶 przy wpisywaniu, aby unikn膮膰 sytuacji dru偶yny bez nazwy.
TABELA: GAMES odpowiada za rozgrywane mecze, sk艂ada si臋 z siedmiu kolumn odpowiadaj膮cych kolejno, numerowi meczu (unikatowy), ID dru偶yny gospodarzy, ID dru偶yny go艣ci, bramki zdobyte przez gospodarzy, bramki zdobyte przez go艣ci, dat臋 meczu (wykorzystuj膮c gotowy schemat DATE), oraz numer kolejki, w kt贸rej dany mecz by艂 rozgrywany. Kolumny odpowiadaj膮ce bramk膮 go艣ci, oraz bramk膮 gospodarzy mog膮 przyjmowa膰 warto艣膰 NULL, aby przy wprowadzaniu terminarza nie uzyskiwa膰 b艂臋d贸w.
W projekcie starano si臋 o jak najbardziej optymalna wersj臋 programu rozgrywek sportowych st膮d implementacja dw贸ch tablic. Takie ustawienie tabel pozwala na wyci膮gni臋cie wszystkich podstawowych statystyk, kt贸re mo偶na zgromadzi膰 w tabeli ko艅cowej rozgrywek sportowych.
Wstawianie element贸w odbywa艂o si臋 poprzez administratora, kt贸ry posiada dost臋p do ca艂e bazy danych, dodano elementy odpowiadaj膮ce pomniejszonej ekstraklasie polskiej. Tabela zawiera pierwsze 10 dru偶yn z tabeli ko艅cowej T-mobile ekstraklasy polskiej sezonu 2011/2012.
TABELA TEAMS
TABELA GAMES
W nast臋pnym kroku stworzono powi膮zania pomi臋dzy tablicami wykorzystuj膮c wbudowan膮 opcj臋 鈥瀜uery builder鈥:
Rezultat:
Wykorzystano takie po艂膮czenie, poniewa偶 zapewnia ona mo偶liwo艣膰 przyk艂adowej zmiany nazwy dru偶yny w nast臋pnym sezonie (w przypadku awansu lub spadku kt贸re艣 z dru偶yn), bez konieczno艣ci przerabiania wszystkich meczy.
APLIKACJA:
Tworzymy aplikacj臋 wykorzystuj膮c gotowego kreatora:
Numer aplikacji, kt贸ry nadajemy jest konieczny, aby u偶ytkownik m贸g艂 uruchomi膰 aplikacj臋 (podajemy j膮 w adresie URL). Jest mo偶liwo艣膰 zmiany poprzez tworzenie alias贸w jednak na potrzeby tego projektu adres pozostaje lokalny
Logowanie do aplikacji odbywa si臋 poprzez panel usera:
Na stronie znajduj膮 si臋 cztery podstrony:
TERMINARZ (interaktywna tablica z mo偶liwo艣ci膮 sortowania po dowolnej kolumnie)
TABELA (klasyczna tablica posortowana po ilo艣ci punkt贸w)
WPISZ WYNIK (strona zabezpieczona, kt贸ra poprzez panel logowania przenosi do formularza wpisywania wyniku)
STATYSTYKI (klasyczna tablica posortowana po stosunku meczy wygranych do przegranych)
OPIS TWORZENIA POSZCZEG脫LNYCH STRON:
TABELA:
Rezultat:
Tworzymy stron臋 `report鈥, jako kod strony podajemy:
select TEAM_NAME, ( NVL( (select count(*) from GAMES where (HOME_ID=TEAM_ID) AND (HOME_SCORE>=0)),0) + NVL( (select count(*) from GAMES where (AWAY_ID=TEAM_ID) AND (AWAY_SCORE>=0)),0) ) as MECZE, ( NVL( (select sum(HOME_SCORE) from GAMES where HOME_ID=TEAM_ID),0) + NVL( (select sum(AWAY_SCORE) from GAMES where AWAY_ID=TEAM_ID),0) ) as STRZELONE, ( NVL( (select sum(AWAY_SCORE) from GAMES where HOME_ID=TEAM_ID),0) + NVL( (select sum(HOME_SCORE) from GAMES where AWAY_ID=TEAM_ID),0) ) as STRACONE, ( NVL( (select count(*) from GAMES where (HOME_SCORE > AWAY_SCORE) AND (HOME_ID=TEAM_ID)),0) + NVL( (select count(*) from GAMES where (HOME_SCORE < AWAY_SCORE) AND (AWAY_ID=TEAM_ID)),0) ) as WYGRANE, ( NVL( (select count(*) from GAMES where (HOME_SCORE < AWAY_SCORE) AND (HOME_ID=TEAM_ID)),0) + NVL( (select count(*) from GAMES where (HOME_SCORE > AWAY_SCORE) AND (AWAY_ID=TEAM_ID)),0) ) as PRZEGRANE, ( NVL( (select count(*) from GAMES where (HOME_SCORE = AWAY_SCORE) AND (HOME_ID=TEAM_ID)),0) + NVL( (select count(*) from GAMES where (HOME_SCORE = AWAY_SCORE) AND (AWAY_ID=TEAM_ID)),0) ) as REMISY, ( ( NVL(( select count(*) from GAMES where ( HOME_SCORE > AWAY_SCORE ) AND ( HOME_ID=TEAM_ID ) ),0)*3 ) + ( NVL(( select count(*) from GAMES where ( HOME_SCORE < AWAY_SCORE ) AND ( AWAY_ID=TEAM_ID ) ),0)*3 ) + ( NVL(( select count(*) from GAMES where ( HOME_SCORE = AWAY_SCORE ) AND ( AWAY_ID=TEAM_ID ) ),0) ) + ( NVL(( select count(*) from GAMES where ( HOME_SCORE = AWAY_SCORE ) AND ( HOME_ID=TEAM_ID ) ),0) ) ) as PUNKTY from TEAMS order by PUNKTY desc |
---|
Kod programu w pierwszej kolejno艣ci generuje liczb臋 meczy, sumuj膮c mecze, w kt贸rych gra dana dru偶yna u siebie, oraz na wyje藕dzie. Dodatkowo sprawdza czy mecz si臋 odby艂.
Nast臋pnie wylicza bramki strzelone, stracone, jako sum臋 p贸l odpowiedzialnych za wynik.
Liczb臋 meczy wygranych, oraz przegranych (tam gdzie pole bramki dru偶yny jest wi臋ksze od pola bramki rywale)
Na sam koniec wylicza punkty, mno偶膮c, przez 3 je偶eli bramki s膮 wi臋ksze kt贸re艣 z dru偶yn, oraz dodaj膮c, 1 gdy bramki s膮 sobie r贸wne (remis)
TERMINARZ:
Rezultat:
Tworzymy stron臋 `report鈥, jako kod strony podajemy:
select "GAMES"."MATCH_ID" as "MATCH_ID", "TEAMS"."TEAM_NAME" as "TEAM_NAME", "TEAMS_1"."TEAM_NAME" as "TEAM1_NAME", "GAMES"."HOME_SCORE" as "HOME_SCORE", "GAMES"."AWAY_SCORE" as "AWAY_SCORE", "GAMES"."MATCH_DATE" as "MATCH_DATE", "GAMES"."FIXTURE" as "FIXTURE" from "TEAMS" "TEAMS_1", "TEAMS" "TEAMS", "GAMES" "GAMES" where "GAMES"."AWAY_ID"="TEAMS_1"."TEAM_ID"(+) and "GAMES"."HOME_ID"="TEAMS"."TEAM_ID"(+) order by FIXTURE asc |
---|
Zaznaczamy dodatkowo opcj臋 interaktywny, dzi臋ki czemu u偶ytkownik mo偶e wyszukiwa膰 odpowiedni element, sortowa膰 wed艂ug potrzebnych do uzyskania danych. Ustawieniem podstawowym jest sortowanie po kolejce, w kt贸rej odby艂 si臋 mecz.
STATYSTYKI:
Rezultat:
select TEAM_NAME, NVL(( select count(*) from GAMES where ( HOME_SCORE = 0 ) AND ( HOME_ID=TEAM_ID ) ),0) as CZYSTE_KONTO_GOSP, NVL(( select count(*) from GAMES where ( HOME_SCORE = 0 ) AND ( HOME_ID=TEAM_ID ) ),0) as CZYSTE_KONTO_GOSC, NVL(( select count(*) from GAMES where ( HOME_SCORE > 3 ) AND ( HOME_ID=TEAM_ID ) ),0) as WIECEJ_3_GOSP, NVL(( select count(*) from GAMES where ( AWAY_SCORE > 3 ) AND ( AWAY_ID=TEAM_ID ) ),0) as WIECEJ_3_GOSC, NVL(( select count(*) from GAMES where ( HOME_SCORE < 3 ) AND ( HOME_ID=TEAM_ID ) ),0) as MNIEJ_3_GOSP, NVL(( select count(*) from GAMES where ( AWAY_SCORE < 3 ) AND ( AWAY_ID=TEAM_ID ) ),0) as MNIEJ_3_GOSC, NVL(( select count(*) from GAMES where ( HOME_ID=TEAM_ID ) AND ( HOME_SCORE >=0 ) AND ( HOME_ID=TEAM_ID ) ),0) as MECZ_DOM, NVL(( select count(*) from GAMES where ( AWAY_ID=TEAM_ID ) AND ( AWAY_SCORE >=0 ) AND ( AWAY_ID=TEAM_ID ) ),0) as MECZ_WYJAZD, ( ROUND(NVL( (select count(*) from GAMES where (HOME_SCORE > AWAY_SCORE) AND (HOME_ID=TEAM_ID)),0) / ( NVL( (select count(*) from GAMES where (HOME_ID=TEAM_ID) AND (HOME_SCORE>=0)),0) + NVL( (select count(*) from GAMES where (AWAY_ID=TEAM_ID) AND (AWAY_SCORE>=0)),1) )*100,2) ) as "WYGRANE-PRZEGRANE_%" from TEAMS order by "WYGRANE-PRZEGRANE_%" desc |
---|
Kod ten wylicza mecze, w kt贸rych dru偶yna nie straci艂a bramki u siebie, nie straci艂a bramki na wyje藕dzie, strzeli艂a wi臋cej ni偶 3 bramki u siebie, wi臋cej ni偶 3 bramki na wyje藕dzie, mniej ni偶 3 bramki u siebie i na wyje藕dzie, ile meczy rozegra艂a u siebie, ile meczy rozegra艂a na wyje藕dzie, oraz wylicza stosunek meczy wygranych do przegranych w procentach, zaokr膮glaj膮c wynik.
Sortowanie odbywa si臋 po stosunku wygranych do przegranych
WPISZ WYNIK:
Po naci艣ni臋ciu na przycisk WPISZ WYNIK, zostajemy przeniesieni do panelu logowania, gdzie sprawdzana jest nazwa kapitana oraz jego has艂o.
Jest to zabezpieczenie wynikaj膮ce z odpowiednich przekierowa艅
Naciskaj膮c przycisk 鈥榃PISZ WYNIK鈥 jeste艣my przekierowani na stron臋 z numerem 3 (jest to strona, pod kt贸r膮 znajduje si臋 formularz do wpisywania wyniku), jest to jednak strona zabezpieczona, wymagaj膮ca autoryzacji konta:
Po zalogowaniu si臋 dostajemy dost臋p do edycji naszej tabeli:
select * from (select "TEAMS"."TEAM_NAME" as "HOME", "TEAMS_1"."TEAM_NAME" as "AWAY", "GAMES"."HOME_ID" as "ID", GAMES.MATCH_ID, "GAMES"."HOME_SCORE" as "HOME_SCORE", "GAMES"."AWAY_SCORE" as "AWAY_SCORE", "GAMES"."FIXTURE" as "FIXTURE", "GAMES"."MATCH_DATE" as "DATA" from "TEAMS" "TEAMS_1", "GAMES" "GAMES", "TEAMS" "TEAMS" where "TEAMS"."TEAM_ID"(+) ="GAMES"."HOME_ID" and "TEAMS_1"."TEAM_ID"(+) ="GAMES"."AWAY_ID" ) where ID = (select CAPTAIN_ID from CAPTAIN where upper(CAPTAIN_NAME) = upper(:APP_USER)) or upper(:APP_USER) = 'SPORT' order by FIXTURE |
---|
Po klikni臋ciu na edycj臋 zostajemy przeniesieni do nast臋pnej strony
gdzie wpisujemy wynik i zatwierdzamy
U呕YTKOWNICY:
Tworzymy u偶ytkownik贸w wykorzystuj膮c wbudowany panel administratora, dodajemy u偶ytkownik贸w w postaci: nazwa (nazwa dru偶yny), oraz has艂o (nazwa dru偶yny). Dodatkowo stworzony automatycznie jest u偶ytkownik SPORT, kt贸ry jest administratorem strony i ma dost臋p do wszystkich mo偶liwych edycji aplikacji.
Dodatkowo stworzono tablic臋 CAPTAIN, w kt贸rej zapisywany jest numer ID kapitana oraz nazwa klubu, kt贸rego kapitanem jest.
Nazwa kapitana jest taka sama jak nazwa klubu, kt贸rego kapitanem jest ( wymagane przy wpisywaniu wynik贸w tylko swojej dru偶yny).
Taka opcja pozwala na stworzenie dodatkowego u偶ytkownika dla danej dru偶yny (w sytuacji, kiedy kapitan nie jest w stanie wprowadzi膰 swojego wyniku). Mo偶na r贸wnie偶 pobiera膰 ID dru偶yny, jednak wtedy przy ch臋ci stworzenia dodatkowego u偶ytkownika np. legia2 jeste艣my zmuszeni przerobi膰 tablice.
Dodatkowo stworzona zosta艂a druga aplikacja, jako osobna liga, w kt贸rej niezale偶nie odbywaj膮 si臋 inne mecze.
WNIOSKI:
Stworzenie 2 tablic pozwala na edycj臋 nazw dru偶yn (w przypadku awansu lub spadku) bez konieczno艣ci zmiany terminarza oraz pozosta艂ych stron
Stworzenie dodatkowej tablicy kapitanowie pozwala na stworzenie dodatkowego u偶ytkownika, kt贸ry mo偶e wprowadzi膰 wynik za kapitana (przyk艂adowo, gdy jest on na zgrupowaniu reprezentacji i w meczu nie uczestniczy)
Stworzenie lig wi膮偶e si臋 z brakiem uniwersalno艣ci z terminarzem. Dodaj膮c kolumn臋 鈥瀕iga鈥 zmuszeni jeste艣my w stanie zrobi膰 dodatkowe zb臋dne wiersze w tablicy terminarz
Prze艂膮czanie aplikacji odbywa si臋 r贸wnie偶 z zabezpieczeniami.
Wpisywanie wyniku jest zabezpieczone, tak, aby u偶ytkownik nie m贸g艂 wpisa膰 niepoprawnego wyniku (np. ujemnego)
Dodatkowo mo偶na stworzy膰 panel administratora do wpisywania terminarzu, jednak jest on generowany w spos贸b dynamiczny z zewn膮trz, i zabezpieczony przez usuni臋cie wierszy, w kt贸rych pola gospodarza oraz go艣cia s膮 takie same.
BIBLIOGRAFIA:
http://ekstraklasa.net/ekstraklasa/tabela/ - wykorzystano tabel臋 ko艅cow膮 ekstraklasy polskiej
http://st-curriculum.oracle.com/tutorial/DBXETutorial/index.htm - wykorzystano elementy ukazuj膮ce obs艂ug臋 programu oraz jego podstawowych funkcji
http://andrzejklusiewicz.blogspot.com/2010/11/kurs-oracle-plsql.html - zaczerpni臋to informacj臋 o pisaniu procedury, oraz ich wywo艂ywaniu w APEXIE