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