Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] struktura bazy danych, jak poukladac tabele
Forum PHP.pl > Forum > Bazy danych > MySQL
jacke
witam, zabieram sie za budowe strony na wzor rankingu fifa, czyli obliczanie punktow z meczy, wyswietlanie pozycji etc, tyle ze nie bedzie to zwiazane z pilka nozna a klany (teamy) w takiej strzelance internetowej ;)
pytanie - jak stworzyc strukture bazy danych aby to w miare mialo rece i nogi. napewno w bazie musze miec zawarte info o druzynach, info o meczach, o zawodnikach no i sam ranking druzyn. jak to poukladac?
zaczalem od stworzenia tabeli z druzynami, a w niej takie pola jak: id druzyny, nazwa, ilosc meczy, mecze wygrane, przegrane, remisy, punkty w rankingu (wg ktorych ustalana jest pozycja), natsepnie chce stworzyc tabele z kolejnymi meczami, czyli ktore druzyny graly, wynik druzyny1, wynik druzyny2, rodzaj meczu (towarzyski, pucharowy, rankingowy etc), data meczu - da sie pozniej z takiej tabelki wyciagnac poprzez zapytania ktora druzyna wygrala i odpowiednio zmienic dane w drugiej tabeli, zeby sie punkty podliczyly i zsumowaly mecze? :) do tego dojdze kolejna tabelka w ktorej beda zawarci wszyscy czlonkowie druzyny (czyli po prostu gracze) ale to juz mniej wazne chyba...

do tego, co bedzie mysle wiekszym problemem, punkty beda liczone na zasadzie takiej, ze bedzie to srednia punktow z meczy rozegranych w 6 ostatnich miesiacach... ale to inna bajka i bede msylec jak sie z tym uporac pozniej

czy dobrze robie z takim ulozeniem struktury bazy danych czy polecilibyscie mi cos innego? czy jest cos wedlug was co pominalem a powinno sie znalezc?
Szarex
Ja bym to zrobił tak:

pierwszą tabelę drużyny :
id_drużyny
nazwa

druga tabela - mecze
id_meczu
rodzaj_meczu (towarzyski, a może inny?)
data_meczu (wiadomo)
id_drużyny1 \(żeby było wiadomo kto z kim gra)
id_drużyny2 /
wynik_drużyny1 (w meczu)\ np. 1
wybnik_drużyny2 (w meczu)/ . 0
punkty_drużyny1 (za mecz) \ np.3
punkty_drużyny2 (za mecz) / 0

Chociaż nie wiem, czo może nie lepszym rozwiązaniem (ze względu na prostotę zapytań było by):

druga tabela - mecze
id_meczu
rodzaj_meczu (towarzyski, a może inny?)
data_meczu (wiadomo)
id_drużyny
wynik_drużyny
punkty_drużyny

czyli dla każdego meczu dwa rekordy w tabeli mecze (jeden dla jednej drużyny, drugi dla drugiej, to samo id_meczu rodzaj_meczu i data_meczu) - żeby nie dublować pól rodzaj_meczu i data_meczu możesz zrobić osobną tablicę mecze i tam wrzucać id, datę i rodzaj meczu a do tabeli wyniki dodać tylko id_meczu. Musisz sam zdecydować.

Cytat
a sie pozniej z takiej tabelki wyciagnac poprzez zapytania ktora druzyna wygrala i odpowiednio zmienic dane w drugiej tabeli, zeby sie punkty podliczyly i zsumowal


Która drużyna wygrała? Ta która zebrała 3 punkty za mecz - to da się wyciągnąć przy pomocy zapytania. Punkty też podliczasz poprzez zapytanie. Nie ma sensu wpisywać ich sumy do bazy - od tego jest zapytanie. Zasada jest chyba taka, żeby nie mnożyć bitów w bazie, skoro można do tego użyć zapytań.

Cytat
do tego, co bedzie mysle wiekszym problemem, punkty beda liczone na zasadzie takiej, ze bedzie to srednia punktow z meczy rozegranych w 6 ostatnich miesiacach... ale to inna bajka i bede msylec jak sie z tym uporac pozniej


Za pomocą PHP wyliczasz datę jaka była pół roku temu podliczasz punkty danej drużyny i dodajesz WHERE data_meczu>data_sprzed_6_miesięcy

Z graczami będzie najłatwiej:
id_gracza
nazwa_gracza
id_drużyny

Tyle tak na szybko. Akurat mam podobną sytuację bo na własny użytek postawiłem bazę z klasyfikacją tegorocznego sezonu F1.
Mchl
Cytat(Szarex @ 21.03.2010, 17:44:42 ) *
Za pomocą PHP wyliczasz datę jaka była pół roku temu podliczasz punkty danej drużyny i dodajesz WHERE data_meczu>data_sprzed_6_miesięcy


Albo wprost w MySQL
Kod
WHERE data_meczu > CURDATE() - INTERVAL 6 MONTH

jacke
dzienki, a powiedzcie mi jeszcze... hem, jednym z pol w tabeli meczow jest sila przeciwnika, obliczana jest ona zasadzie: (200-x)/100 - gdzie x jest miejscem przeciwnej druzyny w rankingu, jak to mozna rozwiazac w mysql?
Mchl
Google 'mysql ranking' i na pierwszym, albo drugim miejscu jest dobry opis.
jacke
Cytat(Mchl @ 21.03.2010, 23:22:47 ) *
Google 'mysql ranking' i na pierwszym, albo drugim miejscu jest dobry opis.


z tym akurat poradziłem sobie już wcześniej ;)

  1. <?php
  2. echo '<table border="0" align="center">
  3. <tr>
  4. <td> Rank </td>
  5. <td> Team Name </td>
  6. <td> Matches </td>
  7. <td> Wins </td>
  8. <td> Draws </td>
  9. <td> Looses </td>
  10. <td> Score </td> </tr> ';
  11. $DBConnectRank = "SELECT `TeamName`, `MatchesPlayed`, `Wins`, `Draws`, `Looses`, `OverallScore` FROM `main_ranking` ORDER BY `OverallScore` DESC";
  12. $QueryRank = mysql_query($DBConnectRank);
  13. $Rank = 1;
  14. while ($Line = mysql_fetch_row($QueryRank) AND ($Rank))
  15. {
  16. echo '<tr>
  17. <td> '.$Rank++.'</td>
  18. <td> '.$Line[0].' </td>
  19. <td> '.$Line[1].' </td>
  20. <td> '.$Line[2].' </td>
  21. <td> '.$Line[3].' </td>
  22. <td> '.$Line[4].' </td>
  23. <td> '.$Line[5].' </td> </tr>';
  24. }
  25. echo '</table>';
  26.  
  27. ?>
Mchl
Ale chcesz przecież dostać miejsce konkretnej drużyny w rankingu
jacke
Cytat(Mchl @ 22.03.2010, 12:56:16 ) *
Ale chcesz przecież dostać miejsce konkretnej drużyny w rankingu


Tak, to wiem jak pobrać odpowiedni rekord z bazy (simply). Z drużyny o ID (powiedzmy) 4 wyciągam które zajmuje miejsce w rankingu. Później muszę go podstawić za x do wzoru (200-x)/100 i wrzucić do następnego zapytania które oblicza punkty uzyskane w danym meczu. Później obliczane są średnie meczy z ostatniego miesiąca, później średnia z sześciu miesięcy a na koniec uzupełniane są tabele z rankingiem i poszczególnymi drużynami.

Chwilowy przypływ weny w trakcie pracy O.O Ciekawe czy moje znikome znajomości php i mysql pozwolą mi to stworzyć :D oby...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.