Prvo:
Napravio sam gresku kada sa umesto LEFT OUTER JOIN koristio INNER JOIN u pogledima. Dopuna datog skripta glasi:
Code:
DROP VIEW sve_o_radnicima;
DROP VIEW sve_o_penzionerima;
CREATE VIEW sve_o_radnicima
(
sifra_osobe,
ime_osobe,
vrsta_socijalnog_osiguranja,
podaci_o_radniku
)
AS
SELECT o.sifra_osobe, o.ime_osobe, o.vrsta_socijalnog_osiguranja,
r.podaci_o_radniku
FROM osobe AS o
LEFT OUTER JOIN
radnici AS r
ON o.sifra_osobe = r.sifra_osobe
WHERE o.vrsta_socijalnog_osiguranja = 'RAD';
CREATE VIEW sve_o_penzionerima
(
sifra_osobe,
ime_osobe,
vrsta_socijalnog_osiguranja,
podaci_o_penzioneru
)
AS
SELECT o.sifra_osobe, o.ime_osobe, o.vrsta_socijalnog_osiguranja,
p.podaci_o_penzioneru
FROM osobe AS o
LEFT OUTER JOIN
penzioneri AS p
ON o.sifra_osobe = p.sifra_osobe
WHERE o.vrsta_socijalnog_osiguranja = 'PEN';
Drugo:
Citat:
mahatma: kad unesem osobu i stavim recimo PEN kad shifru osiguranja,taj red se ne pojavi u tabeli penzioneri!!
Tacno je da se ne pojavljuje u tabeli penzioneri, a i sta bi to trebalo da se pojavi? Eventualno DEFAULT vrednosti, ako su zadate. Ovo se moze postici trigerima. Svakako savetujem da se pogledi naprave izmenljivim, te da se oni koriste za DML naredbe. Nazalost ne znam kako se ovo radi u MSSQL Server-u.
Trece:
Postoje i alternativni modeli, npr:
Code:
CREATE TABLE osobe_2
(
sifra_osobe CHAR(13) NOT NULL,
ime_osobe VARCHAR(15) NOT NULL,
vrsta_socijalnog_osiguranja CHAR(3), -- NULL znaci da je osoba
-- bez socijalnog osiguranja
podaci_o_radniku VARCHAR(100), -- specijalni podaci o radniku
podaci_o_penzioneru VARCHAR(100), -- specijalni podaci o penzioneru
CONSTRAINT pk_oso_2
PRIMARY KEY (sifra_osobe),
CONSTRAINT ch_oso_2
CHECK (vrsta_socijalnog_osiguranja IN
('RAD', -- radnicko
'PEN', -- penzionersko
'BOR' -- boracko
)
)
);
CREATE VIEW sve_o_radnicima_2
(
sifra_osobe,
ime_osobe,
vrsta_socijalnog_osiguranja,
podaci_o_radniku
)
AS
SELECT o.sifra_osobe, o.ime_osobe, o.vrsta_socijalnog_osiguranja,
o.podaci_o_radniku
FROM osobe_2 AS o
WHERE o.vrsta_socijalnog_osiguranja = 'RAD';
CREATE VIEW sve_o_penzionerima_2
(
sifra_osobe,
ime_osobe,
vrsta_socijalnog_osiguranja,
podaci_o_penzioneru
)
AS
SELECT o.sifra_osobe, o.ime_osobe, o.vrsta_socijalnog_osiguranja,
o.podaci_o_penzioneru
FROM osobe_2 AS o
WHERE o.vrsta_socijalnog_osiguranja = 'PEN';
U ovom modelu se svi podaci trpaju u jednu tabelu. Model je laksi za pocetnike, ali tezi (u smislu konvergira) da ima veliki broj kolona u jednoj tabeli. Takodje mnogo tih kolona moze da ima NULL vrednost. Dalje, podaci postaju nekoegzistenti, jer kako treba tumaciti:
Code:
INSERT INTO osobe_2
(sifra_osobe, ime_osobe, vrsta_socijalnog_osiguranja,
podaci_o_radniku, podaci_o_penzioneru)
VALUES ('1', 'Srdjan Mijatov', 'RAD',
NULL, 'Penzioner od 1997-me, mesecna penzija 15000 Din');
Radnik sam, a ujedno u podacima o penzionerima pise da sam penzioner?!?
Da bi se izbegli ovakvi konfuzni podaci moraju se praviti dodatni CHECK CONSTRAINT-i. Mada ja ovakav model nikada nebih koristio (zbog nekoegzistentnosti + gadljiv sam na NULL-ove), smatram da i ovde upotreba izmenljivih pogleda umnogome olaksava zivot.
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming." - Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo