Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dobór optymalnej struktury tabeli MySQL
Forum PHP.pl > Forum > Bazy danych
MalyKazio
Witam,

Zastanawiałem się czy umieścić ten wątek w dziale PHP czy też MySQL ale chyba ten pierwszy będzie odpowiedniejszy. Chodzi mi o wskazówki jaki rodzaj tabeli będzie odpowiedniejszy do moich zastosowań.
Mam tabelę z wynikami zawodów. Powiedzmy, że nazywa się 'wyniki'. Składa się z kolumn id(autoincrement),osoba(z tabeli osoby),nrzawodow(z tabeli zawody). Potem mam pola z wynikami dla poszczególnych konkurencji np. strzelanie(ilość pkt), bieg(ilość pkt). Teraz moje wątpliwości sprowadzają się do tego, że każde dodanie nowej konkurencji wiąże się z modyfikacją struktury tabeli z wynikami i dodaniem odpowiedniej kolumny. Czy nie lepiej byłoby zrobić oddzielną tabelę 'kokurencje' (idkonkurencji,nazwa), gdzie trzymać ich nazwy a w tabelę z wynikami przerobić na strukturę (id,osoba,nrzawodow,idkonkurencji,wynik)? Wiem, że w przypadku gdy osoba na jednych zawodach startowałaby w wielu konkurencjach to miałbym kilka rekordów w bazie danych zamiast jednego ale z drugiej stron przy 20 konkurencjach nie miałbym przy każdej osobie, która startowała np. tylko w jednej konkurencji na danych zawodów praktycznie całego wiersza pustych wpisów. No i dodawanie kolejnych konkurencji byłoby łatwiejsze.
Co o tym sądzicie?
dr_bonzo
Tak wlasnie powinienes zrobic.
Skoro konkurencje do dane, a nie atrybut osoby, i sie zmieniaja to niech beda rekordami a nie kolumna.
MalyKazio
OK, napiszę to trochę inaczej. Mam bazę harcerzy. Są dane harcerzy w jednej tabeli. W drugiej mamy obozy harcerskie.
Teraz tabela wygląda tak:
ranking harcerzy:
id,harcerz,oboz,pozycja(pod względem ilości zdobytych sprawności na obozie),ocena z obozu,zdobytasprawnosc1,zdobytasprawnosc2,zdobytasprawnosc3,itd.

pola harcerz i oboz to odpowiednio id z innej tabeli, gdzie są harcerze i obozy. Pozycja jest wyliczona na podstawie roznych danych (w ramach jednego obozu),ocena to ocena za obóz (od 1 do 6), zdobytasprawnosc1(...)x to odpowiednio zdobyte sprawnosci (albo tak albo nie - wartosci 0 lub 1).
Czy rozbijać taką tabelę na trzy tabele:
1. rankingharcerzy (id,harcerz,oboz,pozycja,ocena)
2. rankingsprawnosci (id,harcerz,oboz,idsprawnosci,iloscpunktowzanią)
3. listasprawnosci (id,nazwa,punkty).
Czy też nie ma to sensu i jest to za duzo roboty? W chwili obecnej jeśli chcę dodać sprawność to muszę modyfikować tabelę ranking harcerzy i dodawać nową kolumnę.
nevt
To jednak nie ma nic wspólnego z PHP. Przenoszę na Bazy Danych.
dr_bonzo
Wiec tak:

W bazie trzymasz

# Harcerze
Harcerz: id, imie, nazwisko, ...

# Obozy
Oboz: id, data_rozpoczecia,...

# Sprawnosci
Sprawnosci: id, nazwa

# Zdobyte sprawnosci [na danym obozie]
kazdy harcerz moze miec wiele sprawnosci, kazda sprawnosc moze byc posiadana przez wielu harcerzy - czyli masz relacje wiele do wielu;
do tego dochodzi oznaczenie na ktorym obozie zostala zdobyta

ZdobytaSprawnosci: [opcjonalne id], harcerz_id, sprawnosc_id, oboz_id
na podstawie tych danych wiesz jakie sprawnosci zdobyl harcerz w danym obozie; a takze wszystkie sprawnosci jakie posiada (po rekordzie na posiadana sprawnosc - zakladam ze nie ma czegos takiego ze "mogl zdobyc sprawnosc X na obozie Y a jej nie zdobyl", na co moglo by wskazywac:
Cytat
...to odpowiednio zdobyte sprawnosci (albo tak albo nie - wartosci 0 lub 1).

)

# Oceny za oboz
OcenyZaOboz: id, harcerz_id, oboz_id, ocena, ...


Z tych danych mozesz wyciagnac liste zdobytych sprawnosci, przez harcerza (patrz wyzej), ranking na danym obozie (liczony dynamicznie za kazdym razem, jesli bedzie to wolne to mozesz ranking trzymac w innej tabeli - tzn same wyniki przeliczen, nic wiece, zeby odczyt rankingu byl tylko odczytaniem danych z bazy, bez zadnych dodatkokwych obliczen, ale tym zajmij sie pozniej)

Cytat
Czy też nie ma to sensu i jest to za duzo roboty?
W chwili obecnej jeśli chcę dodać sprawność to muszę modyfikować tabelę ranking harcerzy i dodawać nową kolumnę.


Lepiej przy dodawaniu sprawnosci skakac do PMAdmina czy wyklikac sobie nowa sprawnosc w twojej aplikacji?
I jakie umiejetnosci trzeba miec zeby to obsluzyc w obu przypadkach. Ty sobie poradzisz z PMA, a ktos inny?
Struktura bazy NIE powinna byc zmieniana tylko dlatego ze doszly ci nowe dane (rekordy), zmieniasz ja jak musisz trzymac w niej nowe obiekty (np. inf. o zastepowych, kierownikach obozow itp)
To teraz masz prosty wybor, nie? smile.gif
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.