PDA

Prikaži potpunu verziju : Normalizacija baze podataka


FakeDeath
7.12.2013, 15:38
Interesuje me druga i treca NF, i kako da prepoznam funkcionalnu zavisnost?

FakeDeath
7.12.2013, 15:56
Na primer:

Studenti (BrojIndeksa, SifraPredmeta, Ime, Prezime, Semestar, Ocena, Predmet, Profesor, SifraSmera, Smer)

2NF
Studenti1 (BrojIndeksa, Ime, Prezime, Semestar, SifraSmera, Smer)
Prijava (BrojIndeksa, SifraPredmeta, Ocena)
Predmeti (SifraPredmeta, Predmet, Profesor)

Za pocetak mi nije najjasnije zasto je kljuc slozen(zasto ne bilo dovoljno da primarni kljuc bude samo BrojIndeksa).
Student1 i Predmet su mi donekle jasni ali ni njih najbolje ne razumem, ali zato Prijavu u opste ne kontam.

Ivan452
7.12.2013, 16:07
Na primer:

Studenti (BrojIndeksa, SifraPredmeta, Ime, Prezime, Semestar, Ocena, Predmet, Profesor, SifraSmera, Smer)

2NF
Studenti1 (BrojIndeksa, Ime, Prezime, Semestar, SifraSmera, Smer)
Prijava (BrojIndeksa, SifraPredmeta, Ocena)
Predmeti (SifraPredmeta, Predmet, Profesor)

Za pocetak mi nije najjasnije zasto je kljuc slozen(zasto ne bilo dovoljno da primarni kljuc bude samo BrojIndeksa).
Student1 i Predmet su mi donekle jasni ali ni njih najbolje ne razumem, ali zato Prijavu u opste ne kontam.

Slozeni kljuc se koristi u prijavi zato sto BrojIndeksa nije jedinstveni identifikator prijave. Jedan student moze da prijavi vise ispita.
(U teoriji ni ovaj slozeni kljuc nije jedinstveni identifikator jer jedan student moze da prijavi jedan ispit u vise razlicitih rokova, ali ako su vam ovako dali nemoj o tome da razmisljas previse).

3NF - Trebas da uklonis kolone iz svake tabele koje nisu totalno zavisne od primarnog kljuca te tabele.

U tvom primeru. Iz tabele Studenti1 trebas da uklonis detalje o Smeru (i verovatno semestru) i da umesto toga imas samo vezu preko FK-a ka tabeli Smer.
Nije mi jasna totalno tabela Predmeti tj. njeni atributi Predmet i Profesor. Ali prati istu logiku kao za Smer.

P.S
Imenuj tabele ili u mnozini ili u jednini (pozeljno u jednini), nemoj malo jedno a malo drugo da koristis.

Partybreaker
8.12.2013, 14:45
Evo jednog domaćeg video tutorijala, nije moj, ali verujem da će pomoći: http://rapidshare.com/files/160456108/BCNF.avi (idi samo na to Download)

FakeDeath
9.12.2013, 20:45
Treba mi normalizacija sa 3NF.

http://s17.postimg.org/4hky4y74v/Capture.jpg

Imam relaciju
STUDENT(IND#, ŠIFRA_PREDAVANJA, IME, SEMESTAR, ŠIFRA SMERA, NAZIV_SMERA, IME_RUKOVODIOCA, NAZIV_PREDMETA)

Ja sam to ovako uradio:
2NF

STUDENT1(IME, SEMESTAR, SIFRA_SMERA)
PREDMET(SIFRA_PREDMETA, NAZIV_PREDMETA)
SMER(SIFRA_SMERA, NAZIV_SMERA, IME_RUKOVODIOCA)

E sad, ako je ovo dobro, u SMER imam tranzitivnu zavisnost?
Kako to da resim?

Neky
9.12.2013, 21:17
Ja bih izdvojio i rukovodioca.

Ivan452
9.12.2013, 21:53
Ako smes da koristis samo ovo sto ti je dato u ovoj tabeli sa slike (http://s17.postimg.org/4hky4y74v/Capture.jpg), situacija je sledeca:

Student (IND#, IME, SEMESTAR,SIFRA_SMERA)
Student_Predavanje(IND#,SIFRA_PREDAVANJA)
Predavanje (SIFRA_PREDAVANJA, NAZIV_PREDMETA)
Smer (SIFRA_SMERA, NAZIV_SMERA, IME_RUKOVODIOCA)

Ovo je situacija pod sledecim predpostavkama:
1. Jedan student moze da prisustvuje na vise predavanja. Jedno predavanje moze da sadrzi vise studenata (veza vise na vise i zato se pravi vezna tabela)
2. Jedan student moze da bude na jednom smeru, jedan smer moze da ima vise studenata (veza jedan na vise)
3. U svakom predavanju se nalazi naziv predmeta kojem pripada
4. U svakom smeru se nalazi ime rukovodioca koji njime rukovodi.

Ovo je tabela napravljena iskljucivo sa kolonama koje su date. Podvucene kolone su primarni kljucevi, a italic kolone su strani kljucevi. U slucaju vezne tabele oba su podvucena i italic, i to je kompozitni primarni kljuc.

P.S
Imaj na umu da je primer vrlo los. Da ne moze da se uradi totalno tacno, jer moze da postoji vise tumacenja ako se koriste samo date kolone. U teoriji prvo bi morao (kako Neky) kaze da izdvojis rukovodioca. Jer jedan rukovodioc moze biti na vise smerova. Potom bi i se i semestar odvojio od studenta, i naziv predmeta od predavanja. Tako da uzmi ovo sa malom rezervom.

FakeDeath
12.1.2014, 17:41
Nije normalizacija, al' su baze, pa da ne pravim novu temu.
Imam dve tabele:
Drzava(Ime_drzave,ID_drzave)
Osoba(Ime_osobe,Ime_drzave,ID_drzave)

Kako da povezem tabele, tako da se, kada u tabelu osoba unesem ime drzave, automatski ispise ID_drzave?
Ako mi ne fali jos nesto naravno :D

Ja sam povezao ID_drzave iz jedne i druge tabele, ali se ne ispise, nego ja moram da unosim :confused:

Teva
12.1.2014, 18:10
To se radi triggerima :)
Nešto ovako čini mi se.

CREATE TRIGGER triger_aio
AFTER INSERT ON 'Osoba' FOR EACH ROW
BEGIN
SET new.id_drzave = (select id from drzava where ime_Drzave = new.ime_drzave);
END


Mala digresija, ovo dupliranje podataka ti je nepotrebno, jer imaš ime države u dve tabele. Ime države u tabeli Osoba ti nije potrebno, već samo id_države sa stranim ključem nad državom (ukoliko nećeš da ti osoba bude iz neke države koja nije u tabeli država), u suprotnom tabela država ti je višak :)

FakeDeath
12.1.2014, 19:50
To se radi triggerima :)

Kako to u Accessu da uradim?

Teva
12.1.2014, 20:30
Ne bih znao.
Al mora da postoji negde gde možeš ručno da iskodiraš u accessu nešto

Neutrino
12.1.2014, 21:40
Ne kapiram šta će mu trigeri ako već ima obezbeđen referencijalni integritet u svojim relacijama :confused:

Što se Accessa tiče ako me pamćenje ne vara za uspešan unos podataka kod 1:n relacija moraš da koristiš podforme (subforms) kod kojih vezu između glavne forme (tabele sa stranim ključem) i podforme (tabele sa primarnim klučem) ostvaruješ samom relacijom. Na taj način sprečavaš probleme sa referencijalnim integritetom gde recimo ne možeš da uneseš podatke za tabelu sa stranim ključem jer nemaš odgovarajuće podatke u tabeli sa primarnim ključem.

http://office.microsoft.com/en-001/access-help/create-a-form-that-contains-a-subform-a-one-to-many-form-HA010098674.aspx

Ivan452
12.1.2014, 23:20
Nije normalizacija, al' su baze, pa da ne pravim novu temu.
Imam dve tabele:
Drzava(Ime_drzave,ID_drzave)
Osoba(Ime_osobe,Ime_drzave,ID_drzave)

Kako da povezem tabele, tako da se, kada u tabelu osoba unesem ime drzave, automatski ispise ID_drzave?
Ako mi ne fali jos nesto naravno :D

Ja sam povezao ID_drzave iz jedne i druge tabele, ali se ne ispise, nego ja moram da unosim :confused:

Los ti je model.
Iz Osobe trebas da izbacis Ime_drzave jer je vise nego nepotrebno.
Potom kada osobi dodeljujes ID_drzave to ce ti izgledati nesto ovako
UPDATE Osoba
SET ID_drzave = (SELECT ID_drzave From Drzava where Ime_drzave = 'Srbija')

-- odprilike nesto ovako, nisam siguran da li je u accessu ova sintaksa ispravna.
-- i pojasni sta ti je potrebno.

Teva
13.1.2014, 2:40
Ne kapiram šta će mu trigeri ako već ima obezbeđen referencijalni integritet u svojim relacijama :confused:

Trigger za automatsko unošenje ida na osnovu imena il imena na osnovu ida :)