comparison flys-backend/doc/schema/postgresql.sql @ 774:461b8bd696a7 2.4

merged flys-backend/2.4
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 28 Sep 2012 12:14:15 +0200
parents 8076f6a689d0
children 5f8444df19e4
comparison
equal deleted inserted replaced
751:8d5bd3a08dd1 774:461b8bd696a7
1 BEGIN;
2
3 -- Gewaesser
4 CREATE SEQUENCE RIVERS_ID_SEQ;
5
6 CREATE TABLE rivers (
7 id int PRIMARY KEY NOT NULL,
8 name VARCHAR(256) NOT NULL UNIQUE,
9 km_up BOOLEAN NOT NULL DEFAULT true
10 );
11
12 -- Bruecke, Haefen, etc.
13 CREATE SEQUENCE ATTRIBUTES_ID_SEQ;
14
15 CREATE TABLE attributes (
16 id int PRIMARY KEY NOT NULL,
17 value VARCHAR(256) NOT NULL UNIQUE
18 );
19
20 -- segments from/to at a river
21 CREATE SEQUENCE RANGES_ID_SEQ;
22
23 CREATE TABLE ranges (
24 id int PRIMARY KEY NOT NULL,
25 river_id int NOT NULL REFERENCES rivers(id),
26 a NUMERIC NOT NULL,
27 b NUMERIC,
28 UNIQUE (river_id, a, b)
29 );
30
31 -- Lage 'links', 'rechts', etc.
32 CREATE SEQUENCE POSITIONS_ID_SEQ;
33
34 CREATE TABLE positions (
35 id int PRIMARY KEY NOT NULL,
36 value VARCHAR(256) NOT NULL UNIQUE
37 );
38
39 -- Kante 'oben', 'unten'
40 CREATE SEQUENCE EDGES_ID_SEQ;
41
42 CREATE TABLE edges (
43 id int PRIMARY KEY NOT NULL,
44 top NUMERIC,
45 bottom NUMERIC
46 );
47
48 -- Types of annotatations (Hafen, Bruecke, Zufluss, ...)
49 CREATE SEQUENCE ANNOTATION_TYPES_ID_SEQ;
50
51 CREATE TABLE annotation_types (
52 id int PRIMARY KEY NOT NULL,
53 name VARCHAR(256) NOT NULL UNIQUE
54 );
55
56 -- Some object (eg. Hafen) at a segment of river
57 -- plus its position.
58 CREATE SEQUENCE ANNOTATIONS_ID_SEQ;
59
60 CREATE TABLE annotations (
61 id int PRIMARY KEY NOT NULL,
62 range_id int NOT NULL REFERENCES ranges(id),
63 attribute_id int NOT NULL REFERENCES attributes(id),
64 position_id int REFERENCES positions(id),
65 edge_id int REFERENCES edges(id),
66 type_id int REFERENCES annotation_types(id)
67 );
68
69 -- Pegel
70 CREATE SEQUENCE GAUGES_ID_SEQ;
71
72 CREATE TABLE gauges (
73 id int PRIMARY KEY NOT NULL,
74 name VARCHAR(256) NOT NULL,
75 river_id int NOT NULL REFERENCES rivers(id),
76 station NUMERIC NOT NULL UNIQUE,
77 aeo NUMERIC NOT NULL,
78
79 -- Pegelnullpunkt
80 datum NUMERIC NOT NULL,
81 -- Streckengueltigkeit
82 range_id int NOT NULL REFERENCES ranges (id),
83
84 UNIQUE (name, river_id),
85 UNIQUE (river_id, station)
86 );
87
88 -- Type of a Hauptwert 'W', 'Q', 'D', etc.
89 CREATE SEQUENCE MAIN_VALUE_TYPES_ID_SEQ;
90
91 CREATE TABLE main_value_types (
92 id int PRIMARY KEY NOT NULL,
93 name VARCHAR(256) NOT NULL UNIQUE
94 );
95
96 -- Named type of a Hauptwert (eg. HQ100)
97 CREATE SEQUENCE NAMED_MAIN_VALUES_ID_SEQ;
98
99 CREATE TABLE named_main_values (
100 id int PRIMARY KEY NOT NULL,
101 name VARCHAR(256) NOT NULL UNIQUE,
102 type_id int NOT NULL REFERENCES main_value_types(id),
103 UNIQUE (name, type_id)
104 );
105
106 -- Table for time intervals
107 CREATE SEQUENCE TIME_INTERVALS_ID_SEQ;
108
109 CREATE TABLE time_intervals (
110 id int PRIMARY KEY NOT NULL,
111 start_time TIMESTAMP NOT NULL,
112 stop_time TIMESTAMP,
113 CHECK (start_time <= stop_time)
114 );
115
116 -- Stammdaten
117 CREATE SEQUENCE MAIN_VALUES_ID_SEQ;
118
119 CREATE TABLE main_values (
120 id int PRIMARY KEY NOT NULL,
121 gauge_id int NOT NULL REFERENCES gauges(id),
122 named_value_id int NOT NULL REFERENCES named_main_values(id),
123 value NUMERIC NOT NULL,
124
125 time_interval_id int REFERENCES time_intervals(id),
126
127 -- TODO: better checks
128 UNIQUE (gauge_id, named_value_id, time_interval_id)
129 );
130
131 -- Abflusstafeln
132 CREATE SEQUENCE DISCHARGE_TABLES_ID_SEQ;
133
134 CREATE TABLE discharge_tables (
135 id int PRIMARY KEY NOT NULL,
136 gauge_id int NOT NULL REFERENCES gauges(id),
137 description VARCHAR(256) NOT NULL,
138 kind int NOT NULL DEFAULT 0,
139 time_interval_id int REFERENCES time_intervals(id)
140
141 -- TODO: better checks
142 -- UNIQUE (gauge_id, kind, time_interval_id)
143 );
144
145 -- Values of the Abflusstafeln
146 CREATE SEQUENCE DISCHARGE_TABLE_VALUES_ID_SEQ;
147
148 CREATE TABLE discharge_table_values (
149 id int PRIMARY KEY NOT NULL,
150 table_id int NOT NULL REFERENCES discharge_tables(id),
151 q NUMERIC NOT NULL,
152 w NUMERIC NOT NULL,
153
154 UNIQUE (table_id, q, w)
155 );
156
157 -- WST files
158 CREATE SEQUENCE WSTS_ID_SEQ;
159
160 CREATE TABLE wsts (
161 id int PRIMARY KEY NOT NULL,
162 river_id int NOT NULL REFERENCES rivers(id),
163 description VARCHAR(256) NOT NULL,
164 kind int NOT NULL DEFAULT 0,
165 -- TODO: more meta infos
166 UNIQUE (river_id, description)
167 );
168
169 -- columns of WST files
170 CREATE SEQUENCE WST_COLUMNS_ID_SEQ;
171
172 CREATE TABLE wst_columns (
173 id int PRIMARY KEY NOT NULL,
174 wst_id int NOT NULL REFERENCES wsts(id),
175 name VARCHAR(256) NOT NULL,
176 description VARCHAR(256),
177 position int NOT NULL DEFAULT 0,
178
179 time_interval_id int REFERENCES time_intervals(id),
180
181 UNIQUE (wst_id, name),
182 UNIQUE (wst_id, position)
183 );
184
185 -- w values in WST file column
186 CREATE SEQUENCE WST_COLUMN_VALUES_ID_SEQ;
187
188 CREATE TABLE wst_column_values (
189 id int PRIMARY KEY NOT NULL,
190 wst_column_id int NOT NULL REFERENCES wst_columns(id),
191 position NUMERIC NOT NULL,
192 w NUMERIC NOT NULL,
193
194 UNIQUE (position, wst_column_id),
195 UNIQUE (position, wst_column_id, w)
196 );
197
198 -- bind q values to range
199 CREATE SEQUENCE WST_Q_RANGES_ID_SEQ;
200
201 CREATE TABLE wst_q_ranges (
202 id int PRIMARY KEY NOT NULL,
203 range_id int NOT NULL REFERENCES ranges(id),
204 q NUMERIC NOT NULL
205 );
206
207 -- bind q ranges to wst columns
208 CREATE SEQUENCE WST_COLUMN_Q_RANGES_ID_SEQ;
209
210 CREATE TABLE wst_column_q_ranges (
211 id int PRIMARY KEY NOT NULL,
212 wst_column_id int NOT NULL REFERENCES wst_columns(id),
213 wst_q_range_id int NOT NULL REFERENCES wst_q_ranges(id),
214
215 UNIQUE (wst_column_id, wst_q_range_id)
216 );
217
218 CREATE VIEW wst_value_table AS
219 SELECT wcv.position AS position,
220 w,
221 (SELECT q
222 FROM wst_column_q_ranges wcqr
223 JOIN wst_q_ranges wqr
224 ON wcqr.wst_q_range_id = wqr.id
225 JOIN ranges r
226 ON r.id = wqr.range_id
227 WHERE wcqr.wst_column_id = wc.id
228 AND wcv.position BETWEEN r.a AND r.b) AS q,
229 wc.position AS column_pos,
230 w.id AS wst_id
231 FROM wst_column_values wcv
232 JOIN wst_columns wc
233 ON wcv.wst_column_id = wc.id
234 JOIN wsts w
235 ON wc.wst_id = w.id
236 ORDER BY wcv.position ASC,
237 wc.position DESC;
238
239 -- view to select the w values of a WST
240 CREATE VIEW wst_w_values AS
241 SELECT wcv."position" AS km,
242 wcv.w AS w,
243 wc."position" AS column_pos,
244 w.id AS wst_id
245 FROM wst_column_values wcv
246 JOIN wst_columns wc ON wcv.wst_column_id = wc.id
247 JOIN wsts w ON wc.wst_id = w.id
248 ORDER BY wcv."position", wc."position";
249
250 -- view to select the q values of a WST
251 CREATE VIEW wst_q_values AS
252 SELECT wc.position AS column_pos,
253 wqr.q AS q,
254 r.a AS a,
255 r.b AS b,
256 wc.wst_id AS wst_id
257 FROM wst_column_q_ranges wcqr
258 JOIN wst_q_ranges wqr ON wcqr.wst_q_range_id = wqr.id
259 JOIN ranges r ON wqr.range_id = r.id
260 JOIN wst_columns wc ON wcqr.wst_column_id = wc.id
261 ORDER BY wc.position, wcqr.wst_column_id, r.a;
262
263 COMMIT;

http://dive4elements.wald.intevation.org