=======PROJEKT LOGICZNY=======
===== 1. Projektowanie tabel, kluczy, kluczy obcych, powiązań między tabelami, indeksów, etc. w oparciu o zdefiniowany diagram konceptualny ERD: =====
Klucze obce są oznaczone czerwonym rombem na diagramie ERD w punkcie 2. Ich nazwa wskazuje do której tabeli się odnoszą.
Indeksy zostały utworzone dla wszystkich kluczy obcych. Dodatkowo indeksowana jest kolumna issn w encji Copernicus, ze względu na wyszukiwanie przy dodawaniu do bazy publikacji, czy czasopismo, w którym był opublikowany artykuł znajduje się na liście punktowanych czasopism. Indeksowana jest również kolumna username w encji User ze względu na korzystanie z niej za każdym razem gdy następuje logowanie użytkownika.
Wszystkie indeksy są wypisane na diagramie ERD, u dołu odpowiednich encji.
===== 2. Diagram ERD w notacji Barkera/Oracle=====
{{:pl:dydaktyka:sbd:2012:projekty:bibliografia:logiczny.png|}}
===== 3. Tablica krzyżowa =====
{{:pl:dydaktyka:sbd:2012:projekty:bibliografia:krzyz.png|}}
*T1 - USER
*T2 - LOG
*T3 - AUTHOR
*T4 - PUBLICATION
*T5 - COPERNICUS
*T6 - ACTION
===== 4. Projekt bazy w języku SQL=====
CREATE SEQUENCE id_copernicus
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1;
CREATE TABLE IF NOT EXISTS copernicus (
id INT(11) DEFAULT NEXTVAL('id_copernicus') PRIMARY KEY,
title VARCHAR(128) NOT NULL ,
issn INT(11) NOT NULL ,
points INT(11) NOT NULL ,
UNIQUE INDEX issn_UNIQUE ON copernicus(issn ASC)
);
CREATE SEQUENCE id_publication
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1;
CREATE TABLE IF NOT EXISTS publication (
id INT(11) DEFAULT NEXTVAL('id_publication') PRIMARY KEY,
title VARCHAR(128) NOT NULL ,
year YEAR NOT NULL ,
author VARCHAR(128) NOT NULL ,
journal VARCHAR(128) NOT NULL ,
issn INT(11) NULL ,
points INT(11) NULL ,
bibtex_key VARCHAR(128) NOT NULL ,
volume INT(11) NULL ,
number INT(11) NULL ,
pages INT(11) NULL ,
month INT(11) NULL ,
note TEXT NULL ,
key VARCHAR(128) NOT NULL ,
INDEX fk_publication_copernicus ON publication(issn ASC);
CONSTRAINT fk_publication_copernicus FOREIGN KEY (issn) REFERENCES copernicus(issn),
CHECK(month>0),
CHECK(month<13)
);
CREATE SEQUENCE id_author
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1;
CREATE TABLE IF NOT EXISTS author (
id INT(11) DEFAULT NEXTVAL('id_author') NOT NULL PRIMARY KEY ,
name VARCHAR(128) NOT NULL ,
surname VARCHAR(128) NOT NULL ,
university VARCHAR(128) NOT NULL ,
faculty VARCHAR(45) NOT NULL ,
degree VARCHAR(45) NOT NULL ,
publication_count INT NULL ,
);
CREATE SEQUENCE id_user
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1;
CREATE TABLE IF NOT EXISTS user (
id INT(11) DEFAULT NEXTVAL('id_user') NOT NULL PRIMARY KEY ,
username VARCHAR(128) NOT NULL ,
password VARCHAR(128) NOT NULL ,
email VARCHAR(128) NOT NULL ,
user_type INT(11) NOT NULL ,
salt TINYINT NOT NULL,
author_id INT(11) NULL ,
UNIQUE INDEX username_UNIQUE ON user(username),
INDEX fk_user_author ON user(author_id ASC),
CONSTRAINT fk_user_autor FOREIGN KEY (author_id) REFERENCES author(id)
);
CREATE SEQUENCE id_action
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1;
CREATE TABLE IF NOT EXISTS action(
id INT(11) DEFAULT NEXTVAL('id_action') NOT NULL PRIMARY KEY ,
module VARCHAR(45) NULL ,
controller VARCHAR(45) NULL ,
action VARCHAR(45) NULL ,
is_secure TINYINT(1) NULL DEFAULT 0 ,
);
CREATE SEQUENCE id_log
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1;
CREATE TABLE IF NOT EXISTS log (
id INT(11) DEFAULT NEXTVAL('id_log') NOT NULL PRIMARY KEY ,
log_date DATE NOT NULL ,
hour TIME NOT NULL ,
user_id INT(11) NOT NULL ,
INDEX fk_log_user ON log(user_id ASC),
CONSTRAINT fk_log_user FOREIGN KEY (user_id) REFERENCES user (id)
);
CREATE TABLE IF NOT EXISTS publication_has_author (
publication_id INT(11) NOT NULL PRIMARY KEY,
author_id INT(11) NOT NULL PRIMARY KEY,
INDEX fk_publication ON user(publication_id ASC),
INDEX fk_author ON user(author_id ASC),
CONSTRAINT fk_publication FOREIGN KEY (publication_id) REFERENCES publication(id)
CONSTRAINT fk_author FOREIGN KEY (author_id) REFERENCES author(id)
);
CREATE TABLE IF NOT EXISTS action_has_user (
action_id INT(11) NOT NULL PRIMARY KEY,
user_id INT(11) NOT NULL PRIMARY KEY,
INDEX fk_action ON user(action_id ASC),
INDEX fk_user ON user(user_id ASC),
CONSTRAINT fk_action FOREIGN KEY (action_id ) REFERENCES action(id)
CONSTRAINT fk_user FOREIGN KEY (user_id ) REFERENCES user(id)
);
===== 5. Słowniki danych=====
^Nazwa tabeli ^Nazwa kolumny ^Typ danych ^Rozmiar ^Wymagana wartość ^Primary ^ Ograniczenia ^
|Author |Id |Integer |11 |Tak |Tak |0-9|
|Author |Name |Varchar |128 |Tak |Nie |a-zA-Z|
|Author |Surname |Varchar |128 |Tak |Nie |a-zA-Z|
|Author |University |Varchar |128 |Tak |Nie |a-zA-Z|
|Author |Faculty |Varchar |45 |Tak |Nie |a-zA-Z|
|Author |Degree |Varchar |45 |Tak |Nie |a-zA-Z|
|Author |Publication_count |Integer |1 |Nie |Nie |0-9|
|User |Id |Varchar |128 |Tak |Tak |a-zA-Z|
|User |Username |Varchar |128 |Tak |Nie |a-zA-Z|
|User |Password |Varchar |128 |Tak |Nie |a-zA-Z|
|User |Email |Varchar |128 |Tak |Nie |[[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}]|
|User |User_type |Integer |11 |Tak |Nie |0-9|
|User |Author_id |Integer |11 |Nie |Nie |0-9|
|Log |Id |Integer |11 |Tak |Tak |0-9|
|Log |Log_date |Date |1 |Tak |Nie |YYYY-MM-DD|
|Log |Hour | TIME |1 |Tak |Nie| HH:MM:SS|
|Log |User_id | Integer |11 |Tak | Nie|0-9|
|Publication_has_author |Publication_id |Integer |11 |Tak | Tak|0-9|
|Publication_has_author |Author_id |Integer |11 |Tak |Tak|0-9|
|Publication |Id |Integer |11 |Tak | Tak|0-9|
|Publication |Title |Varchar |128 |Tak | Nie|a-zA-Z|
|Publication |Year |Year |1 |Tak | Nie|0-9|
|Publication |Author |Varchar |128 |Tak | Nie|a-zA-Z|
|Publication |Journal |Varchar |128 |Tak | Nie|a-zA-Z|
|Publication |Issn | Integer |11 |Nie | Nie|0-9|
|Publication |Points |Integer |11 |Nie | Nie|0-9|
|Publication |Bibtex_key |Varchar |128 |Tak | Nie|a-zA-Z|
|Publication |Volume |Integer |11 |Nie |Nie|0-9|
|Publication |Number |Integer |11 |Nie |Nie|0-9|
|Publication |Pages |Integer |11 |Nie |Nie|0-9|
|Publication |Month |Integer |11 |Nie |Nie|0-9|
|Publication |Note |Text |1 |Nie |Nie|0-9a-zA-Z|
|Publication |Key |Varchar |128 |Nie |Nie|a-zA-Z|
|Copernicus |Id |Integer |11 |Tak |Tak|0-9|
|Copernicus |Title |Varchar |128 |Tak |Nie |a-zA-Z|
|Copernicus |Issn |Integer |11 |Tak |Nie |0-9|
|Copernicus |Points |Integer |11 |Tak |Nie |0-9|
|Action |Id |Integer |11 |Tak |Tak|0-9|
|Action |Module |Varchar |128 |Tak |Nie |a-zA-Z|
|Action |Controller |Varchar |128 |Tak |Nie |a-zA-Z|
|Action |Action |Varchar |128 |Tak |Nie |a-zA-Z|
|Action |is_secure |Tinyint |128 |Tak |Nie |0-9|
===== 6. Analiza zależności funkcyjnych i normalizacja tabel=====
Tabele po denormalizacji do 3NF ( każdy atrybut wtórny zależy bezpośrednio od klucza głównego):
==== Tabela user ====
^ id ^ username ^ password ^ email ^ user_type ^ author_id ^
3NF:
^ user_id ^ username ^ password ^ email ^ user_type ^
^ user_id ^ password ^ salt ^
==== Tabela log ====
^ id ^ log_date ^ hour ^ user_id ^
3NF:
^ user_id ^ log_date ^ hour ^
==== Tabela author ====
^ id ^ name ^ surname ^ university ^ faculty ^ degree ^ publication_count ^
3NF:
^ id ^ name ^ surname ^ degree ^ university ^ publication_count ^
^university ^ faculty ^
==== Tabela copernicus ====
^ id ^ issn ^ title ^ points ^
3NF:
^ id ^ issn ^
^ issn ^ title ^ points ^
==== Tabela publication ====
^ id ^ title ^ points ^ bibtex_key ^ date_of_publication ^ surname ^ firstname ^ publishing ^
3NF:
^id^title^points^bibtex_key^author^
^bibtex_key^title^year^author^journal^volume^number^pages^month^note^key^
^id^author_id^author^
==== Tabela action ====
^id^module^controller^action^is_secure
3NF:
^id^module^controller^action^is_secure
Dekompozycja do BCNF - spełniona.
Dekompozycja do 4NF - spełniona.
Dekompozycja do 5NF - spełniona.
Dekomponując tabele do poszczególnych form powinniśmy utworzyć w bazie nowe tabele, które spełniały by ich założenia. W naszej aplikacji uznaliśmy, że jednak wygodniejszym rozwiązaniem będzie pozostawienie tabel w takiej postaci, w jakiej są.
===== 7. Projektowanie operacji na danych =====
Publikacje w zależności od liczby punktów:
SELECT * FROM publication where points > próg
SELECT * FROM publication where points = próg
SELECT * FROM publication where points < próg
Lista autorów:
SELECT * FROM author
Konkretny autor:
SELECT * FROM author WHERE author_id = szukane_id
Lista publikacji w zależności od roku wydania:
SELECT * FROM publication WHERE year > szukany_rok
SELECT * FROM publication WHERE year <= szukany_rok
Lista publikacji w danym piśmie naukowym:
SELECT * FROM publication where issn = szukany_issn
Logowanie:
INSERT INTO log(id, log_date, hour, user_id) VALUES ( 231, '2012-12-03, 12, 4324 );
Edytuj publikacje:
UPDATE publication SET journal='my journal' where id = 45
DELETE * FROM publication WHERE author = 'Albert Einstein'
Lista będzie uaktualniona dokładnie, gdy zadecydujemy o kryteriach filtrowania w aplikacji.