t-sql opinie o bazie

Odpowiedz Nowy wątek
2012-09-19 20:31

Rejestracja: 14 lat temu

Ostatnio: 2 tygodnie temu

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 
edytowany 1x, ostatnio: mar-kasz, 2012-09-19 20:32

Pozostało 580 znaków

2012-09-20 00:24

Rejestracja: 7 lat temu

Ostatnio: 13 godzin temu

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.
  2. 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
  3. 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
  4. 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
  5. nauczyciele
    • to samo co uczniowie
  6. kolaNaukowe
    • każde koło naukowe może mieć tylko jednego ucznia - dodatkowa tabela uczen_kolo (poczytaj o relacji m..n w bazie),
  7. 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ć

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2012-09-20 23:01
Moderator

Rejestracja: 12 lat temu

Ostatnio: 5 godzin temu

Lokalizacja: Wrocław

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?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
edytowany 1x, ostatnio: somekind, 2012-09-20 23:01
"Tylko czemu symulować zamiast po prostu użyć typu logicznego? " bo może nie być typu logicznego w danym systemie, w sql server raczej nie ma - hyde 2012-09-20 23:31

Pozostało 580 znaków

2012-09-20 23:29

Rejestracja: 7 lat temu

Ostatnio: 13 godzin temu

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ć


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2012-09-20 23:40
Moderator

Rejestracja: 12 lat temu

Ostatnio: 12 godzin temu

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


@winerfresh czytaj ze zrozumieniem - przecież napisałem, że miejscowość może mieć WIELE kodów ale na 99% uważam, że jeden kod pocztowy może być przypisany tylko do jednej miejscowości - abrakadaber 2012-09-21 00:00

Pozostało 580 znaków

2012-09-21 00:09
Moderator

Rejestracja: 12 lat temu

Ostatnio: 5 godzin temu

Lokalizacja: Wrocław

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ą?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
no to jednak się okazuje, że nie miałem racji na 99% i jednak też nie może. Co do SZBD bez typów logicznych to np. oracle :) - abrakadaber 2012-09-21 09:37
o 'bit' wiedziałem, ale traktowałem go jako taki int przystosowany do symulacji typu logicznego. Nie wiedziałem natomiast, że można do zmiennej bit przypisać stringi 'true', 'false' i to zadziała. Niemniej, moim zdaniem, to prawie typ logiczny, taka lepsza symulacja typu logicznego. - hyde 2012-09-21 10:28
W jakim sensie lepsza symulacja? W językach programowania typ logiczny też się symuluje, zazwyczaj gorzej niż w SQL Server, który je przynajmniej optymalizuje. A z tym Oracle to smutna sprawa... Jak może nie być podstawowego typu danych? :| - somekind 2012-09-21 21:42

Pozostało 580 znaków

Odpowiedz

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