t-sql opinie o bazie

0

witam, wiem że wątek nadaje się do działu dla początkujących ale tu spodziewam się wcześniej odpowiedzi, kod nie jest na zaliczenie ;), 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 
0
  1. miasta
  • nie wiem czy wiesz ale jedna miejscowość może mieć wiele kodów pocztowych,
  • jak wpadłeś na ten genialny pomysł, żeby dodać do tabeli pole id (czyli sztuczny klucz) i jednocześnie kluczem głównym uczynić całkiem inne pole, które się zresztą do tego nie nadaje bo jest wiele miejscowości, które nazywają się tak samo ale leżą w różnych miejscach,
  • kody pocztowe w Polsce mają 6 znaków i jeśli już to bardziej się opłaca zastosować tutaj pole char niż varchar,
  • kody pocztowe są unikalne, tzn. nigdzie nie może występować dwa razy ten sam kod. Jak już to właśnie to pole może być PK a nie miejscowość,
  • jeśli masz tabelę słownikową i nazywa się ona miasta to główne pole powinno się nazywać miasto a nie miejscowość - to się nazywa konsekwencja.
  1. osoby
  • jestem ciekaw jak tam wpiszesz Brzęczyszczykiewicz jako nazwisko, albo nr telefonu jak np. (32) 200 10 30,
  • miasto powinno być int, patrz punkt 1,
  • uczen/nauczyciel - pola bool symuluje się przez char(1) (wstawia się T/N albo Y/N albo 1/0) a nie varchar(3) - jak już bardzo chcesz 3 znaki to char(3) (tak/nie - nigdy nie wstawisz tam 1 albo 2 znaków),
  • osoby nie mają adresu
  1. klasy
  • co to jest oznaczenie klasy,
  • numer powinien być varchar(3) żeby można było zapisać np. 3b albo 3 a
  • ilość uczniów wynika z tabeli uczniowie, nadmiarowość jest zbędna
  1. uczniowie
  • masz niekonsekwencję - jest idMiasta, idKlasy ale tu jest samo id
  • co to jest numerucznia, dlaczego jest różny od id i dlaczego jest PK,
  • skoro jest referencja do osoby to po co dublujesz nazwisko i miasto,
  • pole FK powinno się nazywać tak samo jak pole w tabeli do której się odwołujesz - nie nrOsoby tylko idOsoby. Nazywanie tych samych pól tak samo w całej bazie przynosi korzyści,
  • tak samo z klasa
  • a kiedy te nieobecności były, czy są usprawiedliwione czy nie, itp - dodatkowa tabela
  1. nauczyciele
  • to samo co uczniowie
  1. kolaNaukowe
  • każde koło naukowe może mieć tylko jednego ucznia - dodatkowa tabela uczen_kolo (poczytaj o relacji m..n w bazie),
  1. stolowka
  • po co jest ta tabela,
  • co ma ze stołówką wspólnego jedna, konkretna osoba
  • klasa wynika z ucznia - uczeń może być tylko w jednej klasie - niepotrzebna nadmiarowość, poza tym jak uczeń zmieni klasę to trzeba pamiętać aby tu zmienić
0
abrakadaber napisał(a):
  • kody pocztowe w Polsce mają 6 znaków i jeśli już to bardziej się opłaca zastosować tutaj pole char niż varchar,

Jak się człowiek bardzo uprze, to może użyć char(5) i wstawiać kreskę w GUI. ;)

  • kody pocztowe są unikalne, tzn. nigdzie nie może występować dwa razy ten sam kod. Jak już to właśnie to pole może być PK a nie miejscowość,

"Nigdzie" tzn. gdzie? Jedna ulica może mieć wiele kodów pocztowych, a z drugiej strony jeden kod może mieć wiele miejscowości.

  • uczen/nauczyciel - pola bool symuluje się przez char(1) (wstawia się T/N albo Y/N albo 1/0) a nie varchar(3)

Tylko czemu symulować zamiast po prostu użyć typu logicznego?

0
somekind napisał(a):
  • kody pocztowe są unikalne, tzn. nigdzie nie może występować dwa razy ten sam kod. Jak już to właśnie to pole może być PK a nie miejscowość,

"Nigdzie" tzn. gdzie? Jedna ulica może mieć wiele kodów pocztowych, a z drugiej strony jeden kod może mieć wiele miejscowości.

na 99% jestem pewny, że dla pary kod pocztowy - miejscowość, kod pocztowy jest unikalny. Nie mówimy o ulicach czy dzielnicach tylko miejscowościach. Jeśli tak nie jest to oczywiście kod pocztowy też nie może być PK

  • uczen/nauczyciel - pola bool symuluje się przez char(1) (wstawia się T/N albo Y/N albo 1/0) a nie varchar(3)

Tylko czemu symulować zamiast po prostu użyć typu logicznego?
bo nie wiem czy jest - nie miałem do czynienia z mssqlem na tyle aby to wiedzieć

0

Jedna miejscowość może mieć wiele kodów pocztowych, gdyż jest to nr urzędu pocztowego, a nikt nie powiedział, że jedno miasto nie może mieć ich kilku (jak np. Poznań, Warszawa, Gdańsk).

0
abrakadaber napisał(a):

na 99% jestem pewny, że dla pary kod pocztowy - miejscowość, kod pocztowy jest unikalny.

Np. kod pocztowy 96-314 mają miejscowości: Baranów, Boża Wola, Kaski, Cegłów, Bronisławów, Gole, Buszyce, Basin, Bronisławów, Gongolina, Wyczółki, Żaby, Murowaniec, Regów, Murowaniec, Stara Pułapina, Strumiany, Drybus, Holendry Baranowskie, Kopiska, Osiny, Nowa Pułapina.
Z kolei Żyrardów ma kody: 96-300, 96-301, 96-302, 96-304 i 96-314.
Jak widać, w żadną stronę nie ma unikalności.

@hyde, co do typu logicznego: http://msdn.microsoft.com/en-us/library/ms177603.aspx

Są jakieś SZBD, które typów logicznych nie mają?

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