[MySQL] baza danych rozgrywek


(pain3hp) #1

Potrzebuję dobrze przemyślaną bazę danych pod katem wydajności:

założenia:

  • z czasem życia aplikacji powstają nowe drużyny i nowe ligi / turnieje

  • powstają nowi gracze którzy dołączają do drużyn

  • drużyny dołączają do lig

  • ligi są nie dość że osobno różne czyli np liga pierwsza/ druga/trzecia to jeszcze posiadają swoje właściwości czyli tak jakby były dwuwymiarowe np liga polska-pierwsza, polska-druga, angielska-pierwsza, angielska-druga itp.

muszę mieć możliwość dostępu do danych

  • dla konkretnej ligi np polska-pierwsza: całą tabelę drużyn z właściwościami dla każdej z drużyn tj. ilość rozegranych meczy, ilość pkt, ilość goli strzelonych, ilość g. straconych, ilość meczy wygranych, przegranych, zremisowanych.

  • terminarz dla danej ligi czyli wypis wszystkich meczy rozegranych wraz z wynikami oraz tych przyszłych

  • lista meczy dla danej drużyny

  • lista lig dla danego gracza

  • lista meczy dla danego gracza

prymitywnie proszę o gotowca, oczywiście próbowałem to robić ale dochodzę do takich pktów że wszystko mi się miesza nawet nie warto bym pokazywał co zrobiłem bo sam wiem że jest to źle zrobione, rozumiem że jest sporo do zrobienia więc jeśli nikt nie pomoże będę próbował w płatnych ogłoszeniach ale narazie liczę na dobre serca :slight_smile:

dzieki


(Tomek Matz) #2

Poniżej zamieszczam szkic tabel do przemyślenia (zamiast polskich nazw możesz użyć angielskich). Jakbyś miał pytania to pytaj, jakbyś miał zastrzeżenia to zgłaszaj :slight_smile:

RozgrywkaTyp: RT_ID, RT_Typ

[RT_Typ to może być turniej lub liga]

Rozgrywka: R_ID, R_RT_ID, R_Nazwa, R_Dane

[R_Nazwa to może być Mistrzostwa Świata, polska, angielska itp., a R_Dane to może być pierwsza, druga itp.]

Zawodnik: Z_ID, Z_Imie, Z_Nazwisko, Z_DataUrodzenia

ZawodnikPozycja: ZP_ID, ZP_Nazwa

[ZP_Nazwa to może być napastnik, bramkarz, prawy pomocnik, lewy pomocnik itp.]

Druzyna: D_ID, D_Nazwa

DruzynaZawodnik: DZ_D_ID, DZ_Z_ID, DZ_Numer, DZ_ZP_ID

[zawodnik po przypisaniu do drużyny ma ustalony numer i pozycję; dany zawodnik może być przypisany do kilku drużyn]

DruzynaRozgrywka: DR_R_ID, DR_D_ID

[dana drużyna może brać udział w kilku rozgrywkach]

Terminarz: T_ID, T_R_ID

[terminarz przygotowywany jest dla danej rozgrywki]

Mecz: M_ID, M_Rozegrany, M_DruzynaA, M_DruzynaB, M_Stadion, M_Data, M_Godzina, M_BramkiDruzynaA, M_BramkiDruzynaB

[M_DruzynaA i M_DruzynaB to są wartości kolumny D_ID z tabeli Druzyna; M_Rozegrany przyjmuje wartość true lub false]

TerminarzMecz: TM_T_ID, TM_M_ID


(pain3hp) #3

to co zrobiłeś jest bez sensu takie coś może każdy zrobić to jest tylko nazwanie rzeczy po imieniu i wypisanie ich cech....

podaj mi przykład jak relacyjnie wyciagniesz z tego dane ligi


(Tomek Matz) #4

Może troszkę grzeczniej? Wystarczy przygotować odpowiednią perspektywę (View) i będziesz miał wszystkie dane dla danej ligii. Poza tym projektowanie struktury bazy danych polega na takim przygotowaniu tabel, aby jak najlepiej odzwierciedlały one rzeczywistość, więc zarzut odnośnie tego, że nazwałem rzeczy po imieniu i wypisałem ich cechy jest absurdalny.

EDIT: Tabelę DruzynaRozgrywka wywal, bo ona jednak jest tu niepotrzebna. A jeśli chodzi o SQL, który zwróci Ci tabelę dla całej ligii to ja przygotowałem coś takiego:

SELECT temp.D_ID, temp.D_Nazwa,

	COUNT(temp.D_ID) 'Rozegrane',

	SUM(temp.BramkiStrzelone) 'BramkiStrzelone', 

	SUM(temp.BramkiStracone) 'BramkiStracone',

	SUM(temp.Przegrana) 'Przegrane',

	SUM(temp.Remis) 'Remisy',

	SUM(temp.Wygrana) 'Wygrane',

	Punkty = SUM(temp.Remis) + SUM(temp.Wygrana) * 3

FROM 

	(

		SELECT temp.D_ID, temp.D_Nazwa, temp.BramkiStrzelone, temp.BramkiStracone,

			Przegrana = CASE 

				WHEN temp.BramkiStrzelone < temp.BramkiStracone THEN 1

				ELSE 0

			END,

			Remis = CASE 

				WHEN temp.BramkiStrzelone = temp.BramkiStracone THEN 1

				ELSE 0

			END,

			Wygrana = CASE 

				WHEN temp.BramkiStrzelone > temp.BramkiStracone THEN 1

				ELSE 0

			END

		FROM 

			(

				SELECT D_ID, D_Nazwa, 

					BramkiStrzelone = CASE m.M_DruzynaA 

						WHEN d.D_ID THEN m.M_BramkiDruzynaA

						ELSE m.M_BramkiDruzynaB

					END,

					BramkiStracone = CASE m.M_DruzynaA 

						WHEN d.D_ID THEN m.M_BramkiDruzynaB

						ELSE m.M_BramkiDruzynaA

					END

				FROM Druzyna d, Mecz m, TerminarzMecz tm, Terminarz t, Rozgrywka r

				WHERE m.M_ID = tm.TM_M_ID

					and tm.TM_T_ID = t.T_ID

					and t.T_R_ID = r.R_ID

					and r.R_ID = 1

					and (m.M_DruzynaA = d.D_ID or m.M_DruzynaB = d.D_ID)

			) temp

	) temp

GROUP BY temp.D_ID, temp.D_Nazwa

ORDER By Punkty DESC;

To jest wprawdzie kod dla MS SQL Server, więc na MySQL będziesz musiał to sobie przenieść sam. Ale z tego co patrzyłem to instrukcja Case również jest obsługiwana przez MySQL, tak więc nie powinno być problemów.

I jeszcze jedno ... Tak jak pisałem to jest szkic tabel. Trzeba je jeszcze przemyśleć. Nie jestem, aż takim znawcą piłki nożnej, żeby mieć pewność, czy wszystko jest OK. W szczególności trzeba zacząć przemyślenia od tabeli Rozgrywka i RozgrywkaTyp.