comparison flys-backend/doc/schema/postgresql.sql @ 1259:54365104835c 2.5

merged flys-backend/2.5
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 28 Sep 2012 12:14:18 +0200
parents 1dbafbba50ea
children f834b411ca57
comparison
equal deleted inserted replaced
1190:f514894ec2fd 1259:54365104835c
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 -- data for the cross-sections
264
265 CREATE SEQUENCE CROSS_SECTIONS_ID_SEQ;
266
267 CREATE TABLE cross_sections (
268 id int PRIMARY KEY NOT NULL,
269 river_id int NOT NULL REFERENCES rivers(id),
270 time_interval_id int REFERENCES time_intervals(id),
271 description VARCHAR(256)
272 );
273
274 CREATE SEQUENCE CROSS_SECTION_LINES_ID_SEQ;
275
276 CREATE TABLE cross_section_lines (
277 id int PRIMARY KEY NOT NULL,
278 km NUMERIC NOT NULL,
279 cross_section_id int NOT NULL REFERENCES cross_sections(id),
280 UNIQUE (km, cross_section_id)
281 );
282
283 CREATE SEQUENCE CROSS_SECTION_POINTS_ID_SEQ;
284
285 CREATE TABLE cross_section_points (
286 id int PRIMARY KEY NOT NULL,
287 cross_section_line_id int NOT NULL REFERENCES cross_section_lines(id),
288 col_pos int NOT NULL,
289 x NUMERIC NOT NULL,
290 y NUMERIC NOT NULL,
291 UNIQUE (cross_section_line_id, col_pos)
292 );
293
294 -- Hydraulische Kenngroessen
295
296 CREATE SEQUENCE HYKS_ID_SEQ;
297
298 CREATE TABLE hyks (
299 id int PRIMARY KEY NOT NULL,
300 river_id int NOT NULL REFERENCES rivers(id),
301 description VARCHAR(256) NOT NULL
302 );
303
304 CREATE SEQUENCE HYK_ENTRIES_ID_SEQ;
305
306 CREATE TABLE hyk_entries (
307 id int PRIMARY KEY NOT NULL,
308 hyk_id int NOT NULL REFERENCES hyks(id),
309 km NUMERIC NOT NULL,
310 measure TIMESTAMP,
311 UNIQUE (hyk_id, km)
312 );
313
314 CREATE SEQUENCE HYK_FORMATIONS_ID_SEQ;
315
316 CREATE TABLE hyk_formations (
317 id int PRIMARY KEY NOT NULL,
318 formation_num int NOT NULL DEFAULT 0,
319 hyk_entry_id int NOT NULL REFERENCES hyk_entries(id),
320 top NUMERIC NOT NULL,
321 bottom NUMERIC NOT NULL,
322 distance_vl NUMERIC NOT NULL,
323 distance_hf NUMERIC NOT NULL,
324 distance_vr NUMERIC NOT NULL,
325 UNIQUE (hyk_entry_id, formation_num)
326 );
327
328 CREATE SEQUENCE HYK_FLOW_ZONE_TYPES_ID_SEQ;
329
330 CREATE TABLE hyk_flow_zone_types (
331 id int PRIMARY KEY NOT NULL,
332 name VARCHAR(50) NOT NULL UNIQUE,
333 description VARCHAR(256)
334 );
335
336 CREATE SEQUENCE HYK_FLOW_ZONES_ID_SEQ;
337
338 CREATE TABLE hyk_flow_zones (
339 id int PRIMARY KEY NOT NULL,
340 formation_id int NOT NULL REFERENCES hyk_formations(id),
341 type_id int NOT NULL REFERENCES hyk_flow_zone_types(id),
342 a NUMERIC NOT NULL,
343 b NUMERIC NOT NULL,
344 CHECK (a <= b)
345 );
346
347 COMMIT;

http://dive4elements.wald.intevation.org