Baza danych - Ośrodek Szkolenia Kierowców

0

Witam,

proszę o sprawdzenie projektu bazy, która ma służyć ośrodkowi szkolenia kierowców.
Mam nadzieję, że zostanę nakierowany na błędy, których jest zapewne wiele :)

http://img221.imageshack.us/img221/4870/bazal.png

0

kursanci i kierowcy:

  • jak Ty wpakujesz numer telefonu oraz PESEL do kolumn typu integer?

adres:

  • dlaczego adres ma wskazanie na kursanta, a nie odwrotnie?
  • tabela jest nieznormalizowana: miasta, województwa, kody pocztowe - to powinno być w słownikach

kierowca:

  • dlaczego masz tu kolumny miasto, ulica, itp. zamiast wskazania na adres?

jazdy:

  • dzień typu date i godzina typu datetime. O co chodzi?

Poza tym zupełny brak konwencji w nazwach. Tabele raz liczbą pojedyncza, raz mnoga, w nazwach kolumn raz podkreślniki raz brak - nieestetycznie to wygląda.

0

heh, tez sie dorzuce
czemu wplaty nie sa powiazane z kursem, wplat dokonuje sie za kurs chyba, czy lapowki tez bedziecie rejestrowac :)
czemu w egzwewteoria.dataegz jest typu integer
zarowno egzwewteoria jak i egzwewpraktyka powinny miec powiazanie z kursem, bo znowu egzaminy zdajesz na zakonczenie danego kursu
poza tym moze to byc jedna tabela z typem egzaminu (a dla teorii kierowca bedzie null)
wracajac jeszcze do wplat, pewnie moze byc tak, ze mozna za kurs zaplacic w ratach, warto miec gdzies cennik kursow oraz jak juz dany kursant zapisze sie na kurs, to miec informacje ile za ten kurs powinien zaplacic (dzieki temu latwo bedzie dodac tez funkcjonalnosc promocji etc.), dzieki temu bedzie mozna porownac sume wplat za kurs z cena kursu i sprawdzic czy cala kwota wplynela

generalnie traci amatorka :/

0

Witam ponownie :)

Przede wszystkim dziękuję za odpowiedzi i konstruktywną krytykę.
Starałem się zastosować do uwag i tym razem spłodziłem coś takiego:

http://img94.imageshack.us/img94/7231/oskv.png

Nie jestem pewny czy taki "system ratalny" będzie właściwie działał czy trzeba to jakoś inaczej zrobić.
I czy połączenie tabel Adres i Adres2 za pomocą kodu pocztowego jest właściwe?

1
Robson2510 napisał(a)

I czy połączenie tabel Adres i Adres2 za pomocą kodu pocztowego jest właściwe?

Oczywiście, że to połączenie jest niewłaściwe. Jaki niby jest kod pocztowy dla miejscowości Warszawa?

  1. Adres2 to nic niemówiąca nazwa. Dlaczego tabelę, w której będą miejscowości nazwałeś w ten sposób?
  2. Czy jesteś pewien, że jeden Kurs może mieć tylko jedną Jazdę i jedną Wpłatę?
  3. Float to zły typ danych dla ceny, potrzebne jest coś stałoprzecinkowego.
  4. O co chodzi z tablą Wpłata i czterema kolumnami WpłataX w niej?
  5. Egzaminy są jednocześnie teoretyczno-praktyczne w końcu? Bo tabela ma dwa pola na różne wyniki.
  6. PESEL ma zawsze 11 znaków, więc nie ma sensu robić varchar, skoro można char.
  7. Struktury tabel Kierowca i Kursant są identyczne. Czy jest zatem sens to rozbijać na dwie tabele? Może lepiej zrobić jedną i do tego słownik typów?
0
somekind napisał(a)
  1. Struktury tabel Kierowca i Kursant są identyczne. Czy jest zatem sens to rozbijać na dwie tabele? Może lepiej zrobić jedną i do tego słownik typów?

Jeśli zatem w tabeli powiedzmy "Osoba" będę miał kurantów i kierowców to jaka powinna być relacja między tabelą Osoba a tabelą Kurs?
Jeden kurs musi posiadać wiele osób (kursant i kierowca) ale zarazem nie może posiadać wielu kursantów.

0

W takim przypadku tabela Kurs nie wymaga żadnej zmiany - będziesz miał IdKursanta i IdKierowcy, oba wskazujące na tabelę Osoba.

0

Nie do końca jestem pewny czy to tak ma wyglądać jak myślę...
Tabela Osoba ma mieć klucz główny składający się z dwóch kolumn IdKierowca i IdKursant o odwołanie do tabeli TypOsoba?

http://img508.imageshack.us/img508/2377/osoba.png

Czy IdKursant i IdKierowca mają się odwoływać to tabeli Osoba gdzie będą się znajdować dane?

0

Tu nie ma żadnej magii, wszystko jest jak w rzeczywistym świecie. Różne osoby mogą mieć różne typy, a w kursie biorą udział dwie osoby - kierowca i kursant.

Zatem to Osoba ma IdOsoby (swój klucz główny). Ma też klucz obcy IdTypuOsoby wskazujący na tabelę TypOsoby. Natomiast tabela Kurs ma klucze obce IdKierowcy i IdKursanta wskazujące na tabelę Osoba.

0

Hmm ale skąd w tabeli Kurs mają się naleźć te klucze obce IdKierowcy i IdKursanta? Przecież te kolumny nie występują w tabeli Osoba, gdzie kluczem głównym jest IdOsoby.

0

Jak to skąd się mają wziąć? Ty masz je zrobić.
W tabeli Kurs robisz kolumny: IdKierowcy i IdKursanta, obie jako klucze obce do tabeli Osoba, której kluczem głównym jest IdOsoby.

P.S. To chyba instruktor powinien być, a nie kierowca...

0

Tak, oczywiście instruktor będzie bardziej prawidłowo ale to w tej chwili najmniejszy problem :)

Wychodzi na to, że muszą być dwa powiązania między tabelami Osoba i Kurs, czy da się to jakoś inaczej zrobić?
Poza tym jeśli chodzi o adres to wydaje mi się, że pasowałoby podczepić ulicę po miejscowość?

http://img521.imageshack.us/img521/4931/bazac.png

0
Robson2510 napisał(a)

Wychodzi na to, że muszą być dwa powiązania między tabelami Osoba i Kurs, czy da się to jakoś inaczej zrobić?

No tak, oczywiście, że muszą być dwa.

Poza tym jeśli chodzi o adres to wydaje mi się, że pasowałoby podczepić ulicę po miejscowość?

Z punktu widzenia normalizacji tak, jak najbardziej. Takie rozwiązanie stosuje się w niektórych systemach, a w niektórych po prostu wpisuje się ulice ręcznie.

Tylko tu jest pewien problem.
Bo ogólnie może być tak, że:

  1. jedna miejscowość ma wiele kodów pocztowych;
  2. ten sam kod pocztowy ma wiele miejscowości;
  3. jedna ulica leży w obszarze jednego kodu pocztowego;
  4. jedna ulica leży w obszarze wielu kodów pocztowych.

Wychodzi na to, że należałoby mieć tabele:

  1. Miejscowosc (Id, Nazwa);
  2. KodPocztowy (Kod);
  3. Ulica (Id, Nazwa, IdMiejscowosci [FK do Miejscowosc.Id], KodPocztowy [FK do KodPocztowy.Kod]);
  4. Adres (Id, NrBudynku, NrMieszkania, IdUlicy).

Kod pocztowy sam w sobie jest kluczem i nie trzeba wprowadzać dodatkowego, więc tutaj wystarczy jedna kolumna. Taka tabela dziwnie wygląda, ale będzie można wymusić integralność. Tylko sam już nie wiem, czy to ma sens. :D

Jazda - wydaje mi się, że powinna mieć czas trwania.

Kategoria - Cennik - czy to nie jest powiązanie 1:1? Jeśli tak, to tabela Cennik jest zbędna. No, chyba że ceny mają zmieniać się w czasie, wówczas powinny być w nim dwa pola datetime do określenia od kiedy do kiedy obowiązywał. Wówczas Kurs musiałby mieć wskazanie na IdCennika. (I dochodzimy do sytuacji, w której Kurs nie jest powiązany z Kategorią bezpośrednio, tylko przez Cennik.)

Egzamin.Wynik - co tam może być? Bo jeśli tylko zdany/nie zdany, to wystarczyłoby pole typu logicznego.

0
somekind napisał(a)

Jazda - wydaje mi się, że powinna mieć czas trwania.

Jedna jazda = 1h zawsze. Jeśli ktoś zapisze się na 2h to bierze dwie jazdy (powiedzmy). Wydaje mi się, że tak będzie bardziej przejrzyście?

somekind napisał(a)

Kategoria - Cennik - czy to nie jest powiązanie 1:1? Jeśli tak, to tabela Cennik jest zbędna. No, chyba że ceny mają zmieniać się w czasie, wówczas powinny być w nim dwa pola datetime do określenia od kiedy do kiedy obowiązywał. Wówczas Kurs musiałby mieć wskazanie na IdCennika. (I dochodzimy do sytuacji, w której Kurs nie jest powiązany z Kategorią bezpośrednio, tylko przez Cennik.)

Chyba jednak skasuje tabele Cennik i ceny znajdą się w tabeli Kategoria. Faktycznie nie ma co komplikować.

somekind napisał(a)

Egzamin.Wynik - co tam może być? Bo jeśli tylko zdany/nie zdany, to wystarczyłoby pole typu logicznego.

Zgadza się - negatywny/pozytywny.
Również rodzaj egzaminu i forma płatności chyba powinno mieć pole tego typu.

0
Robson2510 napisał(a)

Jedna jazda = 1h zawsze. Jeśli ktoś zapisze się na 2h to bierze dwie jazdy (powiedzmy). Wydaje mi się, że tak będzie bardziej przejrzyście?

No jeśli zawsze godzina, to faktycznie nie ma sensu.

Zgadza się - negatywny/pozytywny.
Również rodzaj egzaminu i forma płatności chyba powinno mieć pole tego typu.

Co do rodzaju egzaminu... No niby można skasować ten słownik i dać pole "CzyPraktyczny" w tabeli Egzamin. Ale nie wiem czy to słuszne rozwiązanie. Co jeśli pojawi się jakiś trzeci typ egzaminu? Lepiej chyba zostawić słownik.
Co do form płatności: gotówka, przelew, czek, przekaz pocztowy, Platnosci.pl, PayPal - już masz sześć form. Tego tym bardziej tak nie zrealizujesz, tak jak teraz jest dobrze. :)

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