Zaprojektowanie bazy danych pod serwer gry (MySQL)

0

Witajcie, mam kilka pytań odnośnie projektowania wydajnych baz danych w MySQL. Jeżeli gdzieś na forum był podobny wątek to wybaczcie, natomiast chce aby ktoś obeznany w temacie wyjaśnił mi wszystko na przykładzie mojego własnego projektu.

Tak więc muszę zaprojektować bazę danych pod serwer do gry. Do przechowywania jest dość sporo danych i wraz z aktualizacjami mogą się one powiększać(tj. kolumny), więc aby wszystko było w miarę responsywne i wygodne w użyciu rozdzieliłem te dane na kilkanaście tabel.
Wygląda to mniej więcej tak:
Tabela: users | Kolumny: id(primary, a_i), login, password, serial, ip [...] <-- ta tabela jest główną tabelą zawierającą unikalne ID użytkowników oraz podstawowe informacje potrzebne do logowania
Kolejna tabela: stats | Kolumny: id(primary - pobierane z unikalnego ID użytkownika zapisanego w tabeli users), […]
I tak dalej I tak dalej.

A w działaniu wygląda to tak, że gdy użytkownik połączy się z serwerem I pomyślnie się zaloguje, skrypt serverside pobiera większość danych zapisanych w tych tabelach.
I teraz chciałbym prosić was o jakąś rade, w jaki sposób mogę to wszystko wydajnie zrobić. W bazach danych jestem praktycznie zielony i boje się, że takie zaprojektowanie może być strasznie mało wydajne, tzn. przy samym połączeniu użytkownika, skrypt musi wykonać kilka zapytań do różnych tabel i pobrać wymagane dane(w tym samym momencie), nie wiem też jakby to wyglądało gdybym wrzucił wszystko do jednej tabeli (zrobiłby się z tego ogromny moloch, kolumn może być nawet ponad setka - a wtedy zapytania mogłyby być bardzo długie).
Jeżeli chodzi o liczbę użytkowników, szacuje, że może być ich od 5000 do 10 000, z tym, że w jednym momencie z serwera prawdopodobnie korzystało by tylko ok 300-800 (maksymalnie 1000) osób. Ale mimo wszystko wydaje mi się, że robi to dość dużą liczbę zapytań w podobnym czasie.
Więc nie wiem, czy lepiej to wszystko złączyć ze sobą w jedną tabele, czy zostawić rozbite na kilka/kilkanaście. Wydaję mi się, że każde podejście ma jakieś plusy i minusy. A I tak poza tym, oprócz oczywiście pobrania jednorazowo wszystkich danych po zalogowaniu(danego usera), skrypt również w niektórych sytuacjach będzie pobierać dane pojedyńcze(np. jakąś statystykę)

Jeszcze przy okazji - posiadam również tabele w której jeden użytkownik może posiadać kilka rekordów, tabela ma przechowywać unikalne przedmioty.
Wygląda to mniej więcej tak: tabela: items | kolumny: id(unikalne id użytkownika), item_id, amount.
Czy da się to jakoś inaczej(lepiej) zaprojektować? Skrypt musi pobrać wszystkie rekordy z tabeli należące do danego użytkownika. Rekordów może być maksymalnie 30-40 na jedną osobę.
Z góry dzięki za pomoc.

0

Na początek pokaż projekt, który już masz wtedy będzie łatwiej zorientować się w temacie. Dodatkowo wyjaśnij:

  • o jakich aktualizacjach piszesz, że wpływają na zmianę struktury bazy - dodawanie kolejnych kolumn w tablicach,
  • dlaczego chcesz jednorazowo pobierać wszystkie dane o użytkowniku po zalogowaniu
0

A więc tak, omówię to bardziej szczegółowo - cały serwer podzielony jest na "systemy" działające w większości niezależnie od siebie (czyli kod źródłowy całego server-side I client-side podzielony jest na jakby zasoby).
Przykładowo jest system umiejętności, każdy użytkownik musi posiadać swoje własne indywidualne dane odnośnie odblokowanych umiejętności etc. Tak więc postanowiłem to wszystko rozbić na inne tabele (1 tabela = 1 system) I w tym przypadku zrobiłem to mniej więcej w takiej formie: tabela | kolumny: id_usera, umiejetnosc1, umiejetnosc2, etc etc (jako, że umiejętności są stałe i zidentyfikowane w skryptach za pomocą ID to postanowiłem każdą jedną umiejętność zdefiniować w innej kolumnie i zapisywać to wszystko w booleanach, tj. tinyIntach I po prostu działa to jako taki wskaźnik, czy dany gracz ma umiejętność(1) czy nie(0). chciałem ograniczyć ilość możliwych rekordów). Tak samo sprawa wygląda z resztą tabel. Każda jakby jest przypisana do danej grupy funkcjonalności, np. tabela ze statystykami postaci gracza, zbiera głównie informacje na temat poziomu zdrowia, staminy, etc. postaci.. Jeżeli chodzi o aktualizacje - to chodzi mi właśnie o modyfikowanie istniejących już systemów(lub dodawanie nowych, czyli i nowych tabel) - np dodanie nowej umiejętności, gdzie w danym momencie wygląda to tak, że po prostu tworzę nową kolumnę w tabeli posiadającej informacje o odblokowanych umiejętnościach.
Tak więc przy zalogowaniu użytkownika, 'główny' skrypt pobiera wszystkie dane i rozsyła je do różnych zasobów(tj. systemów). Musi tak się dziać z wiadomych względów, ponieważ od razu przy wejściu gracz musi mieć zapisane w pamięci cały postęp postaci, jej statystyki, umiejętności etc..
I teraz po prostu zwracam się z tym do was, ponieważ nie mam praktycznie żadnego doświadczenia z bazami danych, nie wiem jakie rozwiązania mogą być wydajne, a jakie nie. Głównie zastanawiam się nad tym, czy takie coś (co teraz zrobiłem) nie obciąży jakoś mocno bazy danych. Graczy na serwerze nie będzie połączonych(w tym samym momencie) jakoś strasznie dużo, maksymalnie 1000, chociaż szacuje, że będzie to liczba w przydziale 300-800. Oczywiście skrypt serwera również wykonuje zapytania INSERT, **UPDATE **etc. (np. po wyjściu danego gracza, skrypt zapisuje jego dane w db I usuwa z pamięci, aby jej niepotrzebnie nie obciążać). Tak więc głównymi powodami, dla których nie użyłem po prostu jednej tabeli dla praktycznie wszystkiego (m.in. pewnością kolumn byłoby kilkaset) jest to, że skrypt musiałby wykonywać strasznie duże zapytania (np. wyobrażam sobie jakby wyglądałoby zapytanie UPDATE, które zapisuje -wszystkie- indywidualne dane zgromadzone dla danego gracza). Poza tym dalsza rozbudowa takiej tabeli byłaby mało wygodna.
Liczę na wasze sugestie. (ps: w db nie znajdują się jeszcze rekordy, to jest dopiero wstępny projekt, więc mogę dowolnie wszystko modyfikować)

1

Przyznam, że ja bym podszedł do tematu inaczej. To baza danych powinna zawierać pełne informacje/dane, a nie skrypty, Skrypty powinny potrafić interpretować dane w bazie i odpowiednio je zapisywać, modyfikować. Rozumiem, że "systemy" to nic innego jak moduły całego rozwiązania. Czyli baza powinna przechowywać informacje potrzebny do funkcjonowania każdego z modułów.

Najprościej można wyobrazić sobie tablice:
gra.png

Konfigurację systemów i wartości w tablicach: systemy, wartości i systemy_wartosci, a indywidualne dane o graczu masz w gracze_systemy_wartosci.
Wtedy robisz zapytanie dla danego gracza podając jego id i masz informacje o wszystkich systemach i i wartościach. Oczywiście możesz to w zależności od potrzeb filtrować po graczach, systemach i wartościach.

0

Faktycznie, jest to o wiele lepszy sposób. Zobaczę jak to się będzie miało w praktyce. Dziękuje za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1