To jest stara wersja strony!
Projekt logiczny
1. Projektowanie tabel.
Kod SQL tworzący kompletną strukturę danych wykorzystywaną w projekcie wygląda następująco:
SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET check_function_bodies = FALSE;
SET client_min_messages = warning;
SET escape_string_warning = off;
SET search_path = public, pg_catalog;
--
-- Name: dblink_pkey_results; Type: TYPE; Schema: public; Owner: rewersy
--
CREATE TYPE dblink_pkey_results AS (
"position" INTEGER,
colname text
);
ALTER TYPE public.dblink_pkey_results OWNER TO rewersy;
--
-- Name: clean_emp(); Type: FUNCTION; Schema: public; Owner: rewersy
--
CREATE FUNCTION clean_emp() RETURNS INTEGER
AS $$
SELECT numer_pokoju FROM pokoje;
$$
LANGUAGE SQL;
ALTER FUNCTION public.clean_emp() OWNER TO rewersy;
SET default_tablespace = '';
SET default_with_oids = FALSE;
--
-- Name: autorzy; Type: TABLE; Schema: public; Owner: rewersy; Tablespace:
--
CREATE TABLE autorzy (
imie CHARACTER VARYING(45) NOT NULL,
nazwisko CHARACTER VARYING(45) NOT NULL,
id INTEGER NOT NULL
);
ALTER TABLE public.autorzy OWNER TO rewersy;
--
-- Name: autorzy_id_seq; Type: SEQUENCE; Schema: public; Owner: rewersy
--
CREATE SEQUENCE autorzy_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
ALTER TABLE public.autorzy_id_seq OWNER TO rewersy;
--
-- Name: autorzy_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: rewersy
--
ALTER SEQUENCE autorzy_id_seq OWNED BY autorzy.id;
--
-- Name: autorzy_id_seq; Type: SEQUENCE SET; Schema: public; Owner: rewersy
--
SELECT pg_catalog.setval('autorzy_id_seq', 161, TRUE);
--
-- Name: ksiazki; Type: TABLE; Schema: public; Owner: rewersy; Tablespace:
--
CREATE TABLE ksiazki (
id INTEGER NOT NULL,
tytul CHARACTER VARYING(45) NOT NULL,
rok_wydania INTEGER,
login CHARACTER VARYING(45),
wydawnictwo CHARACTER VARYING(30)
);
ALTER TABLE public.ksiazki OWNER TO rewersy;
--
-- Name: ksiazki_id_seq; Type: SEQUENCE; Schema: public; Owner: rewersy
--
CREATE SEQUENCE ksiazki_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
ALTER TABLE public.ksiazki_id_seq OWNER TO rewersy;
--
-- Name: ksiazki_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: rewersy
--
ALTER SEQUENCE ksiazki_id_seq OWNED BY ksiazki.id;
--
-- Name: ksiazki_id_seq; Type: SEQUENCE SET; Schema: public; Owner: rewersy
--
SELECT pg_catalog.setval('ksiazki_id_seq', 169, TRUE);
--
-- Name: napisali; Type: TABLE; Schema: public; Owner: rewersy; Tablespace:
--
CREATE TABLE napisali (
id_autora INTEGER NOT NULL,
id_ksiazka INTEGER NOT NULL
);
ALTER TABLE public.napisali OWNER TO rewersy;
--
-- Name: przetrzymuje; Type: TABLE; Schema: public; Owner: rewersy; Tablespace:
--
CREATE TABLE przetrzymuje (
data_wypozyczenia DATE,
id_ksiazka INTEGER NOT NULL,
login CHARACTER VARYING(45) NOT NULL
);
ALTER TABLE public.przetrzymuje OWNER TO rewersy;
--
-- Name: rezerwuje; Type: TABLE; Schema: public; Owner: rewersy; Tablespace:
--
CREATE TABLE rezerwuje (
id_ksiazka INTEGER NOT NULL,
login CHARACTER VARYING(45) NOT NULL
);
ALTER TABLE public.rezerwuje OWNER TO rewersy;
--
-- Name: uzytkownik; Type: TABLE; Schema: public; Owner: rewersy; Tablespace:
--
CREATE TABLE uzytkownik (
login CHARACTER VARYING(45) NOT NULL,
imie CHARACTER VARYING(45) NOT NULL,
nazwisko CHARACTER VARYING(45),
e_mail CHARACTER VARYING(50),
haslo CHARACTER VARYING(32),
budynek CHARACTER VARYING(10),
pokoj CHARACTER VARYING(10)
);
ALTER TABLE public.uzytkownik OWNER TO rewersy;
--
-- Name: zaprosil; Type: TABLE; Schema: public; Owner: rewersy; Tablespace:
--
CREATE TABLE zaprosil (
zaproszony CHARACTER VARYING(45) NOT NULL,
login CHARACTER VARYING(45)
);
ALTER TABLE public.zaprosil OWNER TO rewersy;
--
-- Name: zaproszony; Type: TABLE; Schema: public; Owner: rewersy; Tablespace:
--
CREATE TABLE zaproszony (
id INTEGER NOT NULL,
login_polecil CHARACTER VARYING(45),
hash text,
imie CHARACTER VARYING(45),
nazwisko CHARACTER VARYING(45),
email CHARACTER VARYING(50)
);
ALTER TABLE public.zaproszony OWNER TO rewersy;
--
-- Name: zaproszony_id_seq; Type: SEQUENCE; Schema: public; Owner: rewersy
--
CREATE SEQUENCE zaproszony_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
ALTER TABLE public.zaproszony_id_seq OWNER TO rewersy;
--
-- Name: zaproszony_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: rewersy
--
ALTER SEQUENCE zaproszony_id_seq OWNED BY zaproszony.id;
--
-- Name: zaproszony_id_seq; Type: SEQUENCE SET; Schema: public; Owner: rewersy
--
SELECT pg_catalog.setval('zaproszony_id_seq', 58, TRUE);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: rewersy
--
ALTER TABLE autorzy ALTER COLUMN id SET DEFAULT NEXTVAL('autorzy_id_seq'::regclass);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: rewersy
--
ALTER TABLE ksiazki ALTER COLUMN id SET DEFAULT NEXTVAL('ksiazki_id_seq'::regclass);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: rewersy
--
ALTER TABLE zaproszony ALTER COLUMN id SET DEFAULT NEXTVAL('zaproszony_id_seq'::regclass);
--
-- Data for Name: autorzy; Type: TABLE DATA; Schema: public; Owner: rewersy
--
--
-- Name: autorzy_pkey; Type: CONSTRAINT; Schema: public; Owner: rewersy; Tablespace:
--
ALTER TABLE ONLY autorzy
ADD CONSTRAINT autorzy_pkey PRIMARY KEY (id);
--
-- Name: ksiazki_pkey; Type: CONSTRAINT; Schema: public; Owner: rewersy; Tablespace:
--
ALTER TABLE ONLY ksiazki
ADD CONSTRAINT ksiazki_pkey PRIMARY KEY (id);
--
-- Name: napisali_pkey; Type: CONSTRAINT; Schema: public; Owner: rewersy; Tablespace:
--
ALTER TABLE ONLY napisali
ADD CONSTRAINT napisali_pkey PRIMARY KEY (id_autora, id_ksiazka);
--
-- Name: przetrzymuje_pkey; Type: CONSTRAINT; Schema: public; Owner: rewersy; Tablespace:
--
ALTER TABLE ONLY przetrzymuje
ADD CONSTRAINT przetrzymuje_pkey PRIMARY KEY (id_ksiazka, login);
--
-- Name: rezerwuje_pkey; Type: CONSTRAINT; Schema: public; Owner: rewersy; Tablespace:
--
ALTER TABLE ONLY rezerwuje
ADD CONSTRAINT rezerwuje_pkey PRIMARY KEY (id_ksiazka, login);
--
-- Name: uzytkownik_pkey; Type: CONSTRAINT; Schema: public; Owner: rewersy; Tablespace:
--
ALTER TABLE ONLY uzytkownik
ADD CONSTRAINT uzytkownik_pkey PRIMARY KEY (login);
--
-- Name: zaprosil_pkey; Type: CONSTRAINT; Schema: public; Owner: rewersy; Tablespace:
--
ALTER TABLE ONLY zaprosil
ADD CONSTRAINT zaprosil_pkey PRIMARY KEY (zaproszony);
--
-- Name: zaproszony_pkey; Type: CONSTRAINT; Schema: public; Owner: rewersy; Tablespace:
--
ALTER TABLE ONLY zaproszony
ADD CONSTRAINT zaproszony_pkey PRIMARY KEY (id);
--
-- Name: ksiazki_login_fkey; Type: FK CONSTRAINT; Schema: public; Owner: rewersy
--
ALTER TABLE ONLY ksiazki
ADD CONSTRAINT ksiazki_login_fkey FOREIGN KEY (login) REFERENCES uzytkownik(login) ON UPDATE RESTRICT ON DELETE RESTRICT;
--
-- Name: napisali_id_autora_fkey; Type: FK CONSTRAINT; Schema: public; Owner: rewersy
--
ALTER TABLE ONLY napisali
ADD CONSTRAINT napisali_id_autora_fkey FOREIGN KEY (id_autora) REFERENCES autorzy(id) ON UPDATE RESTRICT ON DELETE RESTRICT;
--
-- Name: napisali_id_ksiazka_fkey; Type: FK CONSTRAINT; Schema: public; Owner: rewersy
--
ALTER TABLE ONLY napisali
ADD CONSTRAINT napisali_id_ksiazka_fkey FOREIGN KEY (id_ksiazka) REFERENCES ksiazki(id) ON UPDATE RESTRICT ON DELETE RESTRICT;
--
-- Name: przetrzymuje_id_ksiazka_fkey; Type: FK CONSTRAINT; Schema: public; Owner: rewersy
--
ALTER TABLE ONLY przetrzymuje
ADD CONSTRAINT przetrzymuje_id_ksiazka_fkey FOREIGN KEY (id_ksiazka) REFERENCES ksiazki(id) ON UPDATE RESTRICT ON DELETE RESTRICT;
--
-- Name: przetrzymuje_login_fkey; Type: FK CONSTRAINT; Schema: public; Owner: rewersy
--
ALTER TABLE ONLY przetrzymuje
ADD CONSTRAINT przetrzymuje_login_fkey FOREIGN KEY (login) REFERENCES uzytkownik(login) ON UPDATE RESTRICT ON DELETE RESTRICT;
--
-- Name: rezerwuje_id_ksiazka_fkey; Type: FK CONSTRAINT; Schema: public; Owner: rewersy
--
ALTER TABLE ONLY rezerwuje
ADD CONSTRAINT rezerwuje_id_ksiazka_fkey FOREIGN KEY (id_ksiazka) REFERENCES ksiazki(id) ON UPDATE RESTRICT ON DELETE RESTRICT;
--
-- Name: rezerwuje_login_fkey; Type: FK CONSTRAINT; Schema: public; Owner: rewersy
--
ALTER TABLE ONLY rezerwuje
ADD CONSTRAINT rezerwuje_login_fkey FOREIGN KEY (login) REFERENCES uzytkownik(login) ON UPDATE RESTRICT ON DELETE RESTRICT;
--
-- Name: zaprosil_login_fkey; Type: FK CONSTRAINT; Schema: public; Owner: rewersy
--
ALTER TABLE ONLY zaprosil
ADD CONSTRAINT zaprosil_login_fkey FOREIGN KEY (login) REFERENCES uzytkownik(login) ON UPDATE RESTRICT ON DELETE RESTRICT;
--
-- Name: zaproszony_login_polecil_fkey; Type: FK CONSTRAINT; Schema: public; Owner: rewersy
--
ALTER TABLE ONLY zaproszony
ADD CONSTRAINT zaproszony_login_polecil_fkey FOREIGN KEY (login_polecil) REFERENCES uzytkownik(login) ON UPDATE RESTRICT ON DELETE RESTRICT;
2. Słownki danych.
autorzy:
Klucz podstawowy (id)
id - typ: serial, niepusty, Klucz podstawowy tabeli autorzy
imie - typ: character varying(45), Imię autora książki
nazwisko - typ: character varying(45), Nazwisko autora książki
ksiazki:
Klucz podstawowy (id)
id - typ: serial, niepusty, Klucz podstawowy tabeli ksiażki
tytul - typ: character varying(45), Tytuł książki, która jest dostępna w systemie
rok_wydania - typ: integer, Rok wydania książki
login - typ: character varying(45), klucz obcy - tabela 'uzytkownik' Login użytkownika, który jest właścicielem książki
wydawnictwo - typ: character varying(30), Wydawnictwo, które wydało książkę
napisali:
klucz podstawowy: (id_autora, id_ksiazka)
id_autora - typ: integer, niepusty, klucz obcy z tabeli 'autorzy', Identyfikator autora
id_ksiazka - typ: integer, niepusty, klucz obcy z tabeli 'ksiazki', Identikator książki
uzytkownik:
Klucz podstawowy (login)
login - typ: character varying(45), niepusty, Klucz podstawowy
imie - typ: character varying(45), niepusty, Imię użytkownika
nazwisko - typ: character varying(45), Nazwisko użytkownika
e_mail - typ: character varying(50), E-mail użytkownika
haslo - typ: character varying(32), hasło użytkownika do systemu, trzymane w bazie w postaci zakodowanej
budynek - typ: character varying(10), Nazwa budynku AGH, w którym pracuje użytkownik systemu
pokoj - typ: character varying(10), Pokój na uczelni AGH, gdzie użytkownik pracuje użytkownika systemu
przetrzymuje:
podstawowy tabeli to para (id_ksiazka, login)
data_wypozyczenia - typ: date, Data wypożyczenia książki
id_ksiazka - typ: integer, niepusty, Klucz obcy z tabeli 'ksiazki' Identyfikator książki, która została pożyczona
login - typ: character varying(45), niepusty, klucz obcy z tabeli 'uzytkownik' Login użytkownika, który wypożyczył daną książkę
rezerwuje:
Klucz podstawowy (id_ksiazka, login)
id_ksiazka - typ: integer, niepusty, Id zarezerwowanej książki
login - typ: character varying(45), niepusty, Login użytkonika, który książkę zarezerwował
zaprosil:
Klucz podstawowy (zaproszony). Tabela w celu prowadzenia drzewa zaproszeń, tzn „kto-kogo zaprosił”
zaproszony - typ: character varying(45), niepusty, Login użytkownika zaproszonego
login - typ: character varying(45), Login użytkownika, który zaproszał
zaproszony:
Klucz podstawowy (id). Tabela to rejestracja użytkowników zaproszonych (tzn. tych do których został wysłany email z zaproszeniem) ale jeszcze nie zarejestrowanych
id - typ: serial, Klucz podstawowy
login_polecil - typ: character varying(45), Login użytkownika, który polecił nowego użytkownika
hash - typ: text,
unikalny, automatycznie generowany kod dołączany to URL zawierającego formularzem rejestracyjnym
imie - typ: character varying(45), Imię zaproszonej osoby
nazwisko - typ: character varying(45), Nazwisko zaproszonej osoby
email - typ: character varying(50), E-mail zaproszonej osoby
3. Analiza zależności funkcyjnych i normalizacja tabel.
Wszystkie tabele bazy danych spełniają co najmniej normę 3NF. Nie przewidujemy więc normalizacji.
Jedyną wątpliwością jaka może się pojawić przy dokładniejszym przyjrzeniu się strukturze bazy danych dotyczy tabeli 'uzytkownik'.
Wydaje się, że kolumny „pokoj” i „budynek” są redundantne. Możnaby stworzyć tabelę 'Miejsca_pracy'(Kolumny: pokoj i budynek) oraz relację jeden-do-wielu pomiędzy tabelą 'uzytkownik' a tabelą 'miejsca_pracy'. Byłoby to korzystne pod jednym względem: użytkownicy systemu mogliby wpisać do swojego profilu wiele miejsc pracy, jako że niektórzy pracownicy AGH mają do dyspozycji więcej niż jeden pokój. Postanowiliśmy jednak zrezygnować z tego udogodnienia, zezwalając użytkownikom systemu REWERSY na wpisanie tylko jednej lokalizacji. Przez ten prosty zabieg nasz system stał się bardziej przejrzysty, a baza danych - mniej skomplikowana
4. Denormalizacja struktury tabel.
5. Projektowanie operacji na danych.