Šta je novo?

Normalizacija DB-a

Učlanjen(a)
04.12.2005
Poruke
314
Poena
319
Treba mi pomoc da razumem BCNF normalizaciju. Najbolje je na primeru:

recimo da imam tabelu:

CREATE TABLE EMPLOYEE
(
emp_id INT NOT NULL PRIMARY KEY,
emp_name VARCHAR (35) NOT NULL,
emp_address VARCHAR (40) NOT NULL,
emp_phone VARCHAR (20) NOT NULL,
ssn INT NOT NULL,
salary NUMERIC (7,2),
job_title VARCHAR (25),


CHECK (job_title in ('sales', 'design', 'support', 'management'))
);

Kako da znam da li ova tabela zadovoljava BCNF? pogledao sam dosta tutorijala i generalno imam problem sa functional dependency.. Jel moze neko da mi pomogne sa tim..hvala
 
Da bi odredio da li je neka tabela BCNF nomralizovana, moraš da znaš funkcionalne zavisnosti polja tabele. To ne možeš nikako da odrediš samo na osnovu ovakve definicije tabele. To mora da bude dato posebno.

Ali ovako na osnovu imena polja mogu da predpostavim da postoji sledeća zavisnost.

emp_id -> emp_name, emp_address, emp_phone, job_title, salary, ssn

Ovo znači da polja sa desne strane strelice funkcionalno zavise od jednog (ili kombinacije više) polja sa leve strane. Šta to znači, to znači recimo da ne može da postoji više različitih vrednosti emp_name nego u tabeli nego što ima emp_id, i tako za svako polje na desnoj strani.

Pošto nemam pojma šta je polje ssn i da li plata zavisi isključivo od naziva posla (job_title) ili može biti različita za svakog radnika, ne mogu da odredim u kakvim su odnosima ta polja. Ali ako plata zavisi od naziva posla, odnosno ako postoji funkcionalana zavisnost:

job_title -> salary

to znači da ova tabela NIJE BCNF normalizovana, jer postoje redundantnost, salary polje je višak, može da se izmesti u posebnu tabelu (ili da se doda nekoj postojećoj drugoj tabeli tako da ne naruši BCNF normalnost)
 
Dodatak:

Onda bi recimo job_title postao spoljni ključ ka toj drugoj tabeli. Naravno ako ssn, job_title i salary nemaju nikakve veze jedno s drugim, onda je ova tabela BCNF normalizovana. Da kažem i tačnu definiciju: tabela je BCNF normalizovana ako su sva polja od kojih su neka druga polja funkcionalno zavisna ujedno i kandidati za ključ. A kandidat za ključ je jedno polje ili skup od više polja od kojeg funkcionalno zavise sva ostala polja tabele. U primeru verovatno imamo jedan kandidat za ključ, a to je emp_id, jer od njega zavise sva ostala polja, i recimo da nema drugih polja ili skupova polja od kojih sva ostala polja zavise, pa je ovo i jedini kandidat za ključ. Tako da će tabela biti normalizovana kada se sva polja koja potpuno funkcionalno zavise od nekog polja koje nije kandidat za ključ, izmeste u neku drugu tabelu, a to polje od koga zavise postane spoljni ključ.

Tako nekako.
 
SSN je verovatno social security number, odnosno u našoj terminologiji JMBG.
 
Hvala Ivane.

Ja sam prema nekoj svojoj intuiciji odredio da funkcionalna zavistonst (FD) bude ova:

emp_id -> all attributes

job_title -> salary

ssn -> emp_id, emp_name, emp_address

SSN jeste Social Security Number i on je unique za svakog radnika. Tako da je on kandidat kljuc ali problem jeste sa job_title. To cu resiti tako sto cu napraviti novu tablu koja ce sadrzati samo dva polja i resiti ovu tabelu.

Koliko sam razumeo, FD kreira db design-er na osnovu znanja o kompaniji i njihovim potrebama, jel tako ?

Druga stvar je da li moram tabelu prvo da testiram za 1nf, 2nf i 3 nf pa tek onda da radim ovaj FD process uvodjenja u BCNF ili je ovom procesom automatski tabela u BCNF-u?

HVALA
 
Ovako nekako:


CREATE TABLE EMPLOYEE
(
emp_id INT NOT NULL PRIMARY KEY,
emp_name VARCHAR (35) NOT NULL,
emp_address VARCHAR (40) NOT NULL,
emp_phone VARCHAR (20) NOT NULL UNIQUE,
ssn INT NOT NULL,
salary NUMERIC (7,2),
job_title VARCHAR (25),


CHECK (job_title in ('sales', 'design', 'support', 'management'))

);
CREATE TABLE JOB_INFO
(

job_title VARCHAR (25) PRIMARY KEY,
salary VARCHAR (40) NOT NULL,

FOREIGN KEY (job_title) REFERENCES EMPLOYEE(job_title)
);
 
Nisi to nešto lepo napravio. 🙂 Treba izbaciti salary iz tabele Employee. Tabela Employee treba da ima strani ključ ka tabeli Job_Info, a ne obrnuto, jer veza radnik-radno_mesto ima kardinalnost (1,1)-(0,M) (ili skraćeno 1-M, odnosno jedan radnik ima dodeljeno jedno radno mesto, dok na jednoj poziciji može da ima više radnika), osim ako se u firmi dozvoljava da jedan radnik ima više zvanja (više radnih mesta). U tom slučaju je kardinalnost radnik-radno_mesto (1,M)-(0,M) skraćeno M-M. Tada je potrebna treća tabela koja će imati polja emp_id, job_id gde će primarni ključ biti (emp_id, job_id) jedistvena kombinacija ova dva polja, i naravno oba polja su spoljni ključevi ka tabelama employee, odnosno job_info.

job_title sam zameni sa job_id jer nije baš efikasno za svakog radnika držati tekstualni naziv radnog mesta, traći se memorija, bilje da svako radno mesto ima numerički id, a da tabela job_info ima polja, job_id, job_title, salary.
 
Nazad
Vrh Dno