[sql] opinie o bazie

witam, zacząłem się uczyć języka T-SQL, zrobiłem kilka prostych tabel ale postanowiłem zrobić coś większego, jest to baza danych zawierająca informacje o nauczycielach i uczniach w szkole wstawiam kod proszę o opinie i wskazanie błędów.

o to kod:

SET LANGUAGE polski

GO


--------- CREATE


create database szkola;


create table miasta(idMiasta int identity(1 , 1) not null, miejscowosc varchar(15) primary key, kodPocztowy varchar(7));


create table osoby(idOsoby int identity(1 , 1) not null primary key, nazwisko varchar(10), imie varchar(10),

 nrTelefonu int, miasto varchar(15) references miasta(miejscowosc), uczen varchar(3), nauczyciel varchar(3));


create table klasy(idKlasy int not null primary key, numerKlasy int, profilKlasy varchar(15), 

oznaczenieKlasy varchar(2), liczbaUczniow int);


create table uczniowie(id int identity(1 , 1) not null, nrOsoby int references osoby(idOsoby), numerUcznia int primary key, nazwisko varchar(10), 

miasto varchar(15) references miasta(miejscowosc), numerWDzienniku int, klasa int references klasy(idKlasy), liczbaNieobecnosci int);


create table nauczyciele(id int identity(1 , 1) not null, nrOsoby int references osoby(idOsoby), numerNauczyciela int primary key, 

nazwisko varchar(10), imie varchar(10), miasto varchar(15) references miasta(miejscowosc), wychowawca varchar(3),

specjalnosc varchar(15), lataStazu int, wykorzystanyUrlop int, opis varchar(40));


create table kolaNaukowe(idKola int identity(1 , 1) not null primary key, nazwaKola varchar(20), 

numerUcznia int references uczniowie(numerUcznia), numerKlasy int references klasy(idKlasy));


create table osiagniecia(id int identity(1 , 1) not null primary key, numerUcznia int references uczniowie(numerUcznia), 

numerNauczyciela int references nauczyciele(numerNauczyciela), opisOsiagniecia varchar(50));


create table stolowka(id int identity(1 , 1) not null primary key, numerOsoby int references osoby(idOsoby));



GO

Rozumiem, że zapytanie tyczy się kwestii projektowej. Czy bardziej technicznego podejścia (kodu)?

Ja odpowiem co nieco w kwestii pierwszej.

  1. Jedno miasto może mieć wiele kodów pocztowych, więc umiejscowienie tego pola w tablicy miasta nie jest najszczęśliwsze. Ja osobiście przeniósłbym do tabeli osoby i dodał pole ulica (wydaje się być powinno przy tych danych). I jeszcze uwaga czemu 7 znaków na pole kod pocztowy?

  2. w tabeli osoby dałeś pola uczeń, i nauczyciel do tego typu varchar(3). Nie za bardzo łapię. Domyślam się że pole ma określić ‘typ’ tej osoby ale wówczas wystarczyło by pole typu bool. Idąć dalej co w przypadku kiedy będziesz chciał dodać pracowników administracyjnych (woźny, sekretarka) - kolejne pole? A nauczycieli kontraktowych - inne zasady urlopowe. Tutaj lepszym rozwiązaniem będzie jakiś enumerator czyli tabela z typami osób i referencja do tej tabeli.

Dalej już się tak nie wgłębiałem poza tym nie do końca rozumiem cel niektórych pól ale myślę że poprzedni punkt może dać ci troszkę pomysł jak z tym pracować.

Jeszcze o polu liczba nieobecności. Też widziałbym tu inne rozwiązanie. Przede wszystkim dla tego, że ważną informację jest kiedy osoba nie była obecna na zajęciach. A więc tabela z wpisem w stylu (id_osoby, data) i zliczenie liczby nie obecności w logice programu, ewentualnie z wykorzystaniem procedury składowanej.

dziękuje za odpowiedź, chodziło mi o ocenienie sensowności tego mojego projektu i tego czy dobrze przydzieliłem klucze w tabelach.

1 z tym kodem pocztowym racja, umiejscowiłem tabeli miasta kod pocztowy ponieważ chciałem opisać dokładnie miasto, ale racja jedno miasto może mieć kilka kodów pocztowych. a 7 znaków na kod pocztowy bez zastanowienie przydzieliłem.

  1. myślałem nad typem bool zamiast varchar(3), chciałem oddzielić ucznia od nauczyciela, a o pozostałych pracownikach nie pomyślałem.