Mój projekt przedstawia bazę danych noclegów składającą się z 10 tabel. W projekcie wykorzystuje program LibreOffice Base do połączenia psql z graficznym interfejsem ( kilka formularzy przedstawiających zasadę działania bazy). Przy pomocy mojej bazy można znaleźć podstawowe informacje: nazwę, adres, informacje o właścicielu i o dostępie do rezerwacji, baza powyższa nie zakłada możliwości rezerwacji tylko informuje o tym czy dany pokój jest wolny czy też nie, w przypadku kiedy nie jest wolny można poznać dokładną datę zwolnienia. W dodatkowych tabelach można dowiedzieć się jaka jest odległość od środków komunikacji takich jak: lotnisko, pkp, pks dla uproszczenia podajemy wartość w metrach jeśli istnieje podany punkt w danym miejscu jeśli nie to żadna wartość się nie pojawia. W poniżej zamieszczonych kodach sql znajduje się cała baza oraz przykładowe dane oraz zastosowanie znajdujących się w bazie funkcji, wyzwalaczy i widoków. Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL, kod_wlasciciela INTEGER NOT NULL, nazwa TEXT NOT NULL, rodzaj TEXT NOT NULL
DROP TABLE info CASCADE; CREATE TABLE info( id_noclegu INTEGER NOT NULL, ile_gwiazdek INTEGER, preferencje TEXT DROP TABLE rezerwacje CASCADE; CREATE TABLE rezerwacje( id_noclegu INTEGER NOT NULL, kod_pokoju INTEGER NOT NULL, nr_pokoju INTEGER NOT NULL, ile_osobowy INTEGER NOT NULL, lazienka VARCHAR(3) NOT NULL DROP TABLE szcz_rezerwacje CASCADE; CREATE TABLE szcz_rezerwacje( kod_pokoju INTEGER NOT NULL, zajety VARCHAR(3), do_kiedy DATE DROP TABLE cennik_rezerwacji CASCADE; CREATE TABLE cennik_rezerwacji ( kod_pokoju INTEGER NOT NULL, cena REAL NOT NULL
DROP TABLE wlasciciel CASCADE; CREATE TABLE wlasciciel( kod_wlasciciela INTEGER NOT NULL, id_noclegu INTEGER NOT NULL, imie TEXT NOT NULL, nazwisko TEXT NOT NULL, PESEL VARCHAR(11) NOT NULL DROP TABLE posilki CASCADE; --TAK/NIE-- CREATE TABLE posilki( id_noclegu INTEGER NOT NULL, id_posilku INTEGER NOT NULL, rodzaj TEXT NOT NULL, dostepnosc VARCHAR(3) NOT NULL DROP TABLE lokalizacja CASCADE; --odległość-- CREATE TABLE lokalizacja( id_noclegu INTEGER NOT NULL, pkp VARCHAR(12), pks VARCHAR(12), lotnisko VARCHAR(12) DROP TABLE adresy CASCADE; CREATE TABLE adresy( id_noclegu INTEGER NOT NULL,
wojewodztwo TEXT NOT NULL, miejscowosc TEXT NOT NULL, ulica nr TEXT NOT NULL, VARCHAR(5) NOT NULL, kod_pocztowy VARCHAR(6) NOT NULL DROP TABLE telefony CASCADE; CREATE TABLE telefony( kod_wlasciciela INTEGER NOT NULL, numer INTEGER NOT NULL ALTER TABLE noclegi ADD PRIMARY KEY (id_noclegu ALTER TABLE info ADD PRIMARY KEY (id_noclegu ALTER TABLE rezerwacje ADD PRIMARY KEY (id_noclegu, kod_pokoju ALTER TABLE cennik_rezerwacji ADD PRIMARY KEY (kod_pokoju ALTER TABLE wlasciciel ADD PRIMARY KEY (kod_wlasciciela ALTER TABLE posilki ADD PRIMARY KEY (id_posilku ALTER TABLE lokalizacja ADD PRIMARY KEY(id_noclegu ALTER TABLE adresy ADD PRIMARY KEY (id_noclegu ALTER TABLE telefony ADD PRIMARY KEY (kod_wlasciciela
ALTER TABLE szcz_rezerwacje ADD PRIMARY KEY (kod_pokoju ALTER TABLE wlasciciel ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu) ON UPDATE CASCADE; ALTER TABLE info ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu) ON UPDATE CASCADE; ALTER TABLE rezerwacje ADD FOREIGN KEY (kod_pokoju) REFERENCES cennik_rezerwacji(kod_pokoju) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE rezerwacje ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE telefony ADD FOREIGN KEY (kod_wlasciciela) REFERENCES wlasciciel(kod_wlasciciela) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE lokalizacja ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE adresy ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE posilki ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu)
ON UPDATE CASCADE; ALTER TABLE rezerwacje ADD FOREIGN KEY (kod_pokoju) REFERENCES szcz_rezerwacje(kod_pokoju) ON UPDATE CASCADE; ALTER TABLE posilki ADD CHECK (dostepnosc IN ('TAK','NIE') ALTER TABLE rezerwacje ADD CHECK (lazienka IN ('TAK','NIE') ALTER TABLE cennik_rezerwacji ADD CHECK (cena>0 DROP FUNCTION czy_posilek(integer,varchar(10) CREATE OR REPLACE FUNCTION czy_posilek(a INTEGER,s VARCHAR(10)) RETURNS TEXT AS ' DECLARE w RECORD; BEGIN SELECT INTO w dostepnosc FROM posilki WHERE rodzaj=s AND id_noclegu=a; RETURN w; END; ' LANGUAGE 'plpgsql'; DROP FUNCTION sprawdz_dostepnosc( CREATE OR REPLACE FUNCTION sprawdz_dostepnosc() RETURNS TRIGGER AS ' BEGIN IF (NEW.dostepnosc IS NOT NULL) AND (NEW.dostepnosc NOT IN (''TAK'', ''NIE'')) THEN RAISE EXCEPTION ''Musi być TAK/NIE!''; END IF; RETURN NEW;
END; ' LANGUAGE 'plpgsql'; DROP TRIGGER sprawdz_dostepnosc_trigger ON posilki CASCADE; CREATE TRIGGER sprawdz_dostepnosc_trigger BEFORE INSERT OR UPDATE ON posilki FOR EACH ROW EXECUTE PROCEDURE sprawdz_dostepnosc( DROP FUNCTION wielka( CREATE OR REPLACE FUNCTION wielka() RETURNS TRIGGER AS ' BEGIN NEW.imie = initcap(new.imie NEW.nazwisko= initcap(new.nazwisko RETURN NEW; END; ' LANGUAGE 'plpgsql'; DROP TRIGGER wielka_trigger ON wlasciciel CASCADE; CREATE TRIGGER wielka_trigger BEFORE INSERT OR UPDATE ON wlasciciel FOR EACH ROW EXECUTE PROCEDURE wielka( DROP VIEW wlasciciele_hoteli CASCADE; CREATE VIEW wlasciciele_hoteli AS( SELECT noclegi.id_noclegu,wlasciciel.imie,wlasciciel.nazwisko,wlasciciel.pesel FROM noclegi,wlasciciel WHERE noclegi.id_noclegu=wlasciciel.id_noclegu AND rodzaj='hotel' DROP VIEW rezerwacje_info CASCADE; CREATE VIEW rezerwacje_info AS( SELECT noclegi.id_noclegu, noclegi.nazwa,noclegi.rodzaj,rezerwacje.nr_pokoju,rezerwacje.ile_osobowy,rezerwacje.lazienka,
cennik_rezerwacji.cena FROM noclegi,rezerwacje,cennik_rezerwacji WHERE noclegi.id_noclegu=rezerwacje.id_noclegu AND rezerwacje.kod_pokoju=cennik_rezerwacji.kod_pokoju ORDER BY noclegi.id_noclegu DROP FUNCTION dodaj_nocleg(kod_w INTEGER, nazw TEXT, rodz TEXT CREATE OR REPLACE FUNCTION dodaj_nocleg(kod_w INTEGER, nazw TEXT, rodz TEXT) RETURNS INTEGER AS ' BEGIN INSERT INTO noclegi(kod_wlasciciela, nazwa, rodzaj) VALUES(kod_w, nazw, rodz RETURN 0; END; ' LANGUAGE 'plpgsql'; INSERT INTO noclegi (kod_wlasciciela,nazwa,rodzaj) VALUES (1,'MAria', 'Hotel' INSERT INTO noclegi (kod_wlasciciela,nazwa,rodzaj) VALUES (2,'Jozef', 'Hotel' INSERT INTO noclegi (kod_wlasciciela,nazwa,rodzaj) VALUES (3,'Podroza', 'Pensjonat' INSERT INTO noclegi (kod_wlasciciela,nazwa,rodzaj) VALUES (4,'Mis', 'Schronisko' INSERT INTO wlasciciel (kod_wlasciciela,id_noclegu,imie,nazwisko,pesel) VALUES (1,1,'Michal','Lalik','91121110132' INSERT INTO wlasciciel (kod_wlasciciela,id_noclegu,imie,nazwisko,pesel) VALUES (2,2,'Roman','Kowalski','91121144556' INSERT INTO wlasciciel (kod_wlasciciela,id_noclegu,imie,nazwisko,pesel) VALUES (3,3,'Maria','Bonk','91121132112' INSERT INTO wlasciciel (kod_wlasciciela,id_noclegu,imie,nazwisko,pesel) VALUES (4,4,'Zygmunt','Korol','91121112233'
INSERT INTO info (id_noclegu,ile_gwiazdek,preferencje) VALUES (1, 3, 'Wygoda' INSERT INTO info (id_noclegu,ile_gwiazdek,preferencje) VALUES (2, 3, 'Cena' INSERT INTO info (id_noclegu,ile_gwiazdek,preferencje) VALUES (3, 3, 'WypoczynekGorski' INSERT INTO info (id_noclegu,ile_gwiazdek,preferencje) VALUES (4, 3, 'Wygoda' INSERT INTO szcz_rezerwacje (kod_pokoju,zajety,do_kiedy) VALUES (1,'TAK','2007-06-02' INSERT INTO szcz_rezerwacje (kod_pokoju,zajety,do_kiedy) VALUES (2,'TAK','2007-06-04' INSERT INTO szcz_rezerwacje (kod_pokoju,zajety,do_kiedy) VALUES (3,'TAK','2007-06-01' INSERT INTO szcz_rezerwacje (kod_pokoju,zajety,do_kiedy) VALUES (4,'NIE',NULL INSERT INTO cennik_rezerwacji (kod_pokoju,cena) VALUES (1,100 INSERT INTO cennik_rezerwacji (kod_pokoju,cena) VALUES (2,200 INSERT INTO cennik_rezerwacji (kod_pokoju,cena) VALUES (3,150 INSERT INTO cennik_rezerwacji (kod_pokoju,cena) VALUES (4,75.60 INSERT INTO rezerwacje (id_noclegu,nr_pokoju,kod_pokoju,ile_osobowy,lazienka) VALUES (1,12,1,4,'TAK' INSERT INTO rezerwacje (id_noclegu,nr_pokoju,kod_pokoju,ile_osobowy,lazienka) VALUES (2,10,2,3,'TAK' INSERT INTO rezerwacje (id_noclegu,nr_pokoju,kod_pokoju,ile_osobowy,lazienka) VALUES (3,11,3,2,'NIE' INSERT INTO rezerwacje (id_noclegu,nr_pokoju,kod_pokoju,ile_osobowy,lazienka) VALUES (4,13,4,5,'NIE' INSERT INTO posilki (id_noclegu,id_posilku,rodzaj,dostepnosc) VALUES (1,1,'sniadanie','TAK' INSERT INTO posilki (id_noclegu,id_posilku,rodzaj,dostepnosc) VALUES (1,2,'obiad','NIE' INSERT INTO posilki (id_noclegu,id_posilku,rodzaj,dostepnosc) VALUES (2,3,'kolacja','TAK' INSERT INTO posilki (id_noclegu,id_posilku,rodzaj,dostepnosc) VALUES (3,4,'sniadanie','NIE' INSERT INTO lokalizacja (id_noclegu,pkp,pks,lotnisko) VALUES (1,1000,3000,5000 INSERT INTO lokalizacja (id_noclegu,pkp,pks,lotnisko) VALUES (2,2000,NULL,3000 INSERT INTO lokalizacja (id_noclegu,pkp,pks,lotnisko) VALUES (3,NULL,NULL,NULL INSERT INTO lokalizacja (id_noclegu,pkp,pks,lotnisko) VALUES (4,1000,2000,NULL
INSERT INTO adresy (id_noclegu,wojewodztwo,miejscowosc,ulica,nr,kod_pocztowy) VALUES (1,'dolnoslaskie','Trata','gladka',32,'59-700' INSERT INTO adresy (id_noclegu,wojewodztwo,miejscowosc,ulica,nr,kod_pocztowy) VALUES (2,'slaskie','Boleslawiec','krzywa',43,'58-500' INSERT INTO adresy (id_noclegu,wojewodztwo,miejscowosc,ulica,nr,kod_pocztowy) VALUES (3,'pomorskie','Warszawa', 'prosta',45,'53-000' INSERT INTO adresy (id_noclegu,wojewodztwo,miejscowosc,ulica,nr,kod_pocztowy) VALUES (4,'lodzkie','Wroclaw','ladna',12,'12-500' INSERT INTO telefony (kod_wlasciciela,numer) VALUES (1,6440944 INSERT INTO telefony (kod_wlasciciela,numer) VALUES (2,1233213 INSERT INTO telefony (kod_wlasciciela,numer) VALUES (3,6132323 INSERT INTO telefony (kod_wlasciciela,numer) VALUES (4,6323223 Koniec kodu. Jak to działa: Narusza ograniczenie check, które wymusza cena>0 INSERT INTO cennik_rezerwacji (kod_pokoju,cena) VALUES (6,-10 Narusza check, który wymusza dostępność (TAK/NIE). INSERT INTO cennik_rezerwacji (kod_pokoju,cena) VALUES (6,10 INSERT INTO szcz_rezerwacje (kod_pokoju,zajety,do_kiedy) VALUES (6,'NIE',NULL INSERT INTO rezerwacje (id_noclegu,nr_pokoju,kod_pokoju,ile_osobowy,lazienka) VALUES (2,13,6,5,'Nas' Narusza check, który wymusza dostępność (TAK/NIE) oraz wyświetla komunikat ostrzegawczy(wyzwalacz). INSERT INTO posilki (id_noclegu,id_posilku,rodzaj,dostepnosc) VALUES (3,5,'sniadanie','NIW' Widok pokazujący właścicieli hoteli: SELECT * FROM wlasciciele_hoteli; Widok pokazujący zestawienie informacji o rezerwacjach: SELECT * FROM rezerwacje_info;
Funkcja zwracająca dostępność konkretnego posiłku w odpowiednim noclegu: SELECT czy_posilek(1,'sniadanie' SELECT czy_posilek(1,'obiad' Wyzwalacz zmieniający pierwsze litery imienia i nazwiska na wielkie. INSERT INTO wlasciciel(kod_wlasciciela,id_noclegu,imie,nazwisko,pesel) VALUES (12,4,'zygmunt','borek','91121112231' SELECT * FROM wlasciciel; Funkcja dodająca krotkę do tabeli noclegi: SELECT dodaj_nocleg(1,'dobry','hotel' SELECT * FROM noclegi; Poniżej przedstawiona kwerenda pokazuje dostępność posiłków w różnych noclegach.
Przykładowy widok napisany w psql, dostępny w Libreoffice. Zestawia dane dotyczące rezerwacji.
Poniżej mamy przykładowy formularz.