===== Projektowanie tabel, kluczy, kluczy obcych, powiązań między tabelami, indeksów, etc. w oparciu o zdefiniowany diagram ERD ====
Projekt bazy\\
{{:pl:dydaktyka:ztb:2011:projekty:emarking:baza_finallllll.jpg|}}
skrypt tworzący: \\ {{:pl:dydaktyka:ztb:2011:projekty:emarking:create_emarking_base_final.sql|skrypt tworzący}}
===== Słowniki danych =====
testgroups - tabela definiująca grupy testów
* group - varchar(64), PK - określa grupę, do której przynależy model testu
models - tabela zawierająca modele/wzorce egzaminów
* modelid - bigserial, PK - klucz główny, id modelu
* modelname - varchar(64), NOT NULL - nazwa modelu
* group - varchar(64), FK - klucz obcy do //testgroups//
questions - tabela zawierająca pytania
* questionid - bigserial, PK - klucz główny, id pytania
* points - smallint, NOT NULL - punktacja pytania
* correctanswer - text, NOT NULL - poprawna odpowiedź do pytania (zawierająca słowa klucze dla pytań otwartych)
* qmodelid - bigint, NOT NULL, FK - klucz obcy do //models//
tests - tabela zawierająca oceniane testy
* testid - bigserial, PK - id testu
* testmodlid - bigint, FK - klucz obcy do //models//
* marked - boolean, default FALSE - boolean ocenienia testu
* testimage - OID - przechowuje skan testu
users - tabela przechowująca użytkowników
* username - varchar(64), PK - klucz główny, unikalna nazwa użytkownika
* password - varchar(64), NOT NULL - hasło
* email - varchar(64), NOT NULL - email
* lastname - varchar(64), NOT NULL - nazwisko
* firstname - varchar(64), NOT NULL - imię
roles - tabela przechowująca role
* role - varchar(64), PK - klucz główny
* rolename - varchar(64), NOT NULL - nazwa roli
testassignments - tabela zawierająca przypisania użytkowników do ocenianych testów
* taid - bigserial, PK - klucz główny, id //testassignments//
* tatestid - bigint, FK - klucz obcy do //tests//
* username - varchar(64), FK - klucz obcy do //users//
groups - tabela łącznik pomiędzy //users// a //roles//
* grusername - varchar(64), PK, FK - klucz główny, klucz obcy do //users//
* grrole - varchar(64), FK - klucz obcy do //roles//
privileges - tabela łącząca //roles// z //tasks//
* privID - bigserial, PK - klucz główny
* proleid - varchar(64), FK - klucz obcy do //roles//
* taskid - bigint, FK - klucz obcy do //tasks//
tasks - tabela zawierająca uprawnienia/przywileje
* taskid - bigserial, PK - klucz główny, id tasks
* tasktype - varchar(64), FK - klucz obcy do //types//
* predefined - boolean - zmienna ustawiana na true dla tasków 'podstawowych' - nie usuwalnych.
* taction - varchar(64), FK - klucz obcy do //actions//
* tobject - varchar(64), FK - klucz obcy do //objects//
* tprivilegeid - varchar(64), FK - klucz obcy do //privileges//
types - tabela przechowująca rodzaje typów
* tasktype - varchar(64), PK - klucz główny
actions - tabela zawierająca wykonywane akcje
* action - varchar(64), PK - klucz główny
objects - tabela przechowująca obiekty na których są wykonywane akcje
* object - varchar(64), PK - klucz główny
===== Analiza zależności funkcyjnych i normalizacja tabel =====
* 1NF
Wszystkie wartości atrybutów są atomowe, zatem zgodnie z definicją, warunek 1NF dla bazy jest spełniony
* 2NF
Wszystkie tabele posiadają klucz główny prosty, zatem postać 2NF również jest zachowana.
* 3NF
Trzecia postać normalna jest spełniona (nie występują relacje tranzytywne) - pola niebędące kluczami są od klucza bezpośrednio zależne.
Postać 3NF na potrzeby projektu jest w zupełności wystarczająca
===== Projektowanie operacji na danych =====
Emarking do komunikacji z bazą wykorzystuje bibliotekę Hibernate służącą do mapowania obiektowo-relacyjnego. \\
Emarking mapując obiekty DAO z wykorzystaniem HibernateTemplate z pakietu narzędziowego Spring Framework, pozwala w łatwy sposób na tworzenie metod, które operują na bazie za nas \\ \\
Przykładowo, kod metody pobierającej użytkowników z bazy ma postać \\
public List getAllUsers()
{
return (List)hibernateTemplate.find("from " + "User");
}
\\
Natomiast zapytanie generowane przez HibernateTemplate wygląda następująco \\
select group0_.grusername as grusername2_0_, group0_.grrole as grrole2_0_ from groups group0_ where group0_.grusername=?