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


Tablica Krzyżowa

Projekt bazy w języku 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)
);

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:

 INSERT INTO ADMINISTRATOR (login, surname, name, password) 
					VALUES 	('andrzejA', 'M', 'Andrzej', 'andrzej12345');

Dodanie laboranta:

INSERT INTO LABGEEK (login, surname, name, password) 
             VALUES ('andrzejL', 'M', 'Andrzej', 'andrzej12345'), 

Dodanie klienta:

INSERT INTO CLIENT (login, surname, name, password) 
             VALUES ('andrzejK', 'M', 'Andrzej', 'andrzej12345'),

Zmiana imienia i nazwiska klienta o danym id i haśle

UPDATE CLIENT SET surname='Melua', name='Katie' WHERE client_ID = 15 AND password='sprzedamopla';

Dodanie eksperymentu:

INSERT INTO EXPERIMENT (name, description, result_ID, labGeek_ID, expScheme_ID, resInstance_ID) 
             VALUES ('exp1', 'exp1descr', 1, 1,1,1);

Dodanie klienta jako obserwatora eksperymentu

INSERT INTO ENTITY1	(client_ID, experiment_ID) 
			VALUES	(1,1);

Dodanie adnotacji

INSERT INTO ADNOTATION (name, content, experiment_ID) 
             VALUES ('adn1', 'adn', 1);

Dodanie załącznika:

INSERT INTO ATTACHMENT (name, content, experiment_ID) 
             VALUES ('att1', 'adn', 1);

Dodanie płytki laboratoryjnej:

INSERT INTO LABBOARD (sizeX, sizeY, experiment_ID, state_ID)  
		VALUES	(50, 50, 1, 1);

Dodanie próbki:

INSERT INTO SAMPLE (description, isOnBoard, experiment_ID)
			VALUES 	('a', 't',1);

Dodanie próbki do określonej płytki laboratoryjnej:

INSERT INTO PLACEONBOARD(placeX, placeY, board_ID, sample_ID)
				VALUES	(1,1,1,1);

Dodanie schematu badania:

INSERT INTO EXPSCHEME (name, description, resTemplate_ID, resGroup_ID)
				VALUES	('n1','d',1,1);

Dodanie wyniku:

INSERT INTO RESULT_ (resNumber, description, resGroup_ID, expScheme_ID)
			VALUES	(1,'d',1,1);

Edycja współrzędnych próbki

UPDATE PLACEONBOARD SET placeX = 7, placeY = 5 WHERE place_ID = 144; 

Usunięcie załącznika

DELETE FROM ATTACHMENT WHERE id = 100;
pl/dydaktyka/sbd/2012/projekty/lab/projekt_logiczny.txt · ostatnio zmienione: 2019/06/27 15:50 (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