[[
✎ pl:dydaktyka:sbd:2012:projekty:lab:projekt_logiczny
]]
aiWiki
Pokaż stronę
Ostatnie zmiany
Indeks
Zaloguj
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
====== Projektowanie tabel, kluczy, kluczy obcych, powiązań między tabelami, indeksów, etc. ====== ==== Wyjaśnienie niektórych powiązań między encjami ==== ** Relacja ResTemplate-ResInstance (1:n)** z jednego schematu może wywodzić się wiele instancji\\ Klucz obcy __ResTemplate_ID (w ResInstance)__ - instancja badania zawiera klucz szablony, z którego się wywodzi\\ \\ **Relacja Experiment - Client (n:n)-** reprezentowana przez encję Entity1, przyporządkowującą klienta i obserwowane przez niego badanie \\ Klucz obcy __client_ID (w Entity1)__ \\ Klucz obcy __experiment_ID (w Entity1)__ \\ **Relacja Labgeek - Experiment (1:n)** - laborant może stworzyć wiele eksperymentów \\ Klucz obcy __labgeek_ID (w Experiment)__ - oznacza laboranta, który stworzył dany eksperyment\\ **Relacja ResIntance- Experiment (1:n)** - każda instancja badania składa się z wielu eksperymentów \\ Klucz obcy __Resintance_ID (w Experiment)__ - oznacza instancję badania, do której należy \\ **Relacja Experiment - Experiment (1:1)** - obrazuje kolejność następowania po sobie eksperymentów w badaniu \\ Klucz obcy __next_experiment_ID (w Experiment)__ - prowadzi do ewentualnego kolejnego eksperymentu\\ **Relacja ResTemplate - ExpScheme (1:n)** - w szablonie tworzone jest wiele możliwych schematycznych eksperymentów \\ Klucz obcy __Restemplate_ID (w ExpScheme)__ - oznacza szablon, z którego wywodzi sie eksperyment\\ **Relacja ExpScheme - ResGroup (1:1)** - połączenie schematu eksperymentu z grupą jego możliwych wyników \\ Klucz obcy __ExpScheme_ID (w ResGroup)__ - oznacza schemat, do którego należy grupa wyników\\ **Relacja ResGroup - Result (1:n)** - wiele wyników składa się na grupę wyników dla danego schematu \\ Klucz obcy __resgroup_ID (w Result)__ - oznacza grupę wyników, do której należy konkretny wynik\\ **Relacja Result - ExpScheme (1:1)** - połączenie wyniku z sugerowanym na jego podstawie schematem następnego eksperymentu \\ Klucz obcy __next_expscheme_ID (w Result)__ - oznacza następny sugerowany schemat eksperymentu \\ **Relacja Experiment - LabBoard (1:n)** - do danego eksperymentu może 'należeć' wiele płytek laboratoryjnych \\ Klucz obcy __experiment_ID (w LabBoard)__ - oznacza eksperyment, do którego należy płytka \\ **Relacja LabBoard - Sample (n:n)** - realizowana przez pośrednią encję PlaceOnBoard, określającą nie tylko, która próbka należy w danym momencie do której płytki, lecz także określa współrzędne położenia próbki na płytce\\ Klucz obcy __board_ID (w PlaceOnBoard)__ - oznacza płytkę laboratoryjną, na której umieszczana jest próbka \\ Klucz obcy __sample_ID (w PlaceOnBoard)__ - oznacza próbkę umieszczaną na konkretnym miejscu płytki \\ ====== Diagram ERD ====== {{:pl:dydaktyka:sbd:2012:projekty:lab:erd_.jpeg|}} ---- ======Tablica Krzyżowa ====== {{:pl:dydaktyka:sbd:2012:projekty:lab:cross.png|}} ======Projekt bazy w języku SQL ====== <code sql> DROP DATABASE lab; CREATE DATABASE lab DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_polish_ci; USE lab; SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; CREATE TABLE IF NOT EXISTS ADMINISTRATOR ( admin_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, login VARCHAR(20) UNIQUE NOT NULL, surname VARCHAR(30), name VARCHAR(30), password VARCHAR(30) NOT NULL, CHECK(LEN(password) >= 8) ); CREATE INDEX ADMIN_login ON ADMINISTRATOR(login); CREATE TABLE IF NOT EXISTS LABGEEK ( labGeek_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, login VARCHAR(20) UNIQUE NOT NULL, surname VARCHAR(30), name VARCHAR(30), password VARCHAR(30) NOT NULL, CHECK(LEN(password) >= 8) ); CREATE INDEX LABGEEK_login ON LABGEEK(login); CREATE TABLE IF NOT EXISTS CLIENT ( client_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, login VARCHAR(20) UNIQUE NOT NULL, surname VARCHAR(30), name VARCHAR(30), password VARCHAR(30) NOT NULL, CHECK(LEN(password) >= 8) ); CREATE INDEX CLIENT_login ON CLIENT(login); CREATE TABLE IF NOT EXISTS ENTITY1 ( client_ID INTEGER NOT NULL, experiment_ID INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS EXPERIMENT ( experiment_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), description VARCHAR(200), result_ID INTEGER, labGeek_ID INTEGER, expScheme_ID INTEGER, resInstance_ID INTEGER, FOREIGN KEY (labGeek_ID) REFERENCES LABGEEK(labGeek_ID), FOREIGN KEY (expScheme_ID) REFERENCES EXPSCHEME(expScheme_ID),-- FK FOREIGN KEY (resInstance_ID) REFERENCES RESINSTANCE(resInstance_ID)-- FK ); CREATE INDEX experiment_name ON EXPERIMENT(name); CREATE TABLE IF NOT EXISTS ADNOTATION ( adnotation_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), content VARCHAR(200), experiment_ID INTEGER, FOREIGN KEY (experiment_ID) REFERENCES EXPERIMENT(experiment_ID) ); CREATE INDEX adnotation_name ON ADNOTATION(name); CREATE TABLE IF NOT EXISTS ATTACHMENT ( attachment_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), content VARCHAR(200), experiment_ID INTEGER, FOREIGN KEY (experiment_ID) REFERENCES EXPERIMENT(experiment_ID) ); CREATE INDEX attachment_name ON ATTACHMENT(name); CREATE TABLE IF NOT EXISTS LABBOARD ( board_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, sizeX INTEGER NOT NULL, sizeY INTEGER NOT NULL, experiment_ID INTEGER, state_ID INTEGER, FOREIGN KEY (experiment_ID) REFERENCES EXPERIMENT(experiment_ID), FOREIGN KEY (state_ID) REFERENCES BOARDSTATE(state_ID) ); CREATE TABLE IF NOT EXISTS SAMPLE ( sample_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, description VARCHAR(200), isOnBoard BOOLEAN, experiment_ID INTEGER, FOREIGN KEY (experiment_ID) REFERENCES EXPERIMENT(experiment_ID) ); CREATE TABLE IF NOT EXISTS PLACEONBOARD ( place_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, placeX INTEGER, placeY INTEGER, board_ID INTEGER, sample_ID INTEGER, FOREIGN KEY (board_ID) REFERENCES LABBOARD(board_ID), FOREIGN KEY (sample_ID) REFERENCES SAMPLE(sample_ID) ); CREATE TABLE IF NOT EXISTS BOARDSTATE ( state_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, board_state_enum ENUM('przetwarzanie','oczekiwanie', 'wykonane') ); CREATE TABLE IF NOT EXISTS RESINSTANCE ( resInstance_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, resTemplate_ID INTEGER, FOREIGN KEY (resTemplate_ID) REFERENCES RESTEMPLATE(resTemplate_ID) ); CREATE TABLE IF NOT EXISTS RESTEMPLATE ( resTemplate_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, description VARCHAR(200) ); CREATE TABLE IF NOT EXISTS EXPSCHEME ( expScheme_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), description VARCHAR(200), resTemplate_ID INTEGER, resGroup_ID INTEGER, FOREIGN KEY (resTemplate_ID)REFERENCES RESTEMPLATE(resTemplate_ID), FOREIGN KEY (resGroup_ID)REFERENCES RESGROUP(resGroup_ID) ); CREATE INDEX expScheme_name ON EXPSCHEME(name); CREATE TABLE IF NOT EXISTS RESGROUP( resGroup_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY ); CREATE TABLE IF NOT EXISTS RESULT_ ( result_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, resNumber INTEGER, description VARCHAR(200), resGroup_ID INTEGER, expScheme_ID INTEGER, FOREIGN KEY (resGroup_ID) REFERENCES RESGROUP(resGroup_ID), FOREIGN KEY (expScheme_ID) REFERENCES EXPSCHEME(expScheme_ID) ); </code> ======Słowniki danych ====== **Administrator / LabGeek (laborant) / Client** * login- nazwa użytkownika - łańcuch maksymalnie 20 znaków, * surname - nazwisko - łańcuch maksymalnie 30 znaków, * name - imię - łańcuch maksymalnie 30 znaków, * password - hasło - łańcuch, minimalnie 8, maksymalnie 30 znaków. **Experiment** * name - nazwa eksperymentu - łańcuch maksymalnie 50 znaków, * description - opis eksperymentu - łańcuch maksymalnie 200 znaków. **Adnotatation** * name - tytuł - łańcuch maksymalnie 30 znaków, * content - zawartość tekstowa -łańcuch znaków, **Attachment** * name - nazwa załącznika - łańcuch maksymalnie 30 znaków, * content - zawartość - łańcuch znaków, **Labboard** - płytka laboratoryjna * sizeX - szerokość - liczba typu integer, * sizeY - wysokość - liczba typu integer, **PlaceOnBoard** * placeX - położenie na płytce na osi x - liczba typu integer, * placeY - położenie na płytce na osi y - liczba typu integer, **Sample** - próbka * description - opis - łańcuch maksymalnie 200 znaków, * isOnBoard - flaga, czy aktualnie próbka jest umieszczona na jakiejś płytce - boolean, **Expscheme** - ramowy schemat eksperymentu, używany przy tworzeniu drzewa decyzyjnego * name - nazwa - łańcuch maksymalnie 30 znaków, * description - opis - łańcuch maksymalnie 200 znaków, * next_expscheme - id nastepnego sugerowanego eksperymentu **Result** - wynik * resNumber - wynik przedstawiony numerycznie- INTEGER, * description - opis - łańcuch maksymalnie 200 znaków, **BoardState** * board_state_enum - etap przetwarzania, na którym znajduje się płytka - zmienna wyliczeniowa('przetwarzanie','oczekiwanie', 'wykonane') ====== Analiza zależności funkcyjnych i normalizacja tabel ====== * Pierwsza postać normalna 1NF: wszystkie dane są atomiczne. Warunek spełniony. * Druga postać normalna 2NF: wszystkie atrybuty niekluczowe są w pełni funkcjonalnie zależne od klucza głównego danej tabeli. Warunek spełniony. * Trzecia postać normalna 3NF: wszystkie atrybuty niekluczowe są bezpośrednio zależne od klucza głównego danej tabeli. Warunek spełniony. ====== Projektowanie operacji na danych ====== === Dodanie administratora: === <code sql> INSERT INTO ADMINISTRATOR (login, surname, name, password) VALUES ('andrzejA', 'M', 'Andrzej', 'andrzej12345'); </code> === Dodanie laboranta: === <code sql> INSERT INTO LABGEEK (login, surname, name, password) VALUES ('andrzejL', 'M', 'Andrzej', 'andrzej12345'), </code> ===Dodanie klienta:=== <code sql> INSERT INTO CLIENT (login, surname, name, password) VALUES ('andrzejK', 'M', 'Andrzej', 'andrzej12345'), </code> ===Zmiana imienia i nazwiska klienta o danym id i haśle === <code sql> UPDATE CLIENT SET surname='Melua', name='Katie' WHERE client_ID = 15 AND password='sprzedamopla'; </code> ===Dodanie eksperymentu:=== <code sql> INSERT INTO EXPERIMENT (name, description, result_ID, labGeek_ID, expScheme_ID, resInstance_ID) VALUES ('exp1', 'exp1descr', 1, 1,1,1); </code> === Dodanie klienta jako obserwatora eksperymentu === <code sql> INSERT INTO ENTITY1 (client_ID, experiment_ID) VALUES (1,1); </code> === Dodanie adnotacji === <code sql> INSERT INTO ADNOTATION (name, content, experiment_ID) VALUES ('adn1', 'adn', 1); </code> ===Dodanie załącznika:=== <code sql> INSERT INTO ATTACHMENT (name, content, experiment_ID) VALUES ('att1', 'adn', 1); </code> ===Dodanie płytki laboratoryjnej:=== <code sql> INSERT INTO LABBOARD (sizeX, sizeY, experiment_ID, state_ID) VALUES (50, 50, 1, 1); </code> ===Dodanie próbki:=== <code sql> INSERT INTO SAMPLE (description, isOnBoard, experiment_ID) VALUES ('a', 't',1); </code> ===Dodanie próbki do określonej płytki laboratoryjnej:=== <code sql> INSERT INTO PLACEONBOARD(placeX, placeY, board_ID, sample_ID) VALUES (1,1,1,1); </code> ===Dodanie schematu badania:=== <code sql> INSERT INTO EXPSCHEME (name, description, resTemplate_ID, resGroup_ID) VALUES ('n1','d',1,1); </code> ===Dodanie wyniku:=== <code sql> INSERT INTO RESULT_ (resNumber, description, resGroup_ID, expScheme_ID) VALUES (1,'d',1,1); </code> ===Edycja współrzędnych próbki=== <code sql> UPDATE PLACEONBOARD SET placeX = 7, placeY = 5 WHERE place_ID = 144; </code> ===Usunięcie załącznika=== <code sql> DELETE FROM ATTACHMENT WHERE id = 100; </code>
pl/dydaktyka/sbd/2012/projekty/lab/projekt_logiczny.txt
· ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
Pokaż stronę
Poprzednie wersje
Menadżer multimediów
Do góry