Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dobór optymalnej struktury tabeli MySQL, prośba o radę praktyków.
MalyKazio
post 3.09.2008, 16:03:45
Post #1





Grupa: Zarejestrowani
Postów: 168
Pomógł: 1
Dołączył: 19.11.2005

Ostrzeżenie: (0%)
-----


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?


--------------------
"Jak Cię widzą tak Cię piszą, chyba żeś jest wielką fiszą"
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
dr_bonzo
post 3.09.2008, 16:16:23
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Tak wlasnie powinienes zrobic.
Skoro konkurencje do dane, a nie atrybut osoby, i sie zmieniaja to niech beda rekordami a nie kolumna.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
MalyKazio
post 3.09.2008, 18:16:56
Post #3





Grupa: Zarejestrowani
Postów: 168
Pomógł: 1
Dołączył: 19.11.2005

Ostrzeżenie: (0%)
-----


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ę.

Ten post edytował MalyKazio 3.09.2008, 18:36:10


--------------------
"Jak Cię widzą tak Cię piszą, chyba żeś jest wielką fiszą"
Go to the top of the page
+Quote Post
nevt
post 3.09.2008, 18:30:16
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


To jednak nie ma nic wspólnego z PHP. Przenoszę na Bazy Danych.


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
dr_bonzo
post 3.09.2008, 22:09:45
Post #5





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


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


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 7.07.2025 - 00:24