Muzyczna Baza Danych
Total Page:16
File Type:pdf, Size:1020Kb
Krzysztof Kozłowski,258472 Robert Kumanek, 258588 Muzyczna Baza Danych Nasza baza danych jest próbą usystematyzowanego zarchiwizowania branży muzycznej. Muzyczna Baza Danych( dalej jako MBD) ma wiele różnych zastosowań. Dzięki niej, użytkownik może dowiedzieć się kiedy jego ulubiony zespół zagra koncert i ile będzie kosztował bilet wstępu. Z łatwością będzie również mógł sprawdzić aktualną top listę albumów jak i szybko sprawdzić całą dyskografię zespołu. MBD składa się z 10 relacji: • album – Pierwsza główna tabela, relacja zawierająca informacje o albumie • piosenki – relacja zawierająca informacje o wnętrzu albumu • wytwornia – relacja o wytwórniach, które wydały nasze albumy • recenzja – zbiór recenzji o albumach • zespol – Druga główna tabela, relacja zawierająca informacje o nazwie zespołu i jego założeniu • koncert - relacja stworzona z myślą o fanach, przechowująca informacje o wydarzeniach muzycznych • czlonek – relacja zawierająca informacje o „wnętrzu” zespołu • instrument – relacja o tym kim są dani członkowie w zespole • ranking – widok wyświetlający top listę albumów • ranking_zespolow – widok wyświetlający top listę zespołów Kod źródłowy DROP TABLE album CASCADE; DROP TABLE czlonek CASCADE; DROP TABLE zespol CASCADE; DROP TABLE instrument CASCADE; DROP TABLE piosenki CASCADE; DROP TABLE wytwornia CASCADE; DROP TABLE koncert CASCADE; DROP TABLE instrument CASCADE; DROP TABLE recenzja CASCADE; CREATE TABLE album( tytul_albumu TEXT PRIMARY KEY, rok_wydania INTEGER , wytwornia TEXT NOT NULL, nazwa_zespolu TEXT NOT NULL, recenzja BOOLEAN DEFAULT FALSE ); CREATE TABLE recenzja( tresc TEXT PRIMARY KEY, imie_autora TEXT NOT NULL, nazwisko_autora TEXT NOT NULL, ocena_autora INTEGER, tytul_albumu TEXT ); ALTER TABLE recenzja ADD FOREIGN KEY (tytul_albumu) REFERENCES album(tytul_albumu) ON UPDATE CASCADE ON DELETE CASCADE; CREATE TABLE zespol( nazwa_zespolu TEXT PRIMARY KEY, rok_zalozenia INTEGER ); ALTER TABLE album ADD FOREIGN KEY(nazwa_zespolu) REFERENCES zespol(nazwa_zespolu) ON UPDATE CASCADE ON DELETE CASCADE; CREATE TABLE czlonek( imie TEXT NOT NULL, nazwisko TEXT NOT NULL, pseudo TEXT, nazwa_zespolu TEXT NOT NULL, PRIMARY KEY(imie, nazwisko) ); ALTER TABLE czlonek ADD FOREIGN KEY(nazwa_zespolu) REFERENCES zespol(nazwa_zespolu) ON UPDATE CASCADE ON DELETE CASCADE; CREATE TABLE piosenki( tytul_albumu TEXT NOT NULL, tytul_piosenki TEXT NOT NULL, nr_w_albumie INTEGER NOT NULL, ocena INTEGER, gatunek TEXT, PRIMARY KEY(tytul_albumu,tytul_piosenki) ); ALTER TABLE piosenki ADD FOREIGN KEY(tytul_albumu) REFERENCES album(tytul_albumu) ON UPDATE CASCADE ON DELETE CASCADE; CREATE TABLE wytwornia( nazwa TEXT PRIMARY KEY, kraj TEXT, miasto TEXT, kod_pocztowy TEXT ); ALTER TABLE wytwornia ADD CHECK(kod_pocztowy::text ~'^[0-9][2]-[0-9][3]$'::text); ALTER TABLE album ADD FOREIGN KEY(wytwornia) REFERENCES wytwornia(nazwa) ON UPDATE CASCADE ON DELETE CASCADE; CREATE TABLE instrument( instrument TEXT NOT NULL, imie TEXT NOT NULL, nazwisko TEXT NOT NULL ); ALTER TABLE instrument ADD FOREIGN KEY(imie,nazwisko) REFERENCES czlonek(imie,nazwisko) ON UPDATE CASCADE ON DELETE CASCADE; CREATE TABLE koncert( nazwa_zespolu TEXT NOT NULL, data_ DATE, nazwa_wydarzenia TEXT, miejsce TEXT, cena INTEGER, PRIMARY KEY(nazwa_wydarzenia,data_) ); ALTER TABLE koncert ADD CHECK (cena > 0); ALTER TABLE koncert ADD FOREIGN KEY(nazwa_zespolu) REFERENCES zespol(nazwa_zespolu) ON UPDATE CASCADE ON DELETE CASCADE; CREATE OR REPLACE FUNCTION srednia_zespolu(nazwa TEXT) RETURNS DECIMAL(4,2) AS $$ DECLARE r RECORD; suma DECIMAL(4,2); ilosc DECIMAL(4,2); BEGIN suma=0; ilosc=0; FOR r IN SELECT * FROM album WHERE nazwa_zespolu=nazwa LOOP suma= suma + srednia_albumu(r.tytul_albumu); ilosc=ilosc+1; END LOOP; suma = suma/ilosc; RETURN suma; END; $$ LANGUAGE 'plpgsql'; CREATE OR REPLACE FUNCTION srednia_albumu(nazwa TEXT) RETURNS DECIMAL(4,2) AS $$ DECLARE r RECORD; suma DECIMAL(4,2); ilosc DECIMAL(4,2); BEGIN suma=0; ilosc=0; FOR r IN SELECT * FROM piosenki WHERE piosenki.tytul_albumu=nazwa LOOP suma=suma+r.ocena; ilosc=r.nr_w_albumie; END LOOP; suma= suma/ilosc; RETURN suma; END; $$ LANGUAGE 'plpgsql'; --wedlug sredniej albumu CREATE VIEW ranking AS SELECT album.tytul_albumu, srednia_albumu(tytul_albumu) FROM album ORDER BY srednia_albumu(tytul_albumu) DESC; CREATE OR REPLACE VIEW ranking_zespolow AS SELECT DISTINCT album.nazwa_zespolu, srednia_zespolu(nazwa_zespolu) FROM album ORDER BY srednia_zespolu(nazwa_zespolu) DESC; CREATE OR REPLACE FUNCTION plyty_wydane(nazwa TEXT) RETURNS TABLE(nazwa_plyty TEXT, rok INTEGER) AS $$ BEGIN RETURN query SELECT album.tytul_albumu, album.rok_wydania FROM album WHERE nazwa=album.nazwa_zespolu; RETURN; END; $$ LANGUAGE 'plpgsql'; CREATE OR REPLACE FUNCTION piosenki_zespolu(nazwa TEXT) RETURNS TABLE(nazwa_plyty TEXT) AS $$ BEGIN RETURN query SELECT piosenki.tytul_piosenki FROM piosenki,album WHERE album.tytul_albumu=piosenki.tytul_albumu AND nazwa=album.nazwa_zespolu; RETURN; END; $$ LANGUAGE 'plpgsql'; --najblizsze koncerty zespolu CREATE OR REPLACE FUNCTION koncerty_zespolu(nazwa TEXT) RETURNS TABLE(data_ DATE,nazwa_wydarzenia TEXT,miejsce TEXT,cena INTEGER) AS $$ BEGIN RETURN query SELECT koncert.data_ ,koncert.nazwa_wydarzenia ,koncert.miejsce ,koncert.cena FROM koncert WHERE koncert.nazwa_zespolu=nazwa; END; $$ LANGUAGE 'plpgsql'; --wyswietla czlonkow zespolu CREATE OR REPLACE FUNCTION czlonkowie_zespolu(nazwa TEXT) RETURNS TABLE(imie_ TEXT,nazwisko_ TEXT, pseudonim_1 TEXT, instrument_1 TEXT) AS $$ BEGIN RETURN query SELECT czlonek.imie,czlonek.nazwisko,czlonek.pseudo,instrument.instrument FROM czlonek,instrument WHERE czlonek.imie=instrument.imie AND czlonek.nazwisko=instrument.nazwisko AND czlonek.nazwa_zespolu=nazwa; END; $$ LANGUAGE 'plpgsql'; --nie moze byc dwoch koncertow jednego dnia w innych miejscach CREATE OR REPLACE FUNCTION dwa_koncerty_jeden_dzien() RETURNS TRIGGER AS $$ BEGIN IF(SELECT nazwa_zespolu FROM koncert WHERE NEW.data_=koncert.data_ AND NEW.miejsce!=koncert.miejsce) IS NOT NULL THEN RAISE EXCEPTION 'Zespol nie moze grac tego samego dnia w dwoch roznych miejscach!'; END IF; RETURN NEW; END; $$ LANGUAGE 'plpgsql'; CREATE TRIGGER dwa_koncerty BEFORE INSERT OR UPDATE ON koncert FOR EACH ROW EXECUTE PROCEDURE dwa_koncerty_jeden_dzien(); --nie moze byc dwoch utworow o tych samych numerach na jednym albumie CREATE OR REPLACE FUNCTION jeden_numer_album() RETURNS TRIGGER AS $$ BEGIN IF(SELECT piosenki.tytul_piosenki FROM piosenki WHERE NEW.nr_w_albumie=piosenki.nr_w_albumie AND NEW.tytul_albumu=piosenki.tytul_albumu) THEN RAISE EXCEPTION 'Na tym albumie juz jest piosenka od tym numerze!'; END IF; RETURN NEW; END; $$ LANGUAGE 'plpgsql'; --albumy musza byc wydawane chronologicznie CREATE TRIGGER jeden_numer_w_albumie BEFORE INSERT OR UPDATE ON piosenki FOR EACH ROW EXECUTE PROCEDURE jeden_numer_album(); CREATE OR REPLACE FUNCTION chronologia_albumu() RETURNS TRIGGER AS $$ BEGIN IF(SELECT nazwa_zespolu FROM album WHERE (NEW.rok_wydania<album.rok_wydania) AND NEW.nazwa_zespolu=album.nazwa_zespolu) THEN RAISE EXCEPTION 'Albumy mogą być dodawane chronologicznie!'; END IF; RETURN NEW; END; $$ LANGUAGE 'plpgsql'; CREATE TRIGGER chronologia_albumu_ BEFORE INSERT OR UPDATE ON album FOR EACH ROW EXECUTE PROCEDURE chronologia_albumu(); INSERT INTO wytwornia VALUES('Parlophone','Niemcy','',NULL); INSERT INTO wytwornia VALUES('EMI','Anglia','Londyn',NULL); INSERT INTO wytwornia VALUES('BMK','USA','Waszyngton',NULL); INSERT INTO wytwornia VALUES('Giant Records','Polska','Katowice',NULL); INSERT INTO wytwornia VALUES('Columbia Records','USA','Miami',NULL); INSERT INTO wytwornia VALUES('Epic Records','USA','Miami',NULL); INSERT INTO zespol VALUES('The Beatles',1960); INSERT INTO zespol VALUES('Bisz',2001); INSERT INTO zespol VALUES('Paktofonika',1998); INSERT INTO zespol VALUES('Nneka',2009); INSERT INTO zespol VALUES('Outlawz',NULL); INSERT INTO zespol VALUES('The Clash',1977); INSERT INTO zespol VALUES('Miles Davis Quartet',1964); INSERT INTO zespol VALUES('Abradab',1996); INSERT INTO album VALUES('Revolver',1966,'Parlophone','The Beatles',TRUE); INSERT INTO album VALUES('Fandago',1993,'BMK','Bisz',NULL); INSERT INTO album VALUES('Kinematografia',1993,'Giant Records','Paktofonika',NULL); INSERT INTO album VALUES('Archiwum Kinematografii',1996,'Giant Records','Paktofonika',NULL); INSERT INTO album VALUES('Soul is Heavy',2001,'Giant Records','Nneka',NULL); INSERT INTO album VALUES('All eyez on me',1993,'Giant Records','Outlawz',NULL); INSERT INTO album VALUES('Still I Rise',1997,'Epic Records','Outlawz',NULL); INSERT INTO album VALUES('London Calling',1979,'Epic Records','The Clash',NULL); INSERT INTO album VALUES('Kind of Blue',1979,'Columbia Records','Miles Davis Quartet',NULL); INSERT INTO album VALUES('Czerwony Album',2002,'Giant Records','Abradab',NULL); INSERT INTO album VALUES('Panato',1994,'BMK','Bisz',NULL); INSERT INTO album VALUES('Let It Be',1970,'EMI','The Beatles',NULL); INSERT INTO czlonek VALUES('Robert','Napisko','Abradab','Abradab'); INSERT INTO czlonek VALUES('Miles','Davis','Gringo','Miles Davis Quartet'); INSERT INTO czlonek VALUES('Michal','Urbaniak','Urbanator','Miles Davis Quartet'); INSERT INTO czlonek VALUES('Mike','Kennedy',NULL,'Miles Davis Quartet'); INSERT INTO czlonek VALUES('Sammy','Lebowsky',NULL,'Miles Davis Quartet'); INSERT INTO czlonek VALUES('Patson','Marlsow','Marlboro','The Clash'); INSERT INTO czlonek VALUES('Michael','Fins','Finito','The Clash'); INSERT INTO czlonek VALUES('Frank','Gibson','Mel','The Clash'); INSERT INTO czlonek VALUES('John','Lennon',NULL,'The Beatles'); INSERT INTO