====== Projekt logiczny ====== ===== -. Projekt tabel, kluczy, kluczy obcych, powiązań między tabelami, indeksów w oparciu o zdefiniowany diagram ERD ===== === Diagram ERD === {{:pl:dydaktyka:sbd:2009:projekty:mpk-gis:bazy_mpk_gis.jpeg|}} Projekt bazy danych w języku SQL: CREATE TABLE Stops ( id SERIAL , name varchar(40) UNIQUE NOT NULL, time smallint DEFAULT 0 ,PRIMARY KEY (id) ); CREATE TABLE Small_Stops (id SERIAL, id_stop smallint REFERENCES stops (id), add_information varchar (40), PRIMARY KEY (id)); SELECT AddGeometryColumn('', 'small_stops', 'coordinate', -1, 'POINT', 2); CREATE TABLE Lines (id SERIAL, num Smallint NOT NULL, start_stop Smallint REFERENCES small_stops (id), end_stop Integer REFERENCES small_stops (id), toward BIT(1), PRIMARY KEY (id)); CREATE INDEX num_idx ON lines ( num ); CREATE TABLE Stop_Lines (id serial,id_line Integer REFERENCES lines (id), stop_id Integer REFERENCES small_stops (id), next Integer REFERENCES small_stops (id),PRIMARY KEY (id)); CREATE INDEX id_line_idx ON stop_lines ( id_line ); CREATE TABLE Ways (id_way Smallint NOT NULL UNIQUE, PRIMARY KEY (id_way) ); SELECT AddGeometryColumn('', 'way','line',-1,'LINESTRING',2); CREATE TABLE Route_Lines (id SERIAL, id_line Integer REFERENCES lines (id), id_way Integer REFERENCES ways (id_way), next Integer REFERENCES ways (id_way), PRIMARY KEY (id)); CREATE INDEX id_line_idx2 ON route_lines ( id_line ); ===== -. Słowniki danych ===== **stops** * id - klucz podstawowym, liczba z zakresu integer, unikalna, samoczynnie zwiększająca się * name - nazwa przystanku, wartość tekstowa o długości do 40 znaków, unikalna **small_stops** * id - klucz podstawowy, liczba z zakresu integer, unikalna, samoczynnie zwiększająca się * id_stop - klucz wskazujący na wiersz w tabeli stop, liczba z zakresu integer * add_information - dodatkowe informacje o przystanku, wartość tekstowa o długości do 40 znaków **lines** * id - klucz podstawowy, liczba z zakresu integer, unikalna, samoczynnie zwiększająca się * id_line - klucz wskazujący na wiersz w tabeli line, liczba z zakresu integer, wartość niepusta * start_stop - klucz wskazujący na przystanek początkowy linii, liczba z zakresu integer * toward - kierunek w którym poruszają się pojazdy * end_stop - klucz wskazujący na przystanek końcowy linii, liczba z zakresu integer **stop_lines** * id - klucz podstawowy, liczba z zakresu integer, unikalna, samoczynnie zwiększająca się * stop_id - identyfikator przystanku, klucz wskazujący na wiersz w tabeli small_stop, liczba z zakresu integer * id_line - identyfikator linii, klucz wskazujący na wiersz w tabeli line, liczba z zakresu integer * next - identyfikator kolejnego przystanku, klucz wskazujący na wiersz w tabeli small_stop, liczba z zakresu integer **ways** * id_way - klucz podstawowy, liczba z zakresu integer, wartość unikalna, niepusta, samoczynnie zwiększająca się **route_lines** * id - klucz podstawowy, liczba z zakresu integer, unikalna, samoczynnie zwiększająca się * id_line - identyfikator linii, klucz wskazujący na wiersz w tabeli line, liczba z zakresu integer * id_way - identyfikator kolejnego odcinka trasy, klucz wskazujący na wiersz w tabeli way, liczba z zakresu integer * next - identyfikator kolejnego przystanku, klucz wskazujący na wiersz w tabeli way, liczba z zakresu integer ===== -. Analiza zależności funkcyjnych i normalizacja tabel ===== Stworzony przez nas schemat bazy danych spełnia warunki postaci normalnej (1NF, 2NF, 3NF). Dane są atomiczne i nie występuje redundancja. Używamy tylko kluczy jednoargumentowych. ===== -. Projektowanie operacji na danych ===== === Stops === Dodawanie przystanku: "INSERT INTO stops (name) VALUES ('".$name."')" Usunięcie przystanku: "DELETE FROM stops WHERE id=$ID" Uaktualnie rekordu: "UPDATE stops SET name='".$new_name."' WHERE id=$id" === Small_Stops === Pobranie współrzędnych punktów: "SELECT ST_AsText(coordinate) AS coordinate FROM small_stops WHERE id=$id" Dodanie nowego przystanku: "INSERT INTO small_stops (id_stop,add_information, coordinate) VALUES ($id,'".$add_information."',ST_GeomFromText('".$point."'))" Uaktualnie rekordu: "UPDATE small_stops SET add_information='".$add_information_update."',id_stop=$id_stop_update, coordinate=ST_GeomFromText('".$new_coordinate."', -1) WHERE id=$id" Wyszukiwanie przystanków w obrębie danego punktu: SELECT * FROM small_stops WHERE ST_DWithin(coordinate, 'POINT(1000 1000)', 100.0); === Ways === Dodanie nowej drogi: "INSERT INTO way (id_way,line) VALUES($id_way, ST_GeomFromText('LINESTRING $this->to_add ',-1))" Uaktualnie rekordu: "UPDATE way SET line= ST_GeomFromText('LINESTRING $this->to_add',-1) WHERE id_way=$id_way"