Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Baza danych w MS SQL Server

Ostatnio zmodyfikowano 2021-01-19 19:05
Autor Wiadomość
Tołdi2426
Temat założony przez niniejszego użytkownika
Baza danych w MS SQL Server
» 2021-01-18 19:17:17
Witam.
Chce stworzyć małą bazę danych, w której będą przechowywane wyniki graczy spisywane co tydzień.
Zaprojektowałem takie coś:
Gracze = {Nick, Lewel, Norma_pkt_do_wyrobienia} w tabeli np. {Tołdi,23,100 000}klucz główny to nick
Wynii_spisow = {Nick,Wynik,Id_spisu} klucz obcy to nick z tabeli Gracze i Id_spisu z tabeli Spisy
Spisy = {Id_spisu, Data_spisu, srednia_wynikow)
Ostrzezenia = {Nick, ile ostrzezen} klucz obcy to Nick z tabeli Gracze

Problem jest w tym że mam za dużą powtarzalność danych w tabeli Wyniki_spisow, powtarza się id_spisu jeśli 30 gracy uczestniczy w spisie i nicki jeśli spisów jest więcej niż 2.
Jest sposób żeby to znormalizować? Myślałem jeszcze nad tym żeby dla każdego gracza tworzyć osobną tabelę.
P-177981
pekfos
» 2021-01-18 19:40:47
Tekst w roli klucza głównego to słaby pomysł. Powinieneś raczej zrobić liczbowe identyfikatory z autoincrementem. Tabela Ostrzezenia wydaje się nie mieć sensu, bo to relacja 0..1 z graczami i masz tam tylko jedną kolumnę danych, lepiej ją przenieść do tabeli z graczami. Ewentualnie zamiast liczby ostrzeżeń trzymaj coś bardziej pożytecznego, jak np opis i datę wystawienia ostrzeżenia.
Przechowywanie średniej wyników ma sens tylko jeśli przemawiają za tym argumenty wydajnościowe, bo normalnie możesz obliczyć ją przez agregację wyników i w małej bazie danych to raczej preferowane rozwiązanie.

Problem jest w tym że mam za dużą powtarzalność danych w tabeli Wyniki_spisow, powtarza się id_spisu jeśli 30 gracy uczestniczy w spisie i nicki jeśli spisów jest więcej niż 2.
Takie powtórzenia to nie problem, lecz norma w relacyjnych bazach danych.
P-177982
DejaVu
» 2021-01-18 19:41:48
Jeżeli masz mniej wpisów niż 50k to bym się nie przejmował normalizacją. Zrealizuj projekt tak, aby dało się łatwo później zmodyfikować strukturę bazy danych.
P-177983
Tołdi2426
Temat założony przez niniejszego użytkownika
» 2021-01-18 20:41:59
Czyli tak jest w 100 % poprawnie ?
Gracze = {Id_Gracza, Nick, Lewel, Norma, Ostrzezenia }
Spis = {Id_Spisu, Data_spisu}
Wyniki = {Nick, Wynik, Id_spisu} - klucz obcy to nick bo przy wpisywaniu nie znam Id_Gracza ?

Czy może lepiej napisać procedure do wstawiania która znajdzie odpowiedni Id_gracza ?
P-177984
pekfos
» 2021-01-18 20:51:03
Klucz obcy powinien używać Id_Gracza.
P-177985
Tołdi2426
Temat założony przez niniejszego użytkownika
» 2021-01-19 19:05:03
Jeszcze jedno pytanie, mam już dwa spisy i chciałbym teraz wypisać takie dane |GRACZE | SPIS_1  | GRACZE | SPIS_2 |

Stworzyłem taką komedę
C/C++
select sp.Id_Gracza as Spis1, sp1.Id_Gracza as Spis2, sp.Wynik as Spis1, sp1.Wynik as Spis2 from( select * from Wyniki_spisow where Wyniki_spisow.Id_Spisu = 1 ) as sp
full join( select * from Wyniki_spisow where Wyniki_spisow.Id_Spisu = 2 ) as sp1
on sp.Id_Gracza = sp1.Id_Gracza

Wypisuje ona tylko id a muszę to zamienić na nicki, które są w tabeli Gracze. Pytanie jak można się dobrać do nich?

W sumie to już się udało

C/C++
select sp1.Nick as Nick, sp.Wynik as Spis1, sp2.Wynik as Spis2 from( select * from Gracze ) as sp1 full join( select * from Wyniki_spisow where Wyniki_spisow.Id_Spisu = 1 ) as sp
on sp.Id_Gracza = sp1.Id_Gracza full join( select * from Wyniki_spisow where Wyniki_spisow.Id_Spisu = 2 ) as sp2
on sp2.Id_Gracza = sp1.Id_Gracza;
P-177991
« 1 »
  Strona 1 z 1