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.

pl/dydaktyka/sbd/2009/projekty/rewersy/logiczny.1284196477.txt.gz · ostatnio zmienione: 2019/06/27 15:55 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0