1

Temat: SQL - INFO O STUDENTACH

CREATE TABELE `SEMESTR` 
{ 
`id_semestru`int NOT NULL, 
`nr_semestru`int NOT NULL, 
PRIMARY KEY  (`nr_semestru`), 
}; 

CREATE TABELE `OCENY` 
{ 
`id_oceny`int NOT NULL, 
`id_indeksu`int NOT NULL, 
`id_semestru`int default NULL, 
`srednia`decimal(4,4) default NULL, 
PRIMARY KEY (`id_oceny`) 
FOREIGN KEY (id_semestru) REFERENCES SEMESTR (id_semestry) ON DELETE CASCADE 

CREATE TABELE `STUDENT` 
{ 
`id_indeksu` int NOT NULL  
`imie` varhar(15) NOT NULL, 
`nazwisko` varchar(30) NOT NULL, 
PRIMARY KEY  (`id_indeksu`), 
FOREIGN KEY (id_indeks) REFERENCES OCENY (id_indeks) ON DELETE CASCADE 

};

2

Odp: SQL - INFO O STUDENTACH

To tak na szybko
1) po co tabela semestr? Jak dla mnie jest tu nadmiarowa.
2) w tabeli oceny zrobiłbym klucz nr_semestru (zamiast id_semestru bo tą kolumnę bym wywalił), id_indeksu; id_oceny bym wywalił

Poza tym chyba spox (imie varhar(15) jest literowka smile)

3

Odp: SQL - INFO O STUDENTACH

Witam serdecznie;
0. rozumiem, ze dla jednego studenta w jednym semestrze jest jedna srednia;
1. osobiscie staram sie unikac wszelkich znacznikow NULL gdzie tylko sie da (a da sie zawsze);
2. usuwanie kaskadowe jest dosc niebezpieczne;
3. tabela student; zamiast okrslac studenta innym obiektem czyli id_indeksu uzylbym odzielnego atrybutu (np. id_studenta);
na razie tyle z mojej strony
pozdrawiam

4

Odp: SQL - INFO O STUDENTACH

ad 3.) Jesli zostawi id_indeksu i doda id_studenta to sie posypie 3. postac normalna (jeśli dobrze jeszcze pamietam teorię bazodanowa wink ).

5

Odp: SQL - INFO O STUDENTACH

witam serdecznie;
normalizacje zostawilbym sobie na koniec; obenie chodzi mi o to, aby PK dla tabeli student byl atrybut 'id_studenta' i wylacznie on a nie id_indeksu;
czy na takie rozwiazanie mozemy sie zgodzic?
pozdrawiam

6

Odp: SQL - INFO O STUDENTACH

No tak tylko w tabeli student nie ma kolumny id_studenta wiec pewnie chcesz aby ja dodac i zrobic kluczem. Ale jesli tak zrobimy to ta tabela nie spelnia trzeciej postaci normalnej bo beda zaleznosci od id_indeksu (a chcesz aby od nie byl kluczem). Wszystko sprowadzi sie do tego ze tabele student trzeba bedzie robic na dwie tabele
- w jednej kluczem bedzie id_studenta (ktory dodasz) i nie bedzie id_indeksu
- a druga bedzie sie skladac z dwoch kolumn id_studenta i id_indeksu
Tabela znormalizowana. Poniewaz jest to projekt studencki to pewnie nie maja znaczenia kwestie bezpieczenstwa danych i wydajnosci bazy, zatem czemu id_indeksu nie moze byc kluczem?

7

Odp: SQL - INFO O STUDENTACH

witam;
rzecz jasna, ze id_indeksu moze byc PK lub cokolwiek innego; chodzi mi tylko o jasnosc: student jest identyfikowany przez liczbe; jak ja zwal tak zwal ale id_studenta wskazuje na studenta a id_indeks wydawalo by sie wskazuje na indeks ale nic nie stoi na przeszkodzie aby bylo dokladnie na odwrot;
zatem moze dr ma rozstrzygnie co do tabeli student czy zostawia atrybut PK tak jak go zaproponowal tj. id_indeks czy moze zmienimy (tylko dla jasnosci nazewnictwa) id_student;

8

Odp: SQL - INFO O STUDENTACH

Chciałbym powiedzieć, że screen z widoczną bazą został narzucony przez pana profesora i niestety nie można go zmienić. Zgadzam się z wami, że powinno być tak jak mówicie, jednak nie mogę tego podważać interpretacvji pana profesora. Proszę o informacje na temat kodu, czy jest on poprawny i co by można było zmienić w nim.

Pozdrawiam

9

Odp: SQL - INFO O STUDENTACH

Ostatnio edytowany przez sulavix (2009-11-06 15:23:19)

10

Odp: SQL - INFO O STUDENTACH

witam; opieram sie na Twoim poleceniu sql i screenie profesorskim; testy wykonuje na postgresql 8.4.2, xp sp3;

Twoj kod:

CREATE TABELE `SEMESTR` 
{ 
`id_semestru`int NOT NULL, 
`nr_semestru`int NOT NULL, 
PRIMARY KEY  (`nr_semestru`), 
}; 

w takiej formie baza wygenerowala kilka bledow; podaje polecenie, ktore baza wykonala bez bledow;

CREATE TABLE SEMESTR 
( 
id_semestru int NOT NULL, 
nr_semestru int NOT NULL, 
PRIMARY KEY  (nr_semestru)
); 

czyli: ...TABLE.. nie TABELE; nawiasy okragle nie krecone (to sql nie c); bez pojedynczych codzyslowow; bez ostatniego przecinka po ....(nr_semestru)
slusznie dodales primary key,ktorego nie ma na screenie; ta tabela jest na 100% w 1,2 i 3 postaci normalnej;
zgadzamy sie?
pozdrawiam
cdn...

11

Odp: SQL - INFO O STUDENTACH

Zgadzamy się jak najbardziej z Twoim zdaniem. Czekam na dalsze instrukcje odnośnie mojego kodu. Poniżej zamieszczam kod poprawiony zgodnie z wcześniejszymi wskazówkami.

CREATE TABLE SEMESTR 
( 
id_semestru int NOT NULL, 
nr_semestru int NOT NULL, 
PRIMARY KEY  (nr_semestru)
);  

CREATE TABLE OCENY 
(
id_oceny int NOT NULL, 
id_indeksu int NOT NULL, 
id_semestru int default NULL, 
srednia decimal(4,4) default NULL, 
PRIMARY KEY (id_oceny), 
FOREIGN KEY (id_semestru) REFERENCES SEMESTR (id_semestry) ON DELETE CASCADE 
);

CREATE TABLE STUDENT 
( 
id_indeksu int NOT NULL  
imie varhar(15) NOT NULL, 
nazwisko varchar(30) NOT NULL, 
PRIMARY KEY  (id_indeksu), 
FOREIGN KEY (id_indeks) REFERENCES OCENY (id_indeks) ON DELETE CASCADE 
);

Pozdrawiam
Dr. Ma

Ostatnio edytowany przez Dr. Ma (2009-11-07 14:05:38)

12

Odp: SQL - INFO O STUDENTACH

Witam serdecznie;

CREATE TABLE SEMESTR 
( 
id_semestru int UNIQUE NOT NULL, 
nr_semestru int NOT NULL, 
PRIMARY KEY  (nr_semestru)
); 

CREATE TABLE OCENY 
(
id_oceny int UNIQUE NOT NULL, 
id_indeksu int UNIQUE NOT NULL, 
id_semestru int default NULL, 
srednia decimal(4,4) default NULL, 
PRIMARY KEY (id_oceny),
FOREIGN KEY (id_semestru) REFERENCES SEMESTR (id_semestru) ON DELETE CASCADE 

);

CREATE TABLE STUDENT
(
id_indeks int UNIQUE NOT NULL,  
imie varchar(15) NOT NULL, 
nazwisko varchar(30) NOT NULL, 
PRIMARY KEY  (id_indeks), 
FOREIGN KEY (id_indeks) REFERENCES OCENY (id_indeksu) ON DELETE CASCADE 

);

dodalem klauzule unique poniewaz moj postgresql 8.4 tego wymaga (zreszta slusznie moim zdaniem); na oko wydaje sie, ze tabele oceny i student sa w 2 i 3 postaci normalnej ale to wymagalo by osobnej analizy;
pozdrawiam

13

Odp: SQL - INFO O STUDENTACH

Tabela oceny:
Niech -> oznacza zależność funkcyjną

id_oceny -> id_indeksu,id_semestru
id_indeksu, id_semestru -> srednia
id_oceny -> srednia

Czyli teoretycznie mamy przechodniość, co jest niezgodne z trzecią postacią normalną.
Niespełnienie trzeciej postaci normalnej prowadzi zazwyczaj do nadmiarowości, tutaj nadmiarowość raczej nie będzie występować, bo w każdym wierszu para id_indeksu,id_semestru będzie inna, no ale teoretycznie 3. postać jest niespełniona.

Mylę się?

14

Odp: SQL - INFO O STUDENTACH

witam;
moze wyjdziemy od definicji 3 postaci normalnej, abysmy bez watpliwosc wiedzieli, ze mowimy o tym samym i wtedy sprobowali przeanalizowac te tabele.

15

Odp: SQL - INFO O STUDENTACH

Najprostsza definicja to chyba coś w stylu: wszystkie kolumny nie wchodzące w skład klucza,  zależą wyłącznie od klucza głównego.

16

Odp: SQL - INFO O STUDENTACH

Panowie,

Jeżeli chodzi o 3 PN w sql to definicja brzmi następująco:

każdy atrybut jest funkcjonalnie zależny jedynie od klucza głównego, nie mogą więc istnieć jakiekolwiek zależności przechodnie

17

Odp: SQL - INFO O STUDENTACH

18

Odp: SQL - INFO O STUDENTACH

A jednak, to co podał Dr.Ma to 3NF.
2NF mówi że kolumny zależą od całego klucza, albo inaczej że nie ma kolumny która zależy funkcyjnie  od podzbioru właściwego klucza.

Ostatnio edytowany przez rski (2009-11-10 11:09:34)

19

Odp: SQL - INFO O STUDENTACH

witam;
za Dr E.F. Codd'em powiedzialbym, ze tabela R jest w 3 postaci normalnej (3NF) wtedy i tylko wtedy gdy spelnione sa ponizsze warunki:
-  tabela R jest w 2 postaci normalnej (2NF)
- wszystkie niekluczowe atrybuty tabeli R sa NIE przechodnio (t.j. NIE bezposrednio) zalezne od kazdego (jakiegokolwiek) atrybutu tabeli R
Date, Elmasri i Navathe podaja jeszcze inne definicje mniej lub bardziej zmodyfikowane od oryginalnej Codd'a

20

Odp: SQL - INFO O STUDENTACH

No i czym to się rózni od tego co podał Dr.? Napisał przecież że nie ma przechodniości.
W sumie nie napisał że musi być w 2NF ale chyba nie w tym rzecz.
Sumując oceny nie są w 3NF, bo są zależności przechodnie.

21

Odp: SQL - INFO O STUDENTACH

Ostatnio edytowany przez sulavix (2009-11-10 12:54:36)

22

Odp: SQL - INFO O STUDENTACH

Oceny ma przechowywać informacje o średniej studentów.
Logicznym wydaje się że jeden student (identyfikowany przez swój  numer indeksu) na jednym roku ma jedną średnią ocen.
Więc jeśli wpiszemy w oceny dwa wiersze z identycznym id_indeksu i id_semstru (wiem że nie będziemy wpisywac dwóch takich wierszy bo to bez sensu ale jednak jeśli) to bedą one wyznaczać tę samą ocenę, i mamy przechodnią zależność.
Więc zależność id_indeksy, id_semstru->ocena zachodzi.

23

Odp: SQL - INFO O STUDENTACH

witam;
nie chce domyslac sie; chce znac dziedziny i zakresy tabel nawet jezeli atrybuty sa tak konkretnie okreslone jak imie i nazwisko dlatego poprosilem naszego doktora o przykladowe dane; bedzie o czym rozmawiac jak sadze;

24

Odp: SQL - INFO O STUDENTACH

25

Odp: SQL - INFO O STUDENTACH

Przepraszam Was, że nie odpisywałem, ale w pełni zajętości czasu nie mogłem. Za chwilke postaram się napisać waszą prośbę odnośnie danych, mam jeszcze kilka pytań do was odnośnie zapytań SQL.

Pozdrawiam
Dr. Ma

Ostatnio edytowany przez Dr. Ma (2009-11-19 09:16:17)