Professional Documents
Culture Documents
Huongnt DH
Huongnt DH
LI NI U
Ngy nay, cng vi s pht trin ca x hi, ngnh CNTT cng c nhiu bc pht
trin ng k v dn i vo cuc sng ca mi ngi v c s dng hu ht trong tt
c cc ngnh ngh trong x hi. Vi s lng ti liu trong cc c quan, t chc tng theo
cp s nhn theo tng nm, tng thi k, th vic lu tr s lng ti liu tr nn v
cng kh khn, c bit khi n l nhng ti liu quan trng m li c lu tr trn cc
thit b cng. Yu t thi gian, cc tc ng bn ngoi c th lm cho nhng ti liu b
hng hc, kh bo qun. Do , nhu cu s dng cc phn mm h tr kh nng lu tr
cc d liu m bo cc yu t an ton v tin li trong thao tc vi d liu l v cng
cn thit. V nhu cu s tr nn d dng khi c s vo cuc ca CNTT, c bit l cc
h qun tr c s d liu (CSDL).
Ni n CNTT th khng th khng ni n cc h qun tr c s d liu. l phn
mm hay h thng c thit k qun tr mt CSDL, n h tr kh nng lu tr, sa
cha, xa v tm kim trong tin trong mt CSDL. V c rt nhiu loi h qun tr CSDL
khc nhau : t phn mm nh chy trn my tnh c nhn cho n nhng h qun tr phc
tp chy trn mt hoc nhiu siu my tnh. Chng ta c th k ti cc h qun tr CSDL
nh: MySQL, Oracle, SQL Server, PostgreSQLv mi loi trn c nhng tnh nng, li
ch ring.
c bit, h qun tr CSDL postgreSQL c nhng tnh nng v li th hn hn cc
h qun tr CSDL khc. PostgreSQL l s la chn s dng ca nhiu ngi v n c
nhiu u im ni tri so vi cc h qun tr CSDL khc. Th nht, PostgreSQL l phn
mm m ngun m, min ph hon ton trong s dng. Th hai, hiu sut lm vic ca
PostgreSQL chnh lch so vi cc h qun tr khc trong sai s +/-10%. Th ba, y l h
qun tr c tin cy cao, bng chng l qu trnh pht trin ca n. Th t, PostgreSQL
cn c th chy c trn rt nhiu h iu hnh khc nhau nh Window, Linux, Unix,
MacOSXV cui cng, mt tnh nng ni tri ca PostgreSQL l kh nng m rng
hm, kiu d liu, ton tngi s dng c th t nh ngha hm, kiu d liu, kiu
ton tv c th thm nhng kiu d liu, ton tvo h qun tr CSDL PostgreSQL.
Ngoi ra, do ngoi nhu cu lu tr cc kiu d liu thng thng nh kiu chui,
kiu s, kiu ngy thng, ngi s dng cn c thm nhu cu lu tr cc kiu d liu
khng gian lu tr cc i tng nh Point, Line, Polygon. Do , PostgreSQL cn h
Th nht, nghin cu v CSDL khng gian, qua , gip chng ta c ci nhn tng
quan v CSDL khng gian,
Th hai, tm hiu tng quan v h qun tr PostgreSQL, qua , chng ta c th bit
c u, nhc im ca h qun tr ny so vi cc h qun tr CSDL khc. Ngoi ra,
phn gii thiu v giao din tng tc gip ch cho vic thao tc vi h qun tr
PostgreSQL c d dng
Th ba, PostGIS l cng c m rng cho PostgreSQL, n gip PostgreSQL lu tr,
thao tc c vi CSDL khng gian. Chng ti c gii thiu v cch to CSDL khng
gian, cch load d liu khng gian c sn vo CSDL. Ngoi ra, chng ti cn cung cp
danh sch cc nhm hm m PostGIS h tr sn, lm cng c cho vic thc hin truy vn
trong khng gian.
V cui cng, chng ti c a ra ni dung v cch to m rng hm, m rng kiu
d liu, m rng kiu ton t v m rng hm tp hp cho h qun tr CSDL PostgreSQL.
T ngi dng bit cch to phn m rng cho PostgreSQL cho mc ch s dng ca
mnh.
10
11
2.1.1. nh ngha
Vo nm 1986, gio s i hc California Berkeley v chuyn gia cng ngh v
c s d liu Michael Stonebraker a ra vn l phi xy dng h thng c s d
liu tt hn. Mc d c nhng thnh cng vi d n c s d liu trc , do
INGRES nghin cu ra, Stonebraker quyt nh pht trin ln da trn nn tng c.
V kt qu ca s pht trin l Postgres.
Trong 8 nm tip , POSTGRES pht trin mt cch ph bin, c bit l trong
cng ng nghin cu. Qua mt qu trnh pht trin lu di, bn PostgreSQL 6.0 c
chnh thc ra i n da trn nn tng ca POSTGRES trc v thm vo cc thc thi
SQL. Ngy nay, PostgreSQL l mt trong nhng d n ngun m ph bin nht trn
Internet.
PostgreSQL l h thng qun tr c s d liu quan h i tng da trn
POSTGRES bn 4.2, c pht trin ti trng i hc California ti phng nghin cu
my tnh Berkeley. [1]. N l mt chng trnh m ngun m xy dng trn m ngun
ban u ca i hc Berkeley. N h tr mt phn rt ln cho SQL chun v cung cp
nhiu tnh nng hin i nh :
Cc truy vn phc tp
Kha ngoi
Trigger
Khung nhn
Tnh ton vn ca cc giao dch
Kim tra truy cp ng thi a phin bn.
Ngoi ra, PostgreSQL c th c m rng bi nhiu ngi dng bng nhiu cch,
v d, ngi dng c th thm kiu d liu, hm, ton t, hm tp hp, phng thc nh
ch mc v ngn ng th tc.
2.1.2. So snh PostgreSQL vi mt s h c s qun tr d liu khc
12
b. Cc tnh nng c bn
Bng 2-2 : So snh v cc tnh nng c bn.
d. Ch mc
13
e. Cc i tng khc
Bng 2-5 : So snh v cc i tng khc
14
PostgreSQL cung cp nhiu kiu d liu. Bn cnh kiu d liu numeric, string
thng thng, n cn cung cp kiu d liu geometry, boolean v kiu d liu
c thit kt c bit dng cho cc a ch mng.
Kh nng m rng l mt trong nhng tnh nng ca PostgreSQL l n c th
c m rng. Nu vi nhng g m PostgreSQL cung cp m bn vn cha hi
lng, bn c th thm vo PostgreSQL nhng g ca bn. V d, bn c th thm
vo kiu d liu mi, hm v ton t mi v cc th tc mi.
2.1.3. Qun tr c s d liu qua giao din
psql
Kiu giao din chnh thao tc c s d liu ca PostgreSQL l chng trnh dng
lnh psql. Nh chng trnh dng lnh ny, ngi dng c th thc hin truy vn SQL
mt cch trc tip, v thc thi chng t tp tin. Hn na, psql cn cung cp mt s lng
ln cc ty chn lnh , to iu kin tt vit cc cu lnh truy vn v t ng ha nhiu
nhim v.
Cu trc lnh : psql [option...][dbname [username]]
Bng 2-6 : Danh sch cc ty chn ca lnh psql
Ty chn
Gii thch
-c COMMAND
-d NAME
-f NAME
-h HOSTNAME
Ch ra HOSTNAME
--help
-l
15
-p PORT
Ch ra cng kt ni CSDL. Mc nh l
5432
-U NAME
a. Kt ni n CSDL
Thao tc kt ni n CSDL l thao tc u tin cn phi lm trc khi thc hin cc
thao tc khc vi psql. kt ni n CSDL, yu cu bit tn CSDL, a ch host v cng
ca my ch v tn ngi dng m bn mun kt ni. psql cung cp cc tham s cho vic
thao tc kt ni : -d (tn CSDL), -h (a ch host), -p (a ch cng), -U (tn ngi dng).
Nu khng th cung cp y cc thng tin trn, th yu cu ti thiu nht l bn cn
phi cung cp thng tin v CSDL v tn ngi dng. l yu cu ti thiu kt ni
n CSDL.
V d n gin, kt ni n CSDL c tn l testdb, tn ngi dng l postgres
%>psql d testdb U postgres
Welcome to psql 8.1.20, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
testdb=>
theo di cc ty chn trn, \h lit k tt c cc cu lnh SQL m psql c h tr, ty chn
\? Lit k tt c cc lnh psql, \q ngt kt ni.
b. Lnh trong psql
Nh ni trn, lit k tt c cc cu lnh thao tc trong psql, chng ta s dng
ty chn \?. Vi ty chn \?, kt qu l mt danh sch ca hn 50 lnh v c chia
thnh 6 nhm. Bn di l danh sch cc lnh v cc nhm tng ng :
16
Tn lnh
\c [DBNAME]
Kt ni n c s d liu
\cd [DIR]
\q
\h
Tn lnh
\e [FILE]
\p
\g [FILE]
Gi truy vn b m n my ch v kt qu ra file
\r
Reset li truy vn
\s [FILE]
\w [FILE]
17
Tn lnh
\o [FILE]
Tn lnh
\d [NAME]
Lit k cc hm tp hp
\db
Lit k tt c cc tablespace
\dc
\df
\l
Tn lnh
18
\a
Cn ln
\c [STRING]
\f [STRING]
Tuy nhin, trong khun kh ti liu ny, chng ti ch a ra cc lnh c coi l thng
xuyn s dng trong qu trnh thao tc vi psql.
c. Kt ni n CSDL mi
Trong sut qu trnh thao tc, c th bn cn phi lm vic vi nhiu hn mt
CSDL. Do vy, thay i CSDL n CSDL mi, chng ta c th thao tc vi ty
chn\connect hoc \c theo c php sau : \connect [tn c s d liu mi]
VD : testdb=> \connect postgresdb
d. Thc thi dng lnh c nh v trong mt file xc nh
Vic thao tc vi nhng dng lnh nhiu ln c th gy nhm chn cho ngi dng,
i khi cn gy ra li khng mong mun. C mt cch rt n gin, chng ta c th lu
nhng dng lnh thng xuyn c s dng vo mt file ring bit, sau , khi mun
thc hin, chng ta ch cn gi file bng ty chn \i theo c php sau :
\i [tn file .sql]
VD : testdb=> \i audit.sql
e. Chnh sa file
Cc dng file ni trn c nhim v lu nhng dng lnh thng xuyn c s
dng khng phi lc no cng chnh xc vi nhng g bn mong mun. thc hin sa
i file ngay ti giao din ca psql, chng ta ch cn s dng ty chn \e chnh
sa file theo c php sau :
\e [tn file .sql]
VD : testdb=> \e audit.sql
f. Lu kt qu truy vn vo file
19
ABORT
CREATE LANGUAGE
DROPVIEW
ALTER AGGREGATE
CREATE OPERATOR
CLASS
END
ALTER CONVERSION
CREATE OPERATOR
EXECUTE
ALTER DATABASE
CREATE ROLE
EXPLAIN
ALTER DOMAIN
CREATE RULE
FETCH
ALTER FUNCTION
CREATE SCHEMA
GRANT
ALTER GROUP
CREATE SEQUENCE
INSERT
ALTER LANGUAGE
CREATE TABLE
LISTEN
ALTER INDEX
CREATE TABLE AS
LOAD
ALTER OPERATOR
CLASS
CREATE TABLESPACE
LOCK
ALTER OPERATOR
CREATE TRIGGER
MOVE
ALTER ROLE
CREATE TYPE
NOTIFY
20
ALTER SCHEMA
CREATE USER
PREPARE
ALTER TABLE
DEALLOCATE
REINDEX
ALTER TABLESPACE
DECLARE
RELEASE SAVEPOINT
ALTER TRIGGER
DELETE
RESET
ALTER TYPE
DROP AGGREGATE
REVOKE
ALTER USER
DROP CAST
ROLLBACK
ANALYZE
DROP CONVERSION
ROLLBACK PREPARED
BEGIN
DROP DATABASE
ROLLBACK TO
SAVEPOINT
CHECKPOINT
DROP DOMAIN
SAVEPOINT
CLOSE
DROP FUNCTION
SELECT
CLUSE
DROP GROUP
SELECT INTO
COMMENT
DROP INDEX
SET
COMMIT
DROP LANGUAGE
SET CONSTRAINTS
COMMIT PREPARED
DROP OPERATOR
CLASS
SET ROLE
COPY
DROP OPERATOR
SET SESSION
AUTHORIZATION
CREAT AGGREGATE
DROP ROLE
SET TRANSACTION
CREATE CAST
DROP RULE
SHOW
CREATE CONSTRAINT
DROP SCHEMA
START TRANSACTION
21
TRIGGER
CREATE CONVERSION
DROP SEQUENCE
TRUNCATE
CREATE DATABASE
DROP TABLE
UNLISTEN
CREATE DOMAIN
DROP TABLESPACE
UPDATE
CREATE FUNCTION
DROP TRIGGER
VACUUM
CREATE GROUP
DROP TYPE
CREATE INDEX
DROP USER
Quan st bng 2-12 ta thy rng, h thng h tr rt nhiu lnh, tuy nhin, trong
khun kh kha lun ny, ti ch s dng cc lnh thng dng nh SELECT, INSERT
INTO, CREATE TABLE, DROP TABLE tm hiu k hn v mt lnh c th,
chng ta thc thi lnh theo c php \h [lnh]. V d, hiu hn v lnh INSERT, thc
thi lnh :
corporate=> \h INSERT
22
Tm li, psql l cng c qun l v thao tc vi c s d liu thng qua giao din
dng lnh. N h tr nhiu tnh nng, t vic to, sao lu cc cu lnh truy vn n vic
chnh sa file d liu, h tr vic thao tc vi c s d liu bng vic cung cp nhiu lnh
SQL.
pgAdmin
pgAdmin min ph v l cng c qun l giao din ha m ngun m cho
PostgreSQL, l c s d liu m ngun m cao cp nht trn th gii. N c th dng trn
Linux, FreeBSD, Solaris, Mac OSX v Window.
pgAdmin c thit kt p ng nhu cu ca tt c ngi dng, t vic vit truy
vn n gin pht trin c s d liu phc tp. Giao din ha h tr tt c cc tnh
nng ca PostgreSQL v lm cho vic qun tr d dng. ng dng ny cng bao gm b
son tho c php SQL, b son tho m server-side.
2.2. PostGIS
2.2.1. Gii thiu v PostGIS
PostGIS l g?
PostGIS c Refraction Research Inc pht trin, nh mt d n nghin cu cng
ngh CSDL khng gian. PostGIS h tr i tng a l cho CSDL i tng quan h
PostgreSQL. PostGIS kch hot kh nng khng gian cho PostgreSQL, cho php
PostgreSQL s dng nh mt CSDL khng gian ph tr cho cc h thng thng tin a l
(GIS).
c im ca PostGIS :
Do PostGIS c s dng nh mt CSDL khng gian, nn n bao gm tt c cc
c im ca CSDL khng gian c nu ra mc 1.1.2. Ngoi ra, n cn c nhng c
trng nh :
+ Cc kiu d hnh hc nh Point, Linestring, Polygon, Multipoint, multilinestring,
Multipolygons v Geometrycollection. Cc kiu d liu hnh hc ny c lu tr
nh nhng i tng hnh hc.
+ Cc ton t khng gian cho php xc nh cc php o khng gian a l nh
tnh din tch, tnh khong cch, tnh di, v tnh chu vi. PostGIS h tr cc hm
23
Gii thch
-D
-s
-i
24
25
Cch th hai dng load file d liu dng .sql l dng giao din dng lnh psql. V
c l, vic thao tc bng giao din dng lnh psql n gin v nhanh hn i vi cch
thao tc ha pgAdmin III. Chng ta ch cn s dng 1 lnh :
huongnghiem@koinoi: psql U [tn_ngi_dng] f [tn_file.sql] d [tn_CSDL]
2.2.5. Phng php load d liu dng shape file vo CSDL
Shapefile l g?
nh dng shapefile l nh dng d liu khng gian a l vect ph bin cho cc
phn mm GIS.
c im ca shapefile:
+ Mt shapefile c t chc thnh cc tp tin ring r, ti thiu cn c 3 tp tin
vi phn m rng l .shp, .shx, .dbf. v nh dng tp tin shapefile c phn
m rng l .shp.
+ Tp tin c phn m rng dng .shp cha cc thng tin v c im, hnh dng
hnh hc ca i tng. Tp tin c phn m rng dng .shx cha cc thng tin v
th t ca cc i tng. V tp tin c phn m rng dng .dbf cha cc thng
tin v bng d liu thuc tnh ca i tng.
+ Shapefile l mt nh dng lu tr vect s lu tr v tr hnh hc v thng tin
thuc tnh lin quan.
+ Mt shapefile khi hin th trong phn mm GIS c gi l lp d liu. Mi lp
th hin cho mt c tnh hnh hc khng gian ca mt lp i tng cn biu din
gm : POINT, LINE, POLYGON v cc thuc tnh lin quan n cc i tng
.
+ Shapefile l dng n gin v chng lu tr cc kiu d liu hnh hc ban u
nh: LINE, POINT, POLYGON. Cc kiu hnh hc ban u ny c s dng
gii hn m khng c bt k thuc tnh xc nh nhng g chng hin th. V
vy, mt bng trong bn ghi s lu tnh cht / thuc tnh ca mi hnh dng ban
u trong shapefile. Cc hnh dng (LINE, POINT, POLYGON) cng vi cc
thuc tnh d liu c th to ra rt nhiu hin th vi d liu a l.
Cc bc tin hnh
26
+ Trong Window
S dng cng c psql v cng c shp2pgsql load file d liu dng shape (.shp).
Gi s ta cn chuyn i file bc_pubs.shp sang file dng bc_pubs.sql.
B1 : Start -> chn Accessories -> chn Command Prompt
B2 : Chn ng dn n th mc cha cc file nh dng .shp
Trong v d ny, ta chn ng dn : C:\Program Files\PostgreSQL\8.4\bin bng lnh :
cd \Program Files\PostgreSQL\8.4\bin
B3 : S dng cng c shp2pgsql :
C:\Program Files\PostgreSQL\8.4\bin\shp2pgsql
-d i -s 4326 bc_pubs.shp bc_pubs > bc_pubs.sql
B4 : Thc thi ni dung tp tin mi to c (bc_pubs.sql) bng cgn c psql
C:\Program Files\PostgreSQL\8.2\bin\psql.exe
U postgres f bc_pubs d postgis
-U postgres: tn ngi dng l postgres
-f bc_pubs : tn file cn thc thi l bc_pubs.sql
-d postgis: tn c s d liu postgis.
B5 : Refresh pgAdmin III, trong CSDL bn chn, s xut hin bng bc_pubs.
+ Trong Linux
huongnghiem@koinoi:~/data$ shp2pgsql d i s 4326 bc_pubs.shp bc_pubs >
bc_pubs.sql
Shapefile type: Arc
Postgis type: MULTIPOLYGON[2]
huongnghiem@koinoi:~/data$ psql U huongnghiem f bc_pubs.sql d huongnghiem
2.2.6. OpenGIS Well-Know Text
27
28
| Modifiers
29
----------------------+--------------------------------+----------srid
| integer
| not null
auth_name
| character varying(256) |
auth_srid
| integer
|
srtext
| character varying(2048) |
proj4text
| character varying(2048) |
30
31
32
33
34
35
36
ST_Contains()
- Chc nng ca hm ST_Contains l tr v True khi v ch khi khng c im no ca B
nm bn ngoi A, v t nht 1 im bn trong B nm bn trong A.
37
38
ST_Length()
- Chc nng : hm ST_Area tr v din tch ca hnh nu n l POLYGON hoc
MULTIPOLYGON. n v mc nh l m2.
- C php : float ST_Area(gemetry g1);
- V d : Bng d liu bc_voting_area lu tr thng tin ca cc vng tham gia bu c.
Yu cu tnh tng din tch ca tt c cc vng c tham gia bu c c s ngi tham gia
bu c >100?
SELECT Sum(ST_Area(the_geom))/10000 AS hectares
FROM bc_voting_areas
WHERE vtotal > 100;
hectares
-----------------36609425.2114911
(1 row)
ST_Area()
- Chc nng : hm ST_Length() tr v di 2d ca hnh nu chng l LINESTRING
hoc MULTILINESTRING. n v mc nh ca di l meter
- C php : float ST_Length(geometry Linestring);
- V d : Tnh di ca Linestring sau :
SELECT ST_Length(ST_GeomFromText(LINESTRING(743238 2967416,743238
2967450,743265 2967450,743265.625 2967416,743238 2967416),2249));
st_length
--------122.630744000095
ST_Perimeter()
- Chc nng : hm ST_Perimeter tr v chu vi ca hnh nu n c dng Polygon hoc
Multipolygon. n v mc nh l meter.
39
40
41
ST_Buffer() :
- Chc nng ca hm ST_Buffer tr v mt hnh hin th cho tt c cc im m khong
cch ca chng t hnh <= khong cch.
Ty chn buffer_style :
+ quad_segs: s on c s dng xp x vng trn (mc nh l 8).
+ endcap= round|flat|square: kiu kt thc, mc nh l round.
+ joint=round|mitre|bevel: kiu ni, mc nh l round
42
+ mitre_limit : t l gii hn mp
n v ca bn knh c o bng n v ca h thng tham chiu khng gian. u ra
ca hm c th l POINT, MULTIPOINT, LINESTRING, MULTILINESTRING,
POLYGON, MULTIPOLYGON v GEOMETRYCOLLECTION.
- C php : geometry ST_Buffer (geometry g1, float R);
Geometry ST_Buffer(geometry g1, float R, integer num_seg_quater_circle);
Geometry ST_Buffer(geometry g1, float R, text buffer_style_parameters);
- V d :
Quad_segs=8
Quad_segs=2
SELECT ST_Buffer(
ST_GeomFromText(POINT(100, 90)),
50, quad_segs=8);
SELECT ST_Buffer (
ST_GeomFromText(POINT(100,90)), 50,
quad_seds=2);
43
Endcap=round v join=round
Endcap=bevel v join=round
SELECT ST_Buffer(
ST_GeomFromText(LINESTRING(50 50,
150 150, 150 50)), 10, endcap=round
join=round);
SELECT ST_Buffer(
ST_GeomFromText(LINESTRING(50 50,
150 150, 150 50)), 10, endcap=square
join=round);
44
[index_name]
ON
[table_name]
USING GIST
45
46
So snh tng thi gian truy vn trc v sau khi nh ch mc, thy rng, vic
nh ch mc tit kim c rt nhiu thi gian truy vn. Tm li, cng c nh ch
mc gip ch rt nhiu trong qu trnh thc hin truy vn ca h thng. Thi gian m
h thng phi dnh ra thc hin truy vn gim i c mt lng ng k. Tuy nhin,
chng ta ch nn nh ch mc i vi nhng bng, nhng ct thng xuyn c s
dng cho mc ch tm kim d liu.
2.5. Truy vn trong c s d liu khng gian
2.5.1. M t v c s d liu khng gian
Bng bc_pubs
Column |
Type
| Description
---------------------+--------------------------+------------------gid
| integer
| Unique ID
id
| integer
| Unique ID
name
| character varying
| Tn Pub
address
| character varying
| a ch ph
city
| character varying
| Tn thnh ph
province
| character varying
| Qun / huyn
postal
| character varying
| M bu in
the_geom
| geometry
| m t hnh hc (Point)
Bng bc_voting_areas
Column |
Type
| Description
--------------+------------------------+------------------gid
| integer
| Unique ID
m
| character varying | m bu c
id
| character varying | Area ID
riding
| character varying | tn khu vc bu c
region
| character varying | tn vng
number | character varying | s vng tham gia bu c
ndp
| integer
| # of NDP Votes
liberal
| integer
| # of Liberal Votes
47
green
unity
vtotal
vreject
vregist
the_geom
| integer
| integer
| integer
| integer
| integer
| geometry
| # of Green Votes
| # of Unity Votes
| tng phiu
| # of Spoiled Ballots
| # of Registered Voters
| m t hnh hc(Polygon)
Bng bc_roads
Column |
Type
| Description
-------------+------------------------+------------------gid
| integer
| Unique ID
name
| character varying | Road Name
the_geom | geometry
| m t hnh hc (Linestring)
Bng bc_border
Column |
Type
| Description
-------------+------------------------+------------------gid
| integer
| Unique ID
border_id | integer
| border Name
the_geom | geometry
| m t hnh hc (Linestring)
Bng bc_hospitals
Column |
Type
| Description
-------------+-------------------------+------------------gid
| integer
| Unique ID
id
authority
name
the_geom
| integer
| character varying
| character varying
| geometry
| Unique ID
| ngi ng u
| Hospital Name
| m t hnh hc (Point)
48
Bng bc_municipality
Column |
Type
| Description
-------------+------------------------+------------------gid
| integer
| Unique ID
m
| integer
| Unique ID
name
| character varying | City / Town Name
the_geom | geometry
| Location Geometry (Polygon)
2.5.2. Truy vn
S dng nhm hm o lng
S dng hm ST_Area() tnh din tch ca cc thnh ph c trong bng
bc_municipality. Ga tr tr v ca hm ST_Area() l kiu Numeric.
huongnghiem=>SELECT ST_Area( the_geom ) FROM bc_municipality;
VD1 : Tnh din tch ca thnh ph PRINCE GEORGE, tnh theo n v hectar?
SELECT ST_Area(the_geom)/10000 AS hectares
FROM bc_municipality
WHERE name = 'PRINCE GEORGE';
hectares
-----------------32657.9103824927
(1 row)
VD2: Tm ra th c din tch ln nht trong tnh?
SELECT name, ST_Area(the_geom)/10000 AS hectares
FROM bc_municipality
ORDER BY hectares DESC
LIMIT 1;
name | hectares
---------------+-----------------
49
50
57321.7782018048
(1 row))
51
52
53
54
55
56
V d
Hm SQL vi kiu d liu c bn : Cc kiu d liu c bn thng dng nh
integer, float, text, chng thng c dng khai bo kiu cho i s i vi nhng
hm c i s truyn vo, hoc dng khai bo kiu cho gi tr tr v ca hm c hoc
khng c i s.
Vit hm tnh tng ca 2 s nguyn, hm c tn l add_em(integer, integer), c 2
i s kiu integer c truyn vo, gi tr tr v ca hm l kiu integer.
CREATE FUNCTION add_em(integer, integer) RETURNS integer
AS SELECT $1 + $2 LANGUAGE sql;
Truy vn : SELECT add_em(1,2) AS answer;
Kt qu truy vn : answer=3;
Hm SQL s dng kiu d liu hn hp : l kiu d liu do ngi dng nh ngha,
n cng bao hm vic s dng cc kiu d liu c bn cho vic khai bo cc thuc tnh
ca kiu d liu hn hp. Ngha l, khng ch nh ra i s m cn phi ch ra thuc tnh
ca i s .
Vit hm tnh lng gp i ca nhn vin. Hm double_salary(employee) : i s
truyn vo c kiu d liu hn hp employee(name, salary, age, room) (c nh ngha
phn 1.2), gi tr tr v c kiu numeric.
CREATE FUNCTION double_salary(employee) RETURNS numeric
AS SELECT $1.salary * 2 AS salary; LANGUAGE sql;
Truy vn : SELECT name, double_salary(employee.*) FROM employee
WHERE employee.room = point (2,1);
Ch : c php $1.salary . $1 l i s u tin cng l duy nht ca hm
double_salary(employee) v $1.salary l ly thuc tnh salary ca i s truyn vo.
Hm SQL s dng tham s u ra: nu theo c php to hm bng cu lnh SQL c
cha t kha RETURNS dng tr v kiu d liu ca hm. Nhng thay vo s dng t
kha RETURNS chng ta s dng tham s u ra. Theo di v d :
57
58
1 | Joe
| JOE
1 | Joe
1 |
2 | Ed
(2 rows)
59
Kiu C
Abstime
AbsoluteTime
Utils/nabstime.h
Boolean
Bool
Postgres.h
Box
BOX*
Utils/geo_decls.h
Bytea
Bytea*
Postgres.h
char
Char
Character
BpChar*
Postgres.h
cid
CommandId
Postgres.h
Date
DateADT
Utils/date.h
Smallint(int2)
Int2 or int16
Postgres.h
60
Int2vector
Int2vector*
Postgres.h
Integer(int4)
Int4 or int32
Postgres.h
Real(float4)
Float4*
Postgres.h
Float8*
Postgres.h
Interval
Interval*
Utils/timestamp.h
Lseg
LSEG*
Utils/geo_decls.h
Name
Name
Postgres.h
Oid
Oid
Postgres.h
Oidvector
Oidvector*
Postgres.h
Path
PATH*
Utils/geo_decls.h
Point
POINT*
Utils/geo_decls.h
Regproc
Regproc
Postgres.h
Reltime
relaticeTiem
Utils/nabstime.h
Text
Text*
Postgres.h
Tid
ItemPointer
Storage/itemptr.h
Time
timeADT
Utils/date.h
TimeTzADT
Utils/date.h
Timestamp
Timestamps*
Utils/timestamp.h
Tinterval
timeInterval
Utils/nabstime.h
61
Varchar
varChar*
Postgres.h
Xid
TransactionId
Postgres.h
62
63
64
{
int32 arg = PG_GETARG_INT32(0);
PG_RETURN_INT32(arg + 1);
}
kim tra i s truyn vo c phi l ga tr NULL hay khng, chng ta s dng
hm PG_ARGISNULL(n). Nu n=0 ngha l PG_ARGISNULL(0) tr v ng.
Cc k hiu VARDATA, VARSIZE, VARHDRSZ, VARATT_xxx c nh ngha
trong file postgres.h c s dng truy cp cc yu t ca cc kiu bin d liu cu
trc v d nh kiu TEXT. K hiu VARHDRSZ l hng s cha kch thc mt phn c
nh ca kiu d liu cu trc. VARSIZE() tr v kch thc ca ton b kiu d liu cu
trc. VARDATA() th tr v mt con tr n byte u tin ca gi tr TEXT. Chiu di
ca gi tr TEXT s l VARSIZE() VARHDRSZ.
cp pht b nh hoc tr b nh bin ta s dng hm palloc() v pfree(). Palloc()
c chc nng tng t nh malloc() : n dng cp pht s lng byte c yu cu v
tr v con tr n khong khng mi. Hm palloc() c dng nhiu do n ngn chn
c s r r ca b nh, tc l sau khi cp pht b nh cho bin, bin s dng xong
b nh PostgreSQL c th t ng thu hi li b nh, m bo b nh khng b lng
ph. Do vy, chng ta nn s dng hm palloc() v pfree() khi vit hm m rng hn l s
dng hm malloc() v hm free().khng
b. Thao tc bin dch file
Cng vic v cng cn thit theo sau vic vit m C l cng vic bin dch file.
Nh bit, s dng c file vit bng ngn ng C th chng ta cn bin dch chng
thnh file c m rng l .dll nu thao tc trong mi trng Window cn file c m rng
l .so nu thao tc file trong mi trng Linux/Unix. PostgreSQL cung cp vic xy
dng c s cho phn m rng, c gi l PGXS, v th, modul m rng n gin c th
xy dng li mt cch n gin vic ci t server . Lu rng, c s ny khng c dng
cho vic xy dng h thng framework m c th s dng xy dng tt c cc phn
mm giao din cho PostgreSQL;
lm bin dch t file .c sang file .so trong mi trng Linux/Unix chng ta cn
thc hin cc bc sau :
65
C php lnh :
CREATE FUNCTION [tn hm] RETURNS [kiu tr v]
[file .so],[tn hm s dng] LANGUAGE [ngn ng]
AS
Hm m rng c to sau cu lnh trn, cui cng l vic s dng hm. Vic
xy dng hm m rng trong postgreSQL c thc hin mt ln, nhng s c s dng
trong bt c ln khc bi v, sau khi bin dch dng file .so lun tn ti trong th mc
/usr/lib/pgsql/
66
x;
Float4 y;
Float4 z;
}point3d;
a. nh ngha hm input v output trong C
nh dng bn trong, nh dng bn ngoi l gi?
Trc khi tm hiu v cch nh ngha hm nhp v xut trong C, chng ta cn c
nhng hiu bit v nh dng bn trong v nh dng bn ngoi ca gi tr cn nhp.
nh dng bn ngoi ca mt kiu d liu nh ngha xem ngi dng s nhp d
liu nh th no? V gi tr c hin th cho ngi dng bit l g? V c th ni nh
dng ny c s dng tng tc vi ngi dng.
nh dng bn trong ca kiu d liu nh ngha xem gi tr s c hin th bn
trong CSDL nh th no? V d, khi bn nhp vo mt gi tr s : 7218942 th nh dng
ny s c chuyn i t dng chui sang dng 4Byte c gi tr 00 6E 26 FE, v trong
CSDL, gi tr s s c lu dng 4byte . V vy, nh dng bn trong ca kiu d
liu c nh dng bn trong CSDL.
Nhng ti sao li c hai nh dng ny?
Nh bit, mi ngn ng lp trnh s cung cp nhng kiu d liu ring, v ngi
lp trnh cng ch hiu v s dng nhng kiu d liu thng qua dng hin th bn
ngoi (c th hiu l nh dng bn ngoi). V d, trong ngn ng lp trnh C c nh
ngha kiu d liu Int, n c th lu tr s nguyn c min xc nh trong b bin dch
ca ngn ng ny. Khi s dng kiu d liu int, ngi lp trnh ch c ci nhn v kiu d
67
liu ny nh : phm vi biu din l [-32768, 32767] v kch thc l 2byte. V khi nhp
d liu kiu int cho cc thao tc nh cng, tr, nhn, chia, ngi lp trnh ch cn nhp
dng s nh 2+3 m khng cn quan tm b bin dch C s x l th no i vi nhng
s nhp vo. Mt khc b bin dch C cng c th hiu c cc php thao tc nh
cng, tr, nhn, chia cc gi tr s nguyn. Tuy nhin, cng vic ca b bin dch C l cn
a ra cc m cn thit thc hin cc php tnh s hc , v cc m c th coi l
nh dng bn trong ca gi tr.
Sau khi nh ngha kiu d liu, vic cn lm l nh ngha hm u vo v hm
u ra trong C. Mc ch ca cng vic ny chnh l xc nh nh dng bn ngoi ca
kiu d liu s nh th no?
V d nh, nh ngha kiu d liu Complex theo c php :
Typedef struct Complex {
Double x;
Double y;
} Complex;
Ta c, chui hin th bn ngoi ca kiu d liu dng (x,y).
c c dng hin th bn ngoi nh trn, chng ta cn to ra hm u vo v
u ra cho kiu Complex. Cc hm u vo v u ra thng thng khng kh vit,
c bit l hm u ra. Nhng, khi nh ngha chui hin th bn ngoi ca kiu d liu,
bn cn phi xc nh v phn tch c php c a ra trong hm u vo.
Theo di hm u vo :
PG_FUNCTION_INFO_V1(complex_in);
Datum complex_in(PG_FUNCTION_ARGS)
{
char *str = PG_GETARG_CSTRING(0);
double x,
y;
Complex *result;
68
69
PG_RETURN_CSTRING(result);
}
i vi hm u ra, kiu tr v ca hm l kiu chui, c nhim v ch ra cch hin
th ca kiu d liu i vi ngi dng. V d, hin th ca kiu Complex vi ngi dng
s c dng (a, b).
Tm li, vic to ra hm u vo v u ra cho kiu d liu rt quan trng trong vic
hin th nh dng ca chng ra bn ngoi vi ngi dng. Nh vo chng m ngi dng
c th d dng hiu c kiu d liu cn phi c cc yu t no v c hin th nh
th no?
b. S dng cu lnh SQL to hm
Nu nh phn trc chng ta c cp n cch m rng hm s dng ngn ng
truy vn SQL v c php lnh c dng l CREATE FUNCTION. Th trong phn ny,
c php lnh cng s c dng to hm. Sau khi bin dch file .c thnh dng file
.so, h thng c th nhn bit v np hm th cn thit c bc to hm theo c php :
CREATE FUNCTION [tn_hm] RETURNS [kiu_d_liu]
AS [tn_file](thng thng s l file c nh dng .so),
[tn_hm](thng l trng vi tn hm khai bo trc)
LANGUAGE C IMUMTABLE STRICT;
VD : to ra 2 hm complex_in v complex_out
CREATE FUNCTION complex_in(cstring) RETURNS complex
AS complex.so, //tn file c bin dch t file
//complex.c
complex_in //tn hm
LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION complex_out(complex) ETURNS cstring
AS complex.so, complex_out
LANGUAGE C IMMUTABLE STRICT;
70
71
72
Datum complex_add(PG_FUNCTION_ARGS)
{
Complex *complex1=(Complex *)PG_GETARG_P(0);
Complex *complex2=(Complex *)PG_GETARG_P(1);
Complex*complex3=(Complex *)palloc (sizeof(Complex)) ;
complex3->x=complex1->x + complex2->x ;
complex3->y=complex1->y + complex2->y ;
PG_RETURN_POINTER(complex3);
}
CREATE OPERATOR +(
LEFTARG=Complex,
RIGHTARG=Complex,
PROCEDURE=complex_add,
COMMUTATOR=+);
3.2.5. Hm tp hp cho ngi dng nh ngha
Nh bit, hm tp hp trong PostgreSQL theo chun SQL ngha l, n c tc
dng x l tt c cc hng c trong mt ct d liu, t hng u tin n hng cui cng
ca ct . V d, vi hm tnh tng theo chun SQL c tn l sum(), khi ngi dng gi
hm ny, tng ng vi vic ngi dng mun tnh tng cc gi tr tt c cc hng
trong mt ct c th no : SELECT sum (price) FROM Price;
Tng t vi cc hm tp hp theo chun SQL, hm tp hp do ngi nh ngha
m rng cho PostgreSQL cng c nhim v tng t l x l tt c cc hng c trong mt
ct d liu, t hng u tin n hng cui cng. to hm tp hp mi, s dng c
php sau :
CREATE AGGREGATE name ( input_data_type [ , ... ] ) (
SFUNC = sfunc,
STYPE = state_data_type
73
[ , INITCOND = initial_condition ]
)
+ name : tn ca hm tp hp to ra.
+ input_data_type : kiu d liu ca tham s khi nhp vo hm.
+ sfunc : tn hm c s dng thc hin mc ch ca hm tp hp. V d, to
hm tp hp thc hin chc nng tnh tng cc d liu kiu point3d, th cn c mt hm
thc hin vic tnh tng trn kiu d liu point3d.
+ initial_condition : thit lp ban u cho gi tr trng thi. Ngha l iu kin ban u
cho kiu d liu c nhp vo hm.
VD : to hm tp hp tnh tng cc s phc
CREATE AGGREGATE sum_complex(Complex)
(
sfunc = complex_add,
Stype = Complex,
Initcond = (0,0)
);
Sau khi hm tp hp c to, n s c s dng nh nhng hm tp hp chun. Tuy
nhin, vi nhng hm tp hp chun, n c th thc thi vi mi kiu d liu chun, cn
hm tp hp do ngi dng nh ngha ch thc thi thi ngi dng truyn ng kiu d
liu cho bin khi s dng hm.
3.3. Vit hm m rng cho PostgreSQL
Bi ton 1 : To kiu d liu im trong khng gian 3 chiu c tn l point3d gm cc
thuc tnh honh (x), tung (y), cao (z).
Xy dng ton t, cng im, tr im. Xy dng hm tnh khong cch gia 2 im, so
snh gia 2 im.
Xy dng hm tp hp, tnh tng cc im c trong bng d liu. Tnh trng tm ca cc
im c trong bng d liu.
74
Thc hin :
Mc ch ca bi ton l xy dng kiu d liu im trong khng gian 3 chiu, trn kiu
d liu ny, ngi dng c th thc hin thao tc cng, tr, nhn, chia 2 im. Hn na,
ngi dng c th tm c trng tm ca cc im trong khng gian 3 chiu.
- To kiu d liu
typedef struct point3d {
float4
x;
float4
y;
float4 z;
} point3d;
- To hm nhp v hm xut
PG_FUNCTION_INFO_V1(point3d_in_test); //hm nhp
Datum point3d_in_test(PG_FUNCTION_ARGS)
{
char *str = PG_GETARG_CSTRING(0);
float4 x,y,z;
point3d *result;
if (sscanf(str, " ( %f , %f, %f )", &x, &y,&z) != 3)
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("invalid input syntax for complex:
\"%s\"",str)));
result = (point3d *) palloc(sizeof(point3d));
result->x = x;
result->y = y;
result->z = z;
75
PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(point3d_out_test); //hm xut
Datum point3d_out_test(PG_FUNCTION_ARGS)
{
point3d *point3D = (point3d *)
PG_GETARG_POINTER(0);
Char *result;
result = (char *) palloc(100);
snprintf(result, 100, "(%g %g %g)", point3D->x,
point3D->y, point3D->z);
PG_RETURN_CSTRING(result);
}
- To hm bng truy vn SQL
CREATE FUNCTION point3d_out_test(point3d) RETURNS cstring
AS 'point3d_test.so','point3d_out_test' LANGUAGE C STRICT
IMMUTABLE;
CREATE FUNCTION point3d_in_test(cstring) RETURNS point3d
AS 'point3d_test.so','point3d_in_test' LANGUAGE C STRICT
IMMUTABLE;
76
- Cng 2 im
PG_FUNCTION_INFO_V1(point3d_add);
Datum point3d_add(PG_FUNCTION_ARGS)
{
point3d *point3d1=(point3d *)PG_GETARG_POINTER(0);
point3d *point3d2=(point3d *)PG_GETARG_POINTER(1);
point3d *point3d3=(point3d *)palloc(sizeof(point3d));
point3d3->x=point3d1->x+point3d2->x;
point3d3->y=point3d1->y+point3d2->y;
point3d3->z=point3d1->z+point3d2->z;
PG_RETURN_POINTER(point3d3);
}
CREATE FUNCTION point3d_add(point3d, point3d) RETURNS
point3d AS 'point3d_test.so', 'point3d_add' LANGUAGE C
STRICT IMMUTABLE;
CREATE OPERATOR + (leftarg=point3d, rigtharg=point3d,
procedure=point3d_add, commutator=+);
- Tr 2 im
PG_FUNCTION_INFO_V1(point3d_minus);
Datum point3d_minus(PG_FUNCTION_ARGS)
{
point3d *point3d1=(point3d *)PG_GETARG_POINTER(0);
point3d *point3d2=(point3d *)PG_GETARG_POINTER(1);
point3d *point3d3=(point3d *)palloc(sizeof(point3d));
point3d3->x=point3d1->x-point3d2->x;
point3d3->y=point3d1->y-point3d2->y;
77
point3d3->z=point3d1->z-point3d2->z;
PG_RETURN_POINTER(point3d3);
}
CREATE FUNCTION point3d_minus(point3d,point3d) RETURNS
point3d AS 'point3d_test.so', 'point3d_minus' LANGUAGE C
STRICT IMMUTABLE;
CREATE OPERATOR - (leftarg=point3d, rightarg=point3d,
procedure=point3d_minus, commutator=-);
- Tnh khong cch gia 2 im
PG_FUNCTION_INFO_V1(distance_point3d);
Datum distance_point3d(PG_FUNCTION_ARGS)
{
point3d *point3d1=(point3d *)PG_GETARG_POINTER(0);
point3d *point3d2=(point3d *)PG_GETARG_POINTER(1);
float4 result;
float4 tmp1=(point3d1->x - point3d2->x)*(point3d1->x point3d2->x);
float4 tmp2=(point3d1->y - point3d2->y)*(point3d1->y point3d2->y);
float4 tmp3=(point3d1->z - point3d2->z)*(point3d1->z point3d2->z);
result=sqrt(tmp1+tmp2+tmp3);
PG_RETURN_FLOAT4(result);
}
CREATE FUNCTION distance_point3d(point3d,point3d) RETURNS
float AS 'point3d_test.so','point3d_add' LANGUAGE C
STRICT IMMUTABLE;
78
79
point3d2->z=point3d1->z/m;
PG_RETURN_POINTER(point3d2);
}
CREATE FUNCTION point3d_div_float(point3d,float) RETURN
point3d AS point3d_test.so, point3d_div_float
LANGUAGE C STRICT IMMUTABLE;
CREATE OPERATOR / (leftarg =point3d, rightarg = float,
procedure=point3d_div_float, commutator = / );
- To hm tp hp tnh tng cc im
CREATE AGGRAGATE sum_point3d(point3d)(sfunc=point3d_add, stype=point3d,
initcond = (0,0,0));
- Trng tm ca cc im c tnh theo cng thc
G= (pi * mi) / mi
Vi bng d liu mypoint3d (id int, a point3d, m float); th tnh trng
tm ca cc im c trong ct a theo cng thc :
SELECT sum_point3d(a * m) / sum (m) as trong_tam FROM
mypoint3d;
Bi ton 2 : To kiu d liu m t hnh cu trong khng gian (sphere) c cc thuc tnh
tm I (honh x, tung y, cao z) v bn knh r. Xy dng hm tnh th tch hnh
cu.
Thc hin : PostGIS ch h tr kiu d liu hnh hc bao gm POINT, LINESTRING,
POLYGON, nhng cha thy xut hin kiu hnh cu. Do vy mc ch ca bi ton l
to ra kiu d liu hnh cu v xy dng hm tnh th tch hnh cu.
- To kiu d liu sphere bao gm ton ca tm hnh cu I(x,y,z) v bn knh hnh
cu r c biu din :
Typedef struct sphere {
float4 x,
float4 y,
80
float4 z,
float4 r
};
- Tng t, to hm nhp v hm xut d liu c tn sphere_in() v sphere_out()
- Kiu d liu hnh cu
CREATE TYPE sphere (internallength = 16, input =
sphere_in, output = sphere_ou,);
- To hm tnh th tch hnh cu :
PG_FUNCTION_INFO_V1(sphere_area);
Datum sphere_area(PG_FUNCTION_ARGS)
{
float8 tmp,result;
sphere *mysphere=(sphere *)PG_GETARG_POINTER(0);
tmp=(mysphere->r) * (mysphere->r) * (mysphere->r);
result=4.0/3.0 * M_PI * tmp;
PG_RETURN_FLOAT8(result);
}
CREATE FUNCTION sphere_area(sphere) returns float
sphere.so,sphere_area LANGUAGE C STRICT IMMUTABLE;
as
Nh vy, kiu d liu hnh cu trong khng gian gi l sphere c to, c nh dng
u vo thng qua hm sphere_in, nh dng u ra thng qua hm sphere_out; t ,
tnh th tch hnh cu rt n gin, tnh theo cng thc :
Th_tch = 4/3 * M_PI * r3 ;
81
TNG KT
Sau mt thi gian nghin cu v tm hiu, kha lun thu c cc kt qu nh
sau:
Ci t, thao tc thnh tho vi h qun tr CSDL PostgreSQL thng qua cc kiu
giao tng tc. Ngoi ra, nm r c lch s pht trin v nhng u im ca n
so vi cc h qun tr khc.
i vi PostGIS m dun m rng cho PostgreSQL. Ti trnh by nhng kin
thc nh cch to CSDL khng gian, cch x l vi d liu khng gianc bit
l nm c tc dng v cch s dng cc hm h tr ca PostGIS v s dng
th nghim s lng ln cc hm . T , p dng cc hm vo truy vn
khng gian trong bng khng gian.
Vi phn m rng trong PostgreSQL, ti trnh by kh chi tit v cch m rng
trong PostgreSQL. T nm r c cch vit m rng, s dng cc m rng v
p dng n vo mt s bi ton c th.
Phn thc nghim ca KLTN nh ngha mt s kiu d liu khng gian m rng
v vit cc hm truy vn..
Trong kha lun ny, ti hy vng a ra nhng kin thc cn thit nht v h
qun tr CSDL PostgreSQL v PostGIS m dun m rng ca PostgreSQL. Vi kin
thc v PostGIS h tr truy vn trong CSDL PostgreSQL, ti mong rng chng s c
p dng mt cch thit thc vo i sng thc t.
82
83
84