Kshyhoo
13.09.2016, 15:37:01
Witam. Mam kolejny problem, z którym nie mogę sobie poradzić. Tabele:
users
id | name | adv1 | adv2 | adv3 | adv4 |
---+----------+------+------+------+------+
1 | Novak | | | | |
2 | Kovalski | | | | |
3 | Cebula | | | | |
adventure
id | name
---+-------------
1 | nazwa 1
2 | nazwa 2
3 | nazwa 3
4 | nazwa 4
Wyświetlam dane z tabeli
name (w pustych miejscach są liczby).
I teraz pytania:
1. Czy zdołam pobrać
name z tabeli
adventure posiadający tylko nazwy pól z tabeli users (
adv1,
adv2,
adv3,
adv4) ?
2. Jak inaczej (lepiej) przechowywać dane dotyczące usera?
trueblue
13.09.2016, 15:46:09
1. Nie do końca rozumiem. Będziesz w stanie powiązać te tabele, jeśli w polach adv1-4 będą wartości odpowiadające kluczowi id z tabeli adventure.
2. Możesz powiązać tabele przez tabelę pośrednią user_adventure (pozbywasz się pól adv1-4):
Jeśli np. użytkownik 1 "ma" przygody 1 i 4, to wartości w tej tabeli będą następujące:
1,1
1,4
Jeśli dodatkowo jest ważna numeracja przygód, to w tej tabeli można dodać dodatkową kolumnę z numerem.
Dla powyższego przykładu byłoby:
1,1,1 (jeśli przygoda id=1 jest pierwsza, czyli odpowiada wypełnieniu adv1=1)
1,4,2 (jeśli przygoda id=4 jest druga, czyli odpowiada wypełnieniu adv2=4)
Kshyhoo
13.09.2016, 16:04:35
No właśnie takiego powiązania nie ma, więc się pytałem, czy mogę powiązać po nazwie. Czyli najlepszym rozwiązaniem będzie dodanie tabeli i łączenie po ID.
Generalnie problem jest taki. User1 odpala przygodę i zaprasza User3 i User4. Należy zanotować ich ID, wraz z datą. I to robię. Ale chcąc wyświetlić jakiekolwiek statystyki, jet już problem.
Chyba, że do tej tabeli zapiszę też nazwę przygody... ale to nieprofesjonalne ;p
trueblue
13.09.2016, 16:05:43
To jakie wartości obecnie przechowujesz w adv1-4, 0 lub 1?
To nie jest dobry pomysł, bo wtedy musi być założenie, że id w adventure mają zawsze numerację od 1-4 lub inną ale ciągłą.
Gdyby były tam wartości id przygód, to już lepiej. Ale ogranicza Cię to do 4-ech przygód. Najlepszym rozwiązaniem jest tabela przejściowa.
Kshyhoo
13.09.2016, 16:17:05
Trzymam tam statystyki, ile kto i komu.
Mógłbym zliczać rekordy, ale chciałem zrobić to jak najprościej, żeby nie ukręcić bazy... no i muszę liczyć na moje umiejętności a nie jestem profesjonalistą.
Bo w sumie mam już trzecią tabelę:
drops (przechowywane ID i czas)
id | adv | user1 | user2 | user3 | datetime
---+-----+-------+-------+-------+-----------
1 | 1 | 1 | 3 | 2 | 1473542311
2 | 2 | 2 | 3 | 1 | 1473600401
trueblue
13.09.2016, 16:26:52
Ta też powinna być rozbita.
W drops zostaje id, adv, datetime. Klucz główny na id+adv.
Dodatkowa tabela drops_user: id, adv, id_user, wartość. Klucz obcy id+adv (do drops) oraz id_user (do users).
Kshyhoo
13.09.2016, 16:30:50
Nie, po co rozbita. Trzymam tam ID przygody i ID userów z datą a w tabeli users miałem te staty. To ew. dla ułatwienia mógłbym dać nową tabelę do statystyk, gdzie na bieżąco uaktualniał bym stan przygód
trueblue
13.09.2016, 16:41:44
Dlatego, że ograniczasz liczbę userów do 3-ech i komplikujesz potencjalne zapytania.
Chyba, że specyfika "gry" jest taka, że w rozgrywce bierze udział 3-ech graczy. To już Twoja decyzja.
Kshyhoo
13.09.2016, 16:45:35
Graczy jest więcej, ale w rozgrywce bierze udział 2 lub 3.
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.