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.