===== 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=?