|
|
pl:dydaktyka:sbd:2009:projekty:rewersy:logiczny [2010/09/11 11:14] sbd09 |
pl:dydaktyka:sbd:2009:projekty:rewersy:logiczny [2019/06/27 15:50] |
====== Projekt logiczny ====== | |
==== -. Projektowanie tabel. ==== | |
Kod SQL tworzący kompletną strukturę danych wykorzystywaną w projekcie wygląda następująco: | |
<code sql> | |
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; | |
| |
</code> | |
| |
==== -. 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** | |
| |
==== -. 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 | |
| |
==== -. Denormalizacja struktury tabel. ==== | |
==== -. Projektowanie operacji na danych. ==== | |