[mysql] "wydajne" inventory (gra) w bazie

0

Nazwa tematu dziwna, juz tlumacze.
Mam w bazie danych tylko jedna tabele "uzytkownicy" ktora posiada:
username
password
register_time
damage
armor
exp
hp
gold

Prosta tabela, to jest cala baza gry tylko teraz jest problem z rzeczami, ktore bedzie posiadal gracz.
Pomysl jest taki, aby mogl miec duzej ilosci rzeczy 9999. Czyli nazwa przedmiotu jedno pole, a drugie ilosc tego przedmiotu.

Jak najlepiej zeby bylo wydajnie/szybko:

  1. Stworzyc nowa tabele tylko dla itemow w postaci:
user_id item_name    item_value
3            miecz          999999 
6               helm          1

Co jest dla mnie slabe? Gdy bedzie 100000 uzytkownikow kazde wywolanie inwetory bedzie musial baza przeszukac (coprawda po indexie) duza tabele z wszystkimi rzeczami ktore posiada uzytkownik po user_id.

  1. W tabeli uzytkownicy dodac do tych wszystkich rekordow danego usera po prostu nastepne pola czyli:
username  - aktualna tabela
password  - aktualna tabela
miecz   - nowe pole
miecz_ilosc - nowe pole

I tak dla kazdej rzeczy prawie 2 pola, nazwa i ilosc chyba ze nazwa itemu by byla nazwa pola a nie jego wartosc.
Zaleta tej metody jest taka ze i tak na kazdej stronie pobieramy wszystkie dane danego usera wiec jesli by mial kazdy rekord usera rowniez jego itemy, mielibysmy poprzez jedno zapytanie Od razu wszystkie dane dostepne a w ponizszej metodzie (3) trzebaby zrobic juz JOIN/pobrac z dwoch tabel.

  1. Nowa tabela ale ten sam sposob co nr 2 czyli zamiast dodac wszystkim uzytkownikom rekordy itemow to zrobic osobna tabele:
miecz   - nowe pole
miecz_ilosc - nowe pole
  1. Jakis lepszy/wydajniejszy pomysl?
0

Jeszcze inaczej. To klasyczny przykład relacji wiele-do-wielu. Masz wielu użytkowników, każdy z nich może mieć wiele różnych przedmiotów. Jednocześnie - ważna rzecz której nie zauważyłeś - ilość różnych przedmiotów występujących w grze jest skończona!

  1. Stworzyć tabelę "items":

ITEMS:

  • item_id
  • item_name
  • (ewentualnie) item_weight

i tak dalej, dopisać sobie możesz ewentualnie różne inne parametry, jakie mogą mieć przedmioty. Tabela opisuje wszystkie różne przedmioty istniejące w Twojej grze.

  1. Stworzyć tabelę "items_users":

ITEMS_USERS:

  • item_id
  • user_id

Czyli - tabela określająca, kto ma jaki przedmiot. Oczywiście wszystko powiązane ze sobą kluczami obcymi.

Co jest dla mnie slabe? Gdy bedzie 100000 uzytkownikow kazde wywolanie inwetory bedzie musial baza przeszukac (coprawda po indexie) duza tabele z wszystkimi rzeczami ktore posiada uzytkownik po user_id.

I właśnie do tego wymyślono silniki baz danych, żeby sobie przeszukiwały. O to w tym wszystkim chodzi!

I kilka uwag:
Jedna z podstawowych zasad obowiązujących przy projektowaniu BD - tabele mogą praktycznie bez końca się rozrastać "w pionie", czyli mogą mieć masę rekordów, ale powinny być jednocześnie - w miarę możliwości - jak najwęższe, czyli posiadać minimalną ilość kolumn.

PS. Jakbyś potrzebował jeszcze pomocy, odezwij się na PW albo przez GG...

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