P2: Логички и физички дизајн - Креирање база податоци (со SQL DDL)
Релациска шема
Легенда:
Болдирано = not null;
Подвлечено = primary key;
Црвена боја на букви = unique constraint;
Трансформација
Tip_dijabetes(id, ime)
Tip_insulin(id, ime)
Nacin_prigotvuvanje_hrana(id, ime)
Covek(id, embg, email, ime, prezime, pol, datum_na_ragjanje)
Doktor(id*
)
*
nadvoreshen kluc kon Covek(id)
Dijabeticar(id*
, data_na_otkrivanje, tip_dijabetes_id^
)
*
nadvoreshen kluc kon Covek(id)
^
nadvoreshen kluc kon Tip_dijabetes(id)
Datoteka_metapodatoci(id, ime, hash, opis, mime, tip_datoteka)
Faksimil(id*
, doktor_id^
, dijabeticar_id+
)
*
nadvoreshen kluc kon Datoteka_metapodatoci(id)
^
nadvoreshen kluc kon Doktor(id)
+
nadvoreshen kluc kon Dijabeticar(id)
Zdravstven_rezultat(id*
, dijabeticar_id^
)
*
nadvoreshen kluc kon Datoteka_metapodatoci(id)
^
nadvoreshen kluc kon Dijabeticar(id)
Medikament(id, ime, proizvoditel, tip_medikament)
Lenti_merenje_shekjer(id*
)
*
nadvoreshen kluc kon Medikament(id)
Insulin(id*
, tip_insulin_id^
)
*
nadvoreshen kluc kon Medikament(id)
^
nadvoreshen kluc kon Tip_insulin(id)
Inventar(dijabeticar_id*
, medikament_id^
, rok_na_traenje, kolicina)
*
nadvoresen kluc kon Dijabeticar(id)
^
nadvoresen kluc kon Medikament(id)
Zapis(dijabeticar_id*
, data)
*
nadvoresen kluc kon Dijabeticar(id)
Zapis_insulin((dijabeticar_id*
, data)*
)
*
nadvoresen kluc kon Dijabeticar(id, data)
Zapis_insulin_doziran_Insulin((dijabeticar_id, data)*
, insulin_id^
, kolicina)
*
nadvoresen kluc kon Dijabeticar(id, data)
^
nadvoresen kluc kon Insulin(id)
Zapis_so_izmeren_shekjer((dijabeticar_id, data)*
, vrednost)
*
nadvoresen kluc kon Dijabeticar(id, data)
Zapis_hrana((dijabeticar_id, data)*
)
*
nadvoresen kluc kon Dijabeticar(id, data)
Hrana(id, ime, proizvoditel, glikemiski_indeks, proteini, shekjeri, masti, jaglehidrati, kalorii, nacin_prigotvuvanje_hrana_id*
)
*
nadvoresen kluc kon Nacin_prigotvuvanje_hrana(id)
Obrok((dijabeticar_id, data)*
, hrana_id^
)
*
nadvoresen kluc kon Zapis_hrana(dijabeticar_id, data)
^
nadvoresen kkluc kon Hrana(id)
DDL скрипта за бришење на табелите и креирање на табелите
set search_path = project; DROP TABLE if exists obrok; DROP TABLE if exists hrana; DROP TABLE if exists zapis_hrana; DROP TABLE if exists zapis_so_izmeren_sekjer; DROP TABLE if exists zapis_insulin_doziran_insulin; DROP TABLE if exists zapis_insulin; DROP TABLE if exists zapis; DROP TABLE if exists inventar; DROP TABLE if exists insulin; DROP TABLE if exists lenti_merenje_shekjer; DROP TABLE if exists medikament; DROP TABLE if exists zdrastven_rezultat; DROP TABLE if exists faksimil; DROP TABLE if exists datoteka_metapodatoci; DROP TABLE if exists dijabeticar; DROP TABLE if exists doktor; DROP TABLE if exists covek; DROP TABLE if exists nacin_prigotvuvanje_hrana; DROP TABLE if exists tip_insulin; DROP TABLE if exists tip_dijabetes; -- отстранување на функции од шема drop function if exists fn_Proveri_data_na_otkrivanje_dijabeticar_pred_datum_na_ragjanje; drop function if exists fn_validiraj_medikament_disjoint; drop function if exists fn_Validiraj_datoteka_metapodatoci_disjoint; -- отстранување на шемата drop schema if exists project; -- креирање на шемата create schema project; -- се поставува патека односно шема во која ќе се извршуваат командите set search_path = project; -- tip_dijabetes definition -- Drop table CREATE TABLE tip_dijabetes ( id serial4 NOT NULL, ime varchar(256) NOT NULL, CONSTRAINT "PK_tip_dijabetes_id" PRIMARY KEY (id), CONSTRAINT "UNQ_Tip_dijabetes_ime" UNIQUE (ime) ); -- tip_insulin definition -- Drop table CREATE TABLE tip_insulin ( id serial4 NOT NULL, ime varchar(256) NOT NULL, CONSTRAINT "PK_Tip_insulin_id" PRIMARY KEY (id), CONSTRAINT "UNQ_Tip_insulin_ime" UNIQUE (ime) ); -- nacin_prigotvuvanje_hrana definition -- Drop table CREATE TABLE nacin_prigotvuvanje_hrana ( id serial4 NOT NULL, ime varchar(256) NOT NULL, CONSTRAINT "PK_Nacin_prigotvuvanje_hrana_id" PRIMARY KEY (id), CONSTRAINT "UNQ_Nacin_prigotvuvanje_hrana_ime" UNIQUE (ime) ); -- Drop table CREATE TABLE covek ( id serial4 NOT NULL, embg char(13) NOT NULL, email varchar(128) not null, ime varchar(256) NOT NULL, prezime varchar(256) NOT NULL, pol bpchar(1) NOT NULL, datum_na_ragjanje date NOT NULL, CONSTRAINT "PK_covek_id" PRIMARY KEY (id), CONSTRAINT "UNQ_covek_embg" unique(embg), constraint "UNQ_covek_email" unique(email), CONSTRAINT "CHK_covek_pol" CHECK ((pol = ANY (ARRAY['M'::bpchar, 'Z'::bpchar]))) ); -- doktor definition -- Drop table CREATE TABLE doktor ( id int4 NOT NULL, CONSTRAINT "PK_doktor_id" PRIMARY KEY (id), CONSTRAINT "FK_doktor_id" FOREIGN KEY (id) REFERENCES covek(id) ); -- dijabeticar definition -- Drop table CREATE TABLE dijabeticar ( id int4 NOT NULL, data_na_otkrivanje date NOT NULL, tip_dijabetes_id int4 NOT NULL, CONSTRAINT "PK_dijabeticar_id" PRIMARY KEY (id), CONSTRAINT "FK_dijabeticar_id" FOREIGN KEY (id) REFERENCES covek(id), CONSTRAINT "FK_dijabeticar_tip_dijabetes_id" FOREIGN KEY (tip_dijabetes_id) REFERENCES tip_dijabetes(id) ); -- datoteka_metapodatoci definition -- Drop table CREATE TABLE datoteka_metapodatoci ( id serial4 NOT NULL, ime varchar(400) NOT NULL, hash varchar(400) NOT NULL, opis varchar(1000) NOT null default '', mime varchar(300) NOT NULL, tip_datoteka bpchar(1) NOT NULL, CONSTRAINT "PK_datoteka_metapodatoci_id" PRIMARY KEY (id), CONSTRAINT "UNQ_datoteka_metapodatoci_hash" UNIQUE (hash), CONSTRAINT "CHK_datoteka_metapodatoci_tip_datoteka" CHECK ((tip_datoteka = ANY (ARRAY['F'::bpchar, 'Z'::bpchar]))) ); -- faksimil definition -- Drop table CREATE TABLE faksimil ( id int4 NOT NULL, doktor_id int4 NOT NULL, dijabeticar_id int4 NOT NULL, CONSTRAINT "PK_faksimil_id" PRIMARY KEY (id), CONSTRAINT "FK_dijabeticar_id" FOREIGN KEY (dijabeticar_id) REFERENCES dijabeticar(id), CONSTRAINT "FK_doktor_id" FOREIGN KEY (doktor_id) REFERENCES doktor(id), CONSTRAINT "FK_faksimil_id" FOREIGN KEY (id) REFERENCES datoteka_metapodatoci(id) ); -- zdrastven_rezultal definition -- Drop table CREATE TABLE zdrastven_rezultat ( id int4 NOT NULL, dijabeticar_id int4 NOT NULL, CONSTRAINT "PK_zdrastven_rezultat_id" PRIMARY KEY (id), CONSTRAINT "FK_zdrastven_rezultat_dijabeticar_id" FOREIGN KEY (dijabeticar_id) REFERENCES dijabeticar(id), CONSTRAINT "FK_zdrastven_rezultat_id" FOREIGN KEY (id) REFERENCES datoteka_metapodatoci(id) ); -- medikament definition -- Drop table CREATE TABLE medikament ( id serial4 NOT NULL, ime varchar(256) NOT NULL, proizvoditel varchar(256) NOT NULL, tip_medikament bpchar(1) NOT NULL, CONSTRAINT "CHK_Medikament_tip_medikament" CHECK ((tip_medikament = ANY (ARRAY['L'::bpchar, 'I'::bpchar]))), CONSTRAINT "PK_Medikament_id" PRIMARY KEY (id), constraint "UNQ_medikament_ime" unique(ime) ); -- lenti_merenje_shekjer definition -- Drop table CREATE TABLE lenti_merenje_shekjer ( id int4 NOT NULL, CONSTRAINT "PK_Lenti_merenje_shekjer_id" PRIMARY KEY (id), CONSTRAINT "FK_Lenti_merenje_shekjer_id_Medikament_id" FOREIGN KEY (id) REFERENCES medikament(id) ); -- insulin definition -- Drop table CREATE TABLE insulin ( id int4 NOT NULL, tip_insulin_id int4 NULL, CONSTRAINT "PK_Insulin_id" PRIMARY KEY (id), CONSTRAINT "FK_Insulin_id_Medikament_id" FOREIGN KEY (id) REFERENCES medikament(id), CONSTRAINT "FK_Insulin_tip_insulin_id_Tip_insulin_id" FOREIGN KEY (tip_insulin_id) REFERENCES tip_insulin(id) ); -- inventar definition -- Drop table CREATE TABLE inventar ( dijabeticar_id int4 NOT NULL, medikament_id int4 NOT NULL, rok_na_traenje date NOT NULL, kolicina int4 NOT null check(kolicina > 0), CONSTRAINT "PK_inventar_id" PRIMARY KEY (dijabeticar_id, medikament_id, rok_na_traenje), CONSTRAINT "FK_dijabeticar_id" FOREIGN KEY (dijabeticar_id) REFERENCES dijabeticar(id), CONSTRAINT "FK_medikament_id" FOREIGN KEY (medikament_id) REFERENCES medikament(id) ); -- zapis definition -- Drop table CREATE TABLE zapis ( dijabeticar_id int4 NOT NULL, "data" date NOT NULL, CONSTRAINT "PK_zapis_id" PRIMARY KEY (dijabeticar_id, data), CONSTRAINT "FK_zapis_id" FOREIGN KEY (dijabeticar_id) REFERENCES dijabeticar(id) ); -- zapis_insulin definition -- Drop table CREATE TABLE zapis_insulin ( dijabeticar_id int4 NOT NULL, "data" date NOT NULL, CONSTRAINT "PK_zapis_insulin_id" PRIMARY KEY (dijabeticar_id, data), CONSTRAINT "FK_zapis_insulin_id" FOREIGN KEY (dijabeticar_id,"data") REFERENCES zapis(dijabeticar_id,"data") ); -- zapis_insulin_doziran_insulin definition -- Drop table CREATE TABLE zapis_insulin_doziran_insulin ( dijabeticar_id int4 NOT NULL, "data" date NOT NULL, insulin_id int4 NOT NULL, kolicina int4 NOT null check(kolicina > 0), CONSTRAINT "PK_zapis_insulin_doziran_insulin" PRIMARY KEY (dijabeticar_id, data, insulin_id), CONSTRAINT "FK_zapis_insulin_doziran_insulin" FOREIGN KEY (dijabeticar_id,"data") REFERENCES zapis_insulin(dijabeticar_id,"data"), CONSTRAINT "FK_zapis_insulin_doziran_insulin_id" FOREIGN KEY (insulin_id) REFERENCES insulin(id) ); -- zapis_so_izmeren_sekjer definition -- Drop table CREATE TABLE zapis_so_izmeren_sekjer ( dijabeticar_id int not null, data date not null, vrednost decimal(4,1) not null check(vrednost > 0), constraint "PK_zapis_so_izmeren_sekjer_id" primary key(dijabeticar_id, data), constraint "FK_zapis_so_izmeren_sekjer_id" foreign key(dijabeticar_id, data) references zapis(dijabeticar_id, data) ); -- zapis_hrana definition -- Drop table CREATE TABLE zapis_hrana ( dijabeticar_id int not null, data date not null, constraint "PK_zapis_hrana_id" primary key(dijabeticar_id, data), constraint "FK_zapis_hrana_id" foreign key(dijabeticar_id, data) references zapis(dijabeticar_id, data) ); -- hrana definition -- Drop table CREATE TABLE hrana ( id serial not null, ime varchar(500) not null, proizvoditel varchar(1000) not null default '', glikemiski_indeks int not null check (glikemiski_indeks>=0 and glikemiski_indeks<=100), proteini decimal(3,1) not null check (proteini>=0 and proteini<=100), shekjeri decimal(3,1) not null check (shekjeri>=0 and shekjeri<=100), masti decimal(3,1) not null check (masti>=0 and masti<=100), jaglehidrati decimal(3,1) not null check (jaglehidrati>=0 and jaglehidrati<=100), kalorii int not null check (kalorii>=0), nacin_prigotvuvanje_hrana_id int not null, constraint "PK_hrana_id" primary key(id), constraint "FK_hrana_nacin_prigotvuvanje_hrana_id" foreign key(nacin_prigotvuvanje_hrana_id) references nacin_prigotvuvanje_hrana(id), constraint "CHK_hrana_shekejeri" check (shekjeri <= jaglehidrati), CONSTRAINT "CHK_hrana_proteini_jaglehidrati_masti" check(proteini+jaglehidrati+masti > 0 AND proteini+jaglehidrati+masti <= 100) ); -- obrok definition -- Drop table CREATE TABLE obrok ( dijabeticar_id int not null, data date not null, hrana_id int not null, kolicina int not null check (kolicina>0), constraint "PK_obrok_id" primary key(dijabeticar_id, data, hrana_id), constraint "FK_obrok_dijabeticar" foreign key(dijabeticar_id, data) references zapis_hrana(dijabeticar_id, data), constraint "FK_obrok_hrana_id" foreign key(hrana_id) references hrana(id) ); -- DISJOINT CHECK CONSTRAINT ZA DATOTEKA_METAPODATOCI create function fn_validiraj_medikament_disjoint( p_id int, p_tip_medikament char ) returns boolean language sql returns null on null input as $$ select coalesce ((select 1 from medikament m where m.id = p_id and tip_medikament = p_tip_medikament), 0) = 1; $$; alter table lenti_merenje_shekjer add constraint "CHK_Validiraj_kreiran_prethoden_zapis_vo_medikament_lenti_merenje_shekjer" check (fn_validiraj_medikament_disjoint(lenti_merenje_shekjer.id, 'L')); alter table insulin add constraint "CHK_Validiraj_kreiran_prethoden_zapis_vo_medikament_insulin" check (fn_validiraj_medikament_disjoint(insulin.id, 'I')); -- DISJOINT CHECK CONSTRAINT ZA DATOTEKA_METAPODATOCI create function fn_Validiraj_datoteka_metapodatoci_disjoint( p_faksimil_id int , p_tip_datoteka char ) returns int as $$ select coalesce ( (select 1 from datoteka_metapodatoci where id = p_faksimil_id and tip_datoteka = p_tip_datoteka ), 0 ) $$ language sql RETURNS NULL ON NULL INPUT; alter table faksimil add constraint "CHK_Validiraj_kreiran_prethoden_zapis_vo_datoteka_metapodatoci_faksimil" check(fn_Validiraj_datoteka_metapodatoci_disjoint(id, 'F')=1); alter table zdrastven_rezultat add constraint "CHK_Validiraj_kreiran_prethoden_zapis_vo_datoteka_metapodatoci_za_zdravstven_rezultat" check(fn_Validiraj_datoteka_metapodatoci_disjoint(id, 'Z')=1); -- DATUM NA OTKRIVANJE DIJABETES ZA DIJABETICAR E PRED DATUM NA RAGJANJE NA TOJ COVEK CREATE function fn_Proveri_data_na_otkrivanje_dijabeticar_pred_datum_na_ragjanje( p_dijabeticar_id int, p_data_na_otkrivanje date ) RETURNS boolean AS $$ SELECT c.datum_na_ragjanje <= p_data_na_otkrivanje FROM covek c WHERE c.id = p_dijabeticar_id; $$ LANGUAGE SQL RETURNS NULL ON NULL INPUT; alter table dijabeticar add constraint "CHK_Proveri_data_na_otkrivanje_dijabeticar_pred_datum_na_ragjanje" check (fn_Proveri_data_na_otkrivanje_dijabeticar_pred_datum_na_ragjanje(dijabeticar.id, dijabeticar.data_na_otkrivanje));
DML скрипта за полнење на табелите со податоци
set search_path = project; insert into tip_dijabetes(ime) values ('tip 1') , ('tip 2'); insert into tip_insulin(ime) values ('RAPID') , ('BASAL'); insert into nacin_prigotvuvanje_hrana (ime) values ('svezho') , ('zamrznato') , ('pecheno') , ('vareno') , ('dinstano') , ('przheno') , ('konzenvirano'); insert into covek(embg, email, ime, prezime, pol, datum_na_ragjanje) values ('0101994000000', 'kristijan.ristovski@students.finki.ukim.mk', 'Kristijan', 'Ristovski', 'M', '1994-01-01') , ('0911996123456', 'nikola.torbovski@students.finki.ukim.mk', 'Nikola', 'Torbovski', 'M', '1996-11-09') , ('1809004111111', 'marija.trajkovska@students.finki.ukim.mk', 'Marija', 'Trajkovska', 'Z', '2004-04-18') , ('110200299999', 'luka.markovski@students.finki.ukim.mk', 'Luka', 'Markovski', 'M', '2002-02-11') , ('0606999546872', 'marionka.japonka@students.finki.ukim.mk', 'Marionka', 'Japonka', 'Z', '1999-06-06') , ('1708021333333', 'nina.jadrovska@students.finki.ukim.mk', 'Nina', 'Jadrovska', 'Z', '2021-08-17'); insert into dijabeticar (id, data_na_otkrivanje, tip_dijabetes_id) values (2, '1996-11-09', 1) , (3, '2010-01-15', 2) , (6, '2022-09-01', 1); insert into doktor (id) values(1) , (4) , (5); insert into datoteka_metapodatoci (ime, hash, opis, mime, tip_datoteka) values ('zdravstven_rezultat_01_02_2023.pdf', '30e9b774c4691c38f0e3251545d1e238', '', 'application/pdf', 'Z') , ('faksimil_09_08_2021.pdf', 'f75be9d5c7ee578aeec5fef7005f78a3', '', 'application/pdf', 'F') , ('faksimil_19_09_2020.pdf', 'a96ef978bcd93a0813000886b09d99b5', 'Faksimil izdaden na 19-09-2020', 'application/pdf', 'F') , ('zdravstven_rezultat_08_07_2022.pdf', '86e014467d5d5a21645bc17fb4bf328a', 'Opis za zdravstven rezultat...', 'application/pdf', 'Z') , ('faksimil_07_12_2005.pdf', '0ef75e84f52a9793326dbf3f36fec367', '', 'application/pdf', 'F') , ('zdravstven_rez_07_01_2001.pdf', '3e7a11c3f47cf8cc55fcf5e7f5bce614', ':)', 'application/pdf', 'Z'); insert into zdrastven_rezultat (id, dijabeticar_id) values (1, 2) , (4, 3) , (6, 6); insert into faksimil (id, doktor_id, dijabeticar_id) values (2, 4, 2) , (3, 4, 2) , (5, 5, 6); insert into medikament (ime, proizvoditel, tip_medikament) values ('Lantus', 'Sanofi Aventis', 'I') , ('Apidra', 'Sanofi Aventis', 'I') , ('Novo Rapid', 'Novo Nordisk', 'I') , ('Tyson Bio AC200', 'Tyson Bioresearch', 'L') , ('Accu-Chek Active', 'Roche Diabetes Care', 'L') , ('OneTouch Ultra', 'Lifescan Medical Devices', 'L'); insert into lenti_merenje_shekjer (id) values (4) , (5) , (6); insert into insulin (id, tip_insulin_id) values (1, 2) , (2, 1) , (3, 1); insert into inventar (dijabeticar_id, medikament_id, rok_na_traenje, kolicina) values (2, 1, '2023-05-18', 5) , (2, 1, '2025-09-17', 4) , (2, 3, '2022-10-18', 1) , (3, 5, '2024-12-12', 7) , (6, 6, '2023-01-19', 13) , (6, 6, '2023-05-06', 3); insert into hrana (ime, proizvoditel, glikemiski_indeks, proteini, jaglehidrati, shekjeri, masti, kalorii, nacin_prigotvuvanje_hrana_id) values ('leb na zar', 'stara furna', 20, 8, 60, 1.3, 1, 300, 3) , ('leb', 'furna dime', 20, 9, 40, 1, 2, 312, 3) , ('oriz', 'kamko', 13, 10, 55, 7, 8, 201, 4) , ('makaroni', 'divela', 7, 11, 51, 8, 3, 135, 3) , ('tuna', 'blue sea', 1, 22, 13, 2, 18, 400, 7) , ('kulen', 'zlatibor', 9, 21, 15, 3, 31, 350, 1); -- 2 3 6 -- '1996-11-09' '2010-01-15' '2022-09-01' insert into zapis (dijabeticar_id, "data") values (2, '1999-02-08') , (2, '2000-01-01') , (2, '2001-08-09') , (3, '2010-05-09') , (3, '2010-09-09') , (3, '2012-10-10') , (6, '2022-10-01') , (6, '2022-11-10') , (6, '2022-12-30'); insert into zapis_so_izmeren_sekjer (dijabeticar_id, "data", vrednost) values (2, '1999-02-08', 11.5) ,(2, '2000-01-01', 9.8) , (2, '2001-08-09', 3.1) , (3, '2010-09-09', 8.1) , (3, '2012-10-10', 2.3) , (6, '2022-11-10', 7.9); insert into zapis_insulin (dijabeticar_id, "data") values (2, '1999-02-08') , (2, '2000-01-01') , (2, '2001-08-09') , (3, '2010-09-09') , (6, '2022-10-01') , (6, '2022-12-30'); insert into zapis_insulin_doziran_insulin (dijabeticar_id, "data", insulin_id, kolicina) values (2, '1999-02-08', 1, 15) , (2, '2000-01-01', 1, 7) , (2, '2001-08-09', 2, 1) , (3, '2010-09-09', 3, 10) , (6, '2022-10-01', 2, 9) , (6, '2022-12-30', 2, 6); insert into zapis_hrana (dijabeticar_id, "data") values (2, '1999-02-08') , (2, '2001-08-09') , (3, '2010-09-09') , (6, '2022-10-01') , (6, '2022-12-30'); insert into obrok (dijabeticar_id, "data", hrana_id, kolicina) values (2, '1999-02-08', 1, 100) , (2, '1999-02-08', 6, 20) , (2, '1999-02-08', 2, 16) , (2, '2001-08-09', 2, 35) , (3, '2010-09-09', 4, 125) , (3, '2010-09-09', 5, 111) , (6, '2022-10-01', 1, 37) , (6, '2022-10-01', 5, 86) , (6, '2022-12-30', 5, 97) , (6, '2022-12-30', 1, 172);
Релациски дијаграм изваден од DBeaver
Attachments (8)
- schema.png (103.3 KB ) - added by 11 months ago.
- polnenje.sql (4.5 KB ) - added by 11 months ago.
- Relaciska_shema_v1.docx (14.2 KB ) - added by 11 months ago.
- kreiranje.sql (11.4 KB ) - added by 11 months ago.
- polnenje_v2.sql (4.8 KB ) - added by 9 months ago.
- kreiranje_v2.sql (11.5 KB ) - added by 9 months ago.
- schema_v2.png (57.1 KB ) - added by 9 months ago.
- schema_v2.2.png (57.9 KB ) - added by 9 months ago.
Download all attachments as: .zip