Monika Sychla 241858 Daniel Smolarek 241875 Projekt bazy danych
Naszym zadaniem było zaprojektowanie przykładowej bazy danych, w oparciu o zagadnienia jakie zostały wprowadzone w trakcie kursu z baz danych. Baza danych jaką zaprojektowaliśmy przedstawia działalność i funkcjonalność, miejsca z którego każdy z nas korzystał biblioteki. Poniższa baza danych składa się z dwunastu tabel. Jedna z tabel zawiera zestawienie wszystkich pracowników danej biblioteki. Każdy pracownik posiada swój unikalny identyfikator (id_pracownik), dzięki któremu możemy rozróżnić danego pracownika od innego np. gdyby w danej bibliotece pracowało dwóch Janów Kowalskich, dzięki id_pracownik jesteśmy w stanie ich zróżnicować. W tabeli pracownicy, znajdują się zestawienia osób, które pracują w danej filii bibliotecznej wraz z ich imieniem, nazwiskiem, adresem e-mail, nr pesel, stanowiskiem oraz wynagrodzeniem. Każda osoba z tabeli pracownicy jest przypisana do danej filii biblioteki w której pracuje (klucz obcy do tabeli filie). Filie są rozróżnialne między swoją po identyfikatorze (id_filia). W tabeli filia znajduje się identyfikator danej filii, miasto w którym jest filia, ulica przy której ma swoja siedzibę oraz kod pocztowy. Książki do filii dostarczane są przed dostawców których znajdziemy w tabeli dostawcy_książek. Każdy z dostawców ma swój unikalny id_dostawcy, posiada również imię, nazwisko, w tabeli tej znajdziemy również preferowany termin dostawy książki do danej fili oraz zrealizowany termin dostawy, widzimy, czy zamówienie jest jeszcze aktywne, w jakiej ilości, na jaką cenę oraz do jakiej filii ma być dostarczone. Nasz baza posiada także tabelę czytelnicy, każdy czytelnik jest przypisany do fili z której korzysta (klucz obcy z tabelą filia), czytelnik jest rozróżniany po id_czytelnik, który jest unikalny dla każdej osoby, czytelnik posiada swoją własną kartę, a także imię, nazwisko oraz numer pesel. Czytelnicy wypożyczając książki, o określonym id_egzemplarza mają wyznaczony termin zwrotu danego woluminu, który znajduje się w tabeli termin. Nasz baza danych posiada także tabelę książki w której znajdziemy tytuł, autora, wydawcę, rok wydania, nr isbn, tematykę, rodzaj, oraz odpowiedz na to czy dana książka nadaję się dla dzieci. Każda książka jest rozróżniana po unikalnym id_ksiązki. W tabeli książki znajdziemy id_autora, którego imię i nazwisko możemy znaleźć w tabeli autorzy właśnie po id_autora. Tabela książki łączy się z tabelą dostawcy_książek za pomocą tabeli łączącej: zamówienia, w której znajdziemy id_dostawcy, id_książki oraz zamawiana_ilosc, czyli liczbę książek jaka została zamówiona u danego dostawcy. Nasz baza danych odznacza się następującymi własnościami: Kod pocztowy musi być postaci xx-xxx data wypożyczenia ma postać yyyy-yy-yy id_filia nie może być NULLem Zamówienie ma domyślnie wartość aktywne id_egzemplarza nie może być NULLem Baza, którą zaprojektowaliśmy odznacza się następującą funkcjonalnością: Osoba, która posiada wysoką karę nie może wypożyczyć książek Ilość zamówionych książek musi być większa, równa od 0. Cena zamówienie musi być większa od 0 Wpisując tytuł książki zostanie nam wyświetlony jej rodzaj. Wpisując imię i nazwisko pracownika zostanie wyświetlone jego stanowisko. Można sprawdzić wysokość kary danej osoby
Poniżej zamieszczony został schemat bazy danych: Kod do bazy danych: DROP TABLE co_to_jest CASCADE; DROP TABLE kara_wypozyczenie CASCADE; DROP TABLE pozycja CASCADE; DROP TABLE autorzy CASCADE; DROP TABLE czytelnicy CASCADE; DROP TABLE dostawcy_ksiazek CASCADE; DROP TABLE ksiazki CASCADE; DROP TABLE termin CASCADE; DROP TABLE rodzaje CASCADE; DROP TABLE egzemplarze CASCADE; DROP TABLE filia CASCADE; DROP TABLE zamowinia CASCADE; CREATE FUNCTION co_to_jest(s character varying) RETURNS character varying LANGUAGE plpgsql AS $$ DECLARE w RECORD; BEGIN SELECT INTO w * FROM ksiazki WHERE tytul=s; RETURN w.rodzaje; END; $$;
CREATE FUNCTION kara_wyporzyczenie() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN IF (SELECT kara FROM czytelnicy WHERE id_czytelnik = new.id_czytelnika) >5 THEN RAISE EXCEPTION '% za wysoka kara zeby wyporzyczyc'; end if; return new; end; $$; CREATE FUNCTION pozycja(a character varying, b character varying) RETURNS character varying LANGUAGE plpgsql AS $$ DECLARE w RECORD; BEGIN SELECT INTO w * FROM pracownicy WHERE imie=a AND nazwisko=b; RETURN w.stanowisko; END $$; CREATE FUNCTION wynagrodzenia() RETURNS trigger LANGUAGE plpgsql AS $$ begin if new.wynagrodzenie>=old.wynagrodzenie then new.wynagrodzenie=old.wynagrodzenie; return new; end if; end; $$; CREATE TABLE autorzy ( id_autora integer NOT NULL, imie character varying(50), nazwisko character varying(50) NOT NULL CREATE TABLE czytelnicy ( id_czytelnik integer NOT NULL, imie character varying(50) NOT NULL, nazwisko character varying(50) NOT NULL, pesel_czytelnik character varying(50) NOT NULL, kara integer, id_filia integer NOT NULL CREATE TABLE dostawcy_ksiazek ( id_dostawcy integer NOT NULL, imie character varying(50) NOT NULL, nazwisko character varying(50) NOT NULL, zamawiana_ilosc integer, cena integer, zralizowany_termin_dostawy date, id_filia integer, czy_zamowienie_aktywne boolean DEFAULT true NOT NULL, preferowany_termin_dostawy date, CONSTRAINT dostawcy_ksiazek_cena_check CHECK ((cena > 0)) CREATE TABLE filia ( id_filia integer NOT NULL,
miasto character varying(50) DEFAULT 'Wroclaw'::character varying NOT NULL, ulica character varying(50) NOT NULL, kod character varying(6) NOT NULL CREATE VIEW dostawa_ksiazek AS SELECT dostawcy_ksiazek.id_dostawcy, dostawcy_ksiazek.preferowany_termin_dostawy, CASE WHEN dostawcy_ksiazek.czy_zamowienie_aktywne THEN 'aktywne'::text WHEN (NOT dostawcy_ksiazek.czy_zamowienie_aktywne) THEN 'zakonczone'::text ELSE 'brak danych'::text END AS status_dostawy, filia.id_filia, filia.ulica, filia.kod, filia.miasto FROM dostawcy_ksiazek, filia WHERE (dostawcy_ksiazek.id_filia = filia.id_filia CREATE TABLE egzemplarze ( id_egzemplarza integer NOT NULL, isbn character varying(50) NOT NULL CREATE TABLE ksiazki ( id_ksiazki integer NOT NULL, tytul character varying(50) NOT NULL, id_autora integer NOT NULL, wydawca character varying(50) NOT NULL, isbn character varying(50) NOT NULL, rok_wydania integer, rodzaje character varying(50) NOT NULL, tematyka character varying(50) NOT NULL, czy_dla_dzieci boolean DEFAULT true NOT NULL CREATE TABLE termin ( data_wypozyczenia date, data_oddanie date, id_egzemplarza integer CREATE VIEW ksiazki_info AS SELECT ksiazki.id_ksiazki, ksiazki.tytul, ksiazki.rodzaje, termin.data_wypozyczenia FROM (ksiazki JOIN termin ON ((ksiazki.id_ksiazki = termin.id_egzemplarza)) CREATE TABLE pracownicy ( id_pracownik integer NOT NULL, imie character varying(50) NOT NULL, nazwisko character varying(50) NOT NULL, stanowisko character varying(50) NOT NULL, pesel_pracownika character varying(10) NOT NULL, wynagrodzenie integer, email character varying(100),
id_filia integer CREATE TABLE rodzaje ( rodzaj character varying(50) NOT NULL CREATE TABLE tematy ( tematyka character varying(50) NOT NULL CREATE TABLE wyporzyczenia ( id_egzemplarza integer, id_czytelnika integer CREATE TABLE zamowienie ( id_dostawcy integer NOT NULL, id_ksiazki integer NOT NULL, zamawiana_ilosc integer NOT NULL, CONSTRAINT zamowienie_zamawiana_ilosc_check CHECK ((zamawiana_ilosc >= 0)) ALTER TABLE ONLY autorzy ALTER COLUMN id_autora SET DEFAULT nextval('autorzy_id_autora_seq'::regclass INSERT INTO autorzy VALUES (1, 'Adam', 'Mickiewicz' INSERT INTO autorzy VALUES (2, 'Bartlomiej', 'Ochlapski' INSERT INTO autorzy VALUES (4, 'Ludomir', 'Newelski' INSERT INTO autorzy VALUES (5, 'Boleslaw', 'Prus' INSERT INTO autorzy VALUES (6, 'Czeslaw', 'Milosz' INSERT INTO autorzy VALUES (7, 'Lech', 'Banachowski' INSERT INTO autorzy VALUES (8, 'Krzysztof', 'Stencel' INSERT INTO autorzy VALUES (9, 'Mary', 'Shelley' INSERT INTO autorzy VALUES (10, 'Dean', 'Koonitz' INSERT INTO autorzy VALUES (11, 'Sigmund', 'Freud' INSERT INTO autorzy VALUES (12, 'Hector', 'Garcia-Molina' INSERT INTO autorzy VALUES (13, 'Jeffrey D.', 'Ullman' INSERT INTO autorzy VALUES (14, 'Jennifer', 'Widom' INSERT INTO autorzy VALUES (3, 'Krystan1', 'Starobramski' INSERT INTO czytelnicy VALUES (5, 'Ernest', 'Alfons', '887', 0, 1 INSERT INTO czytelnicy VALUES (6, 'Adam', 'Nawalkiewicz', '886', 0, 3 INSERT INTO czytelnicy VALUES (7, 'Monika', 'Malomyslaca', '885', 0, 1 INSERT INTO czytelnicy VALUES (8, 'Daniel', 'Malolepszy', '884', 0, 2 INSERT INTO czytelnicy VALUES (9, 'Anastazja', 'Malolepsza', '883', 0, 4 INSERT INTO czytelnicy VALUES (1, 'Henryk', 'Czekalski', '990', 0, 2 INSERT INTO czytelnicy VALUES (3, 'Anna', 'Helena', '9921', 1, 2 INSERT INTO czytelnicy VALUES (2, 'Adam', 'Mackowski', '9911s', 12, 3 INSERT INTO dostawcy_ksiazek VALUES (2, 'Monika', 'Zielinska', 15, 3000, '2013-12-18', NULL, true, NULL INSERT INTO dostawcy_ksiazek VALUES (3, 'Monika', 'Zielinska', 30, 678, '2013-10-05', NULL, true, NULL INSERT INTO dostawcy_ksiazek VALUES (4, 'Monika', 'Zielinska', 100, 1239, '2013-05-06', NULL, true, NULL INSERT INTO dostawcy_ksiazek VALUES (1, 'Andrzej', 'Zapala', 23, 4601, '2013-11-30', 2, true, '2013-11-30' INSERT INTO egzemplarze VALUES (1, '8934-2763-68' INSERT INTO egzemplarze VALUES (2, '8934-2763-68' INSERT INTO filia VALUES (1, 'Wroclaw', 'Kazimierz', '50-077' INSERT INTO filia VALUES (2, 'Wroclaw', 'Kasprowicza', '52-067' INSERT INTO filia VALUES (4, 'Wroclaw', 'Kazikowicza', '52-067' INSERT INTO filia VALUES (3, 'Wroclaw', 'Nankierowicza', '58-098' INSERT INTO filia VALUES (1243567, 'Skierniewice', 'Jabłkowa', '12-345' INSERT INTO ksiazki VALUES (3, 'Kalina', 2, 'WSiP', '1234-4321-32', 1985, 'nowela', 'komedia', true
INSERT INTO ksiazki VALUES (5, 'TiK-TiK', 3, 'PWN', '1234-9876-54', 2001, 'czasopismo', 'polityka', true INSERT INTO ksiazki VALUES (7, 'Lalka', 5, 'PWN', '7865-2343-78', 1976, 'powiesc', 'spoleczno_psychologiczna', true INSERT INTO ksiazki VALUES (1, 'Pan_Tadeusz', 1, 'PWN', '8934-2763-67', 1998, 'powiesc', 'historyczna', true INSERT INTO ksiazki VALUES (123, 'awg', 2, 'asdf', '213', 123, 'powiesc', 'historyczna', true INSERT INTO ksiazki VALUES (2, 'Grazyna', 1, 'PWN', '8934-2763-68', 1991, 'powiesc', 'przygodowe', true INSERT INTO pracownicy VALUES (10, 'Adam', 'Adamowicz', 'dyrektor', '123', 8000, 'adamowicz@gmail.com', 1 INSERT INTO pracownicy VALUES (12, 'Michal', 'Michalojewicz', 'dyrektor', '789', 6000, 'michalek@onet.pl', 3 INSERT INTO pracownicy VALUES (13, 'Kazimierz', 'Adamkiewicz', 'kierownik', '321', 4000, 'kazik@gmail.com', 1 INSERT INTO pracownicy VALUES (16, 'Adam', 'Daniel', 'bibliotekarz', '111', 2000, 'daniel@gmail.com', 1 INSERT INTO pracownicy VALUES (17, 'Bartlomiej', 'Kazimierz', 'bibliotekarz', '888', 2100, 'bart@wp.pl', 2 INSERT INTO pracownicy VALUES (11, 'Bartlomiej', 'Bartlamowicz', 'dyrektor', '456', 8500, 'bb@wp.pl', 2 INSERT INTO pracownicy VALUES (14, 'Bartlomiej', 'Elastyczny', 'kierownik', '654', 4300, 'elastyk@wp.pl', 2 INSERT INTO pracownicy VALUES (15, 'Michal', 'Mikolaj', 'kierownik', '987', 3001, 'ja@onet.pl', 3 INSERT INTO rodzaje VALUES ('powiesc' INSERT INTO rodzaje VALUES ('nowela' INSERT INTO rodzaje VALUES ('czasopismo' INSERT INTO rodzaje VALUES ('popularno_naukowe' INSERT INTO rodzaje VALUES ('poradnik' INSERT INTO rodzaje VALUES ('powiesc' INSERT INTO rodzaje VALUES ('nowela' INSERT INTO rodzaje VALUES ('czasopismo' INSERT INTO rodzaje VALUES ('popularno_naukowe' INSERT INTO rodzaje VALUES ('poradnik' INSERT INTO zamowienie VALUES (1, 1, 15 INSERT INTO zamowienie VALUES (1, 3, 21 INSERT INTO zamowienie VALUES (1, 1, 15 INSERT INTO zamowienie VALUES (1, 3, 21 ALTER TABLE ONLY czytelnicy ADD CONSTRAINT czytelnicy_pesel_czytelnik_key UNIQUE (pesel_czytelnik ALTER TABLE ONLY czytelnicy ADD CONSTRAINT czytelnicy_pkey PRIMARY KEY (id_czytelnik ALTER TABLE ONLY dostawcy_ksiazek ADD CONSTRAINT dostawcy_ksiazek_pkey PRIMARY KEY (id_dostawcy ALTER TABLE ONLY egzemplarze ADD CONSTRAINT egzemplarze_pkey PRIMARY KEY (id_egzemplarza ALTER TABLE ONLY filia ADD CONSTRAINT filia_pkey PRIMARY KEY (id_filia ADD CONSTRAINT ksiazki_isbn_key UNIQUE (isbn
ADD CONSTRAINT ksiazki_pkey PRIMARY KEY (id_ksiazki ALTER TABLE ONLY pracownicy ADD CONSTRAINT pracownicy_pesel_pracownika_key UNIQUE (pesel_pracownika ALTER TABLE ONLY pracownicy ADD CONSTRAINT pracownicy_pkey PRIMARY KEY (id_pracownik ALTER TABLE ONLY rodzaje ADD CONSTRAINT rodzaje_pkey PRIMARY KEY (rodzaj ALTER TABLE ONLY tematy ADD CONSTRAINT tematy_pkey PRIMARY KEY (tematyka ALTER TABLE ONLY termin ADD CONSTRAINT termin_id_ksiazki_key UNIQUE (id_egzemplarza CREATE TRIGGER kara_wyporzyczenie BEFORE INSERT OR UPDATE ON wyporzyczenia FOR EACH ROW EXECUTE PROCEDURE kara_wyporzyczenie( CREATE TRIGGER wynagrodzenia AFTER UPDATE OF wynagrodzenie ON pracownicy FOR EACH ROW EXECUTE PROCEDURE wynagrodzenia( ALTER TABLE ONLY czytelnicy ADD CONSTRAINT czytelnicy_id_filia_fkey FOREIGN KEY (id_filia) REFERENCES filia(id_filia) ON UPDATE CASCADE; ALTER TABLE ONLY dostawcy_ksiazek ADD CONSTRAINT dostawcy_ksiazek_id_filia_fkey FOREIGN KEY (id_filia) REFERENCES filia(id_filia) ON UPDATE CASCADE; ALTER TABLE ONLY egzemplarze ADD CONSTRAINT egzemplarze_isbn_fkey FOREIGN KEY (isbn) REFERENCES ksiazki(isbn ADD CONSTRAINT ksiazki_id_autora_fkey FOREIGN KEY (id_autora) REFERENCES autorzy(id_autora) ON UPDATE CASCADE; ADD CONSTRAINT ksiazki_rodzaje_fkey FOREIGN KEY (rodzaje) REFERENCES rodzaje(rodzaj ADD CONSTRAINT ksiazki_tematyka_fkey FOREIGN KEY (tematyka) REFERENCES tematy(tematyka) ON UPDATE CASCADE; ADD CONSTRAINT ksiazki_tematyka_fkey FOREIGN KEY (tematyka) REFERENCES tematy(tematyka) ON UPDATE CASCADE; ADD CONSTRAINT ksiazki_tematyka_fkey FOREIGN KEY (tematyka) REFERENCES tematy(tematyka) ON UPDATE CASCADE; ADD CONSTRAINT ksiazki_tematyka_fkey FOREIGN KEY (tematyka) REFERENCES tematy(tematyka) ON UPDATE CASCADE; ALTER TABLE ONLY pracownicy ADD CONSTRAINT pracownicy_id_filia_fkey FOREIGN KEY (id_filia) REFERENCES filia(id_filia) ON UPDATE CASCADE; ALTER TABLE ONLY termin ADD CONSTRAINT termin_id_egzemplarza_fkey FOREIGN KEY (id_egzemplarza) REFERENCES egzemplarze(id_egzemplarza ALTER TABLE ONLY wyporzyczenia ADD CONSTRAINT wyporzyczenia_id_czytelnika_fkey FOREIGN KEY
(id_czytelnika) REFERENCES czytelnicy(id_czytelnik ALTER TABLE ONLY wyporzyczenia ADD CONSTRAINT wyporzyczenia_id_egzemplarza_fkey FOREIGN KEY (id_egzemplarza) REFERENCES egzemplarze(id_egzemplarza ALTER TABLE ONLY zamowienie ADD CONSTRAINT zamowienie_id_dostawcy_fkey FOREIGN KEY (id_dostawcy) REFERENCES dostawcy_ksiazek(id_dostawcy ALTER TABLE ONLY zamowienie ADD CONSTRAINT zamowienie_id_ksiazki_fkey FOREIGN KEY (id_ksiazki) REFERENCES ksiazki(id_ksiazki Sprawdzenie: więz check: INSERT INTO filia(id_filia, ulica, miasto, kod) VALUES ('5','wielka','brzeg','1111') funkcje: SELECT pozycja(jan) (kowalski) SELECT rodzaj (a) Przykład interfejsu graficznego w PHP: Spróbujmy dodać zamówienie na cenę 0:
Jak widać zamówenie nie zostało dodane: Wstawmy zamówienie na cenę 1: Teraz nam się udało Spróbujmy edytować zamówienie:
Zmieńmy ilość na ujemną: Nie uda się to, spróbujmy więc zmienić ilość jednak, niech będzie ona wartością dodatnią: Ta operacja zostanie zakończona powodzeniem