DatabaseCreation: ddl.sql

File ddl.sql, 15.2 KB (added by 231071, 7 days ago)
Line 
1-- REFERENCE TABLES
2
3
4CREATE TABLE public.election_type (
5 election_type_id int8 NOT NULL,
6 type_name varchar(60) NOT NULL,
7 CONSTRAINT election_type_pkey PRIMARY KEY (election_type_id),
8 CONSTRAINT uk_election_type_name UNIQUE (type_name)
9);
10
11
12CREATE TABLE public.region_type (
13 region_type_id int8 NOT NULL,
14 "name" varchar(50) NOT NULL,
15 description text NULL,
16 CONSTRAINT region_type_pkey PRIMARY KEY (region_type_id),
17 CONSTRAINT uk_region_type_name UNIQUE (name)
18);
19
20
21
22CREATE TABLE public.winner_method (
23 method_id int8 NOT NULL,
24 method_name varchar(255) NOT NULL,
25 CONSTRAINT uk_winner_method_name UNIQUE (method_name),
26 CONSTRAINT winner_method_pkey PRIMARY KEY (method_id)
27);
28
29
30
31-- REGION (self-referencing hierarchy)
32
33CREATE TABLE public.region (
34 region_id int8 NOT NULL,
35 "name" varchar(100) NOT NULL,
36 region_type_id int8 NOT NULL,
37 parent_region_id int8 NULL,
38 CONSTRAINT region_pkey PRIMARY KEY (region_id),
39 CONSTRAINT uk_region_name UNIQUE (name, parent_region_id),
40 CONSTRAINT fk_region_parent FOREIGN KEY (parent_region_id)
41 REFERENCES public.region(region_id) ON DELETE SET NULL ON UPDATE CASCADE,
42 CONSTRAINT fk_region_type FOREIGN KEY (region_type_id)
43 REFERENCES public.region_type(region_type_id) ON DELETE RESTRICT ON UPDATE CASCADE
44);
45
46
47-- ELECTION
48
49
50CREATE TABLE public.election (
51 election_id int8 NOT NULL,
52 "name" varchar(100) NOT NULL,
53 election_type_id int8 NOT NULL,
54 region_id int8 NOT NULL,
55 election_date date NOT NULL,
56 description text NULL,
57 status int2 NOT NULL DEFAULT 1,
58 winner_method_id int8 NOT NULL,
59 total_seats int4 NULL,
60 CONSTRAINT chk_total_seats CHECK ((total_seats IS NULL) OR (total_seats > 0)),
61 CONSTRAINT election_pkey PRIMARY KEY (election_id),
62 CONSTRAINT election_status_check CHECK (status = ANY (ARRAY[0, 1])),
63 CONSTRAINT uk_election_name UNIQUE (name),
64 CONSTRAINT fk_election_region FOREIGN KEY (region_id)
65 REFERENCES public.region(region_id) ON DELETE RESTRICT ON UPDATE CASCADE,
66 CONSTRAINT fk_election_type FOREIGN KEY (election_type_id)
67 REFERENCES public.election_type(election_type_id) ON DELETE RESTRICT ON UPDATE CASCADE,
68 CONSTRAINT fk_election_winner_method FOREIGN KEY (winner_method_id)
69 REFERENCES public.winner_method(method_id) ON DELETE RESTRICT ON UPDATE CASCADE
70);
71
72
73CREATE TABLE public.election_cycle (
74 cycle_id int8 NOT NULL,
75 election_id int8 NOT NULL,
76 round_number int4 NOT NULL,
77 CONSTRAINT election_cycle_pkey PRIMARY KEY (cycle_id),
78 CONSTRAINT uk_cycle UNIQUE (election_id, round_number),
79 CONSTRAINT fk_cycle_election FOREIGN KEY (election_id)
80 REFERENCES public.election(election_id) ON DELETE CASCADE ON UPDATE CASCADE
81);
82
83
84CREATE TABLE public.electoral_district (
85 district_id int8 NOT NULL,
86 election_id int8 NOT NULL,
87 region_id int8 NOT NULL,
88 seats_available int4 NULL,
89 CONSTRAINT chk_seats CHECK ((seats_available IS NULL) OR (seats_available > 0)),
90 CONSTRAINT electoral_district_pkey PRIMARY KEY (district_id),
91 CONSTRAINT uk_district UNIQUE (election_id, region_id),
92 CONSTRAINT fk_district_election FOREIGN KEY (election_id)
93 REFERENCES public.election(election_id) ON DELETE CASCADE ON UPDATE CASCADE,
94 CONSTRAINT fk_district_region FOREIGN KEY (region_id)
95 REFERENCES public.region(region_id) ON DELETE RESTRICT ON UPDATE CASCADE
96);
97
98
99-- PARTIES, COALITIONS, POLITICAL ENTITIES
100
101
102CREATE TABLE public.party_coalition (
103 coalition_id int8 NOT NULL,
104 "name" varchar(100) NOT NULL,
105 election_id int8 NOT NULL,
106 CONSTRAINT party_coalition_pkey PRIMARY KEY (coalition_id),
107 CONSTRAINT uk_coalition_name UNIQUE (name),
108 CONSTRAINT fk_coalition_election FOREIGN KEY (election_id)
109 REFERENCES public.election(election_id) ON DELETE CASCADE ON UPDATE CASCADE
110);
111
112
113CREATE TABLE public.party_leader (
114 leader_id int8 NOT NULL,
115 person_id int8 NOT NULL,
116 CONSTRAINT party_leader_pkey PRIMARY KEY (leader_id),
117 CONSTRAINT uk_party_leader_person UNIQUE (person_id),
118 CONSTRAINT fk_party_leader_person FOREIGN KEY (person_id)
119 REFERENCES public.person(person_id) ON DELETE RESTRICT ON UPDATE CASCADE
120);
121
122
123CREATE TABLE public.political_party (
124 party_id int8 NOT NULL,
125 "name" varchar(100) NOT NULL,
126 abbreviation varchar(20) NULL,
127 description text NULL,
128 founded_year int4 NULL,
129 ideology text NULL,
130 leader_id int8 NULL,
131 parent_party_id int8 NULL,
132 CONSTRAINT political_party_pkey PRIMARY KEY (party_id),
133 CONSTRAINT uk_party_name UNIQUE (name),
134 CONSTRAINT fk_party_leader FOREIGN KEY (leader_id)
135 REFERENCES public.party_leader(leader_id) ON DELETE SET NULL ON UPDATE CASCADE,
136 CONSTRAINT fk_party_parent FOREIGN KEY (parent_party_id)
137 REFERENCES public.political_party(party_id) ON DELETE SET NULL ON UPDATE CASCADE
138);
139
140
141CREATE TABLE public.coalition_member (
142 coalition_member_id int8 NOT NULL,
143 coalition_id int8 NOT NULL,
144 party_id int8 NOT NULL,
145 CONSTRAINT coalition_member_pkey PRIMARY KEY (coalition_member_id),
146 CONSTRAINT uk_coalition_member UNIQUE (coalition_id, party_id),
147 CONSTRAINT fk_coalition_member_coalition FOREIGN KEY (coalition_id)
148 REFERENCES public.party_coalition(coalition_id) ON DELETE CASCADE ON UPDATE CASCADE,
149 CONSTRAINT fk_coalition_member_party FOREIGN KEY (party_id)
150 REFERENCES public.political_party(party_id) ON DELETE CASCADE ON UPDATE CASCADE
151);
152
153
154CREATE TABLE public.political_entity (
155 entity_id int8 NOT NULL,
156 "name" varchar(100) NOT NULL,
157 "type" varchar(20) NULL,
158 party_id int8 NULL,
159 coalition_id int8 NULL,
160 candidate_id int8 NULL,
161 is_independent bool NOT NULL DEFAULT false,
162 CONSTRAINT chk_entity_type CHECK (
163 ((party_id IS NOT NULL) AND (coalition_id IS NULL) AND (is_independent = false))
164 OR ((party_id IS NULL) AND (coalition_id IS NOT NULL) AND (is_independent = false))
165 OR ((party_id IS NULL) AND (coalition_id IS NULL) AND (is_independent = true) AND (candidate_id IS NOT NULL))
166 ),
167 CONSTRAINT political_entity_pkey PRIMARY KEY (entity_id),
168 CONSTRAINT uk_entity_name UNIQUE (name),
169 CONSTRAINT fk_entity_candidate FOREIGN KEY (candidate_id)
170 REFERENCES public.candidate(candidate_id) ON DELETE RESTRICT ON UPDATE CASCADE,
171 CONSTRAINT fk_entity_coalition FOREIGN KEY (coalition_id)
172 REFERENCES public.party_coalition(coalition_id) ON DELETE RESTRICT ON UPDATE CASCADE,
173 CONSTRAINT fk_entity_party FOREIGN KEY (party_id)
174 REFERENCES public.political_party(party_id) ON DELETE RESTRICT ON UPDATE CASCADE
175);
176
177
178-- PERSON, VOTER, CANDIDATE
179
180
181CREATE TABLE public.person (
182 person_id int8 NOT NULL,
183 "name" varchar(50) NOT NULL,
184 surname varchar(50) NOT NULL,
185 date_of_birth date NOT NULL,
186 gender bpchar(1) NOT NULL,
187 municipality_id int8 NULL,
188 CONSTRAINT person_gender_check CHECK (gender = ANY (ARRAY['M'::bpchar, 'F'::bpchar, 'O'::bpchar])),
189 CONSTRAINT person_pkey PRIMARY KEY (person_id),
190 CONSTRAINT uk_person UNIQUE (name, surname, date_of_birth),
191 CONSTRAINT fk_person_municipality FOREIGN KEY (municipality_id)
192 REFERENCES public.region(region_id)
193);
194
195
196CREATE TABLE public.candidate (
197 candidate_id int8 NOT NULL,
198 person_id int8 NOT NULL,
199 CONSTRAINT candidate_pkey PRIMARY KEY (candidate_id),
200 CONSTRAINT fk_candidate_person FOREIGN KEY (person_id)
201 REFERENCES public.person(person_id) ON DELETE RESTRICT ON UPDATE CASCADE
202);
203
204
205CREATE TABLE public.candidate_party (
206 candidate_party_id int8 NOT NULL,
207 candidate_id int8 NOT NULL,
208 party_id int8 NOT NULL,
209 election_id int8 NOT NULL,
210 CONSTRAINT candidate_party_pkey PRIMARY KEY (candidate_party_id),
211 CONSTRAINT uk_candidate_party UNIQUE (candidate_id, party_id, election_id),
212 CONSTRAINT fk_cp_candidate FOREIGN KEY (candidate_id)
213 REFERENCES public.candidate(candidate_id) ON DELETE CASCADE ON UPDATE CASCADE,
214 CONSTRAINT fk_cp_election FOREIGN KEY (election_id)
215 REFERENCES public.election(election_id) ON DELETE CASCADE ON UPDATE CASCADE,
216 CONSTRAINT fk_cp_party FOREIGN KEY (party_id)
217 REFERENCES public.political_party(party_id) ON DELETE CASCADE ON UPDATE CASCADE
218);
219
220
221CREATE TABLE public.candidate_list (
222 list_id int8 NOT NULL,
223 election_id int8 NOT NULL,
224 entity_id int8 NOT NULL,
225 CONSTRAINT candidate_list_pkey PRIMARY KEY (list_id),
226 CONSTRAINT uk_candidate_list UNIQUE (election_id, entity_id),
227 CONSTRAINT fk_candidate_list_election FOREIGN KEY (election_id)
228 REFERENCES public.election(election_id) ON DELETE CASCADE ON UPDATE CASCADE,
229 CONSTRAINT fk_candidate_list_entity FOREIGN KEY (entity_id)
230 REFERENCES public.political_entity(entity_id) ON DELETE CASCADE ON UPDATE CASCADE
231);
232
233
234CREATE TABLE public.candidate_list_item (
235 list_item_id int8 NOT NULL,
236 list_id int8 NOT NULL,
237 candidate_id int8 NOT NULL,
238 "position" int4 NOT NULL,
239 CONSTRAINT candidate_list_item_pkey PRIMARY KEY (list_item_id),
240 CONSTRAINT uk_list_item_candidate UNIQUE (list_id, candidate_id),
241 CONSTRAINT uk_list_item_position UNIQUE (list_id, "position"),
242 CONSTRAINT fk_list_item_candidate FOREIGN KEY (candidate_id)
243 REFERENCES public.candidate(candidate_id) ON DELETE RESTRICT ON UPDATE CASCADE,
244 CONSTRAINT fk_list_item_list FOREIGN KEY (list_id)
245 REFERENCES public.candidate_list(list_id) ON DELETE CASCADE ON UPDATE CASCADE
246);
247
248
249-- POLLING STATIONS AND VOTERS
250
251
252CREATE TABLE public.polling_station (
253 station_id int8 NOT NULL,
254 "name" varchar(100) NOT NULL,
255 municipality_id int8 NOT NULL,
256 address text NULL,
257 registered_voter int4 NULL,
258 voting_object varchar(255) NULL,
259 CONSTRAINT polling_station_pkey PRIMARY KEY (station_id),
260 CONSTRAINT uk_station_name_municipality UNIQUE (name, municipality_id),
261 CONSTRAINT fk_station_municipality FOREIGN KEY (municipality_id)
262 REFERENCES public.region(region_id) ON DELETE RESTRICT ON UPDATE CASCADE
263);
264
265
266CREATE TABLE public.station_election (
267 station_election_id int8 NOT NULL,
268 station_id int8 NOT NULL,
269 election_id int8 NOT NULL,
270 CONSTRAINT station_election_pkey PRIMARY KEY (station_election_id),
271 CONSTRAINT uk_se UNIQUE (station_id, election_id),
272 CONSTRAINT fk_se_election FOREIGN KEY (election_id)
273 REFERENCES public.election(election_id) ON DELETE CASCADE ON UPDATE CASCADE,
274 CONSTRAINT fk_se_station FOREIGN KEY (station_id)
275 REFERENCES public.polling_station(station_id) ON DELETE CASCADE ON UPDATE CASCADE
276);
277
278
279CREATE TABLE public.voter (
280 voter_id int8 NOT NULL,
281 person_id int8 NOT NULL,
282 station_id int8 NOT NULL,
283 CONSTRAINT idx_voter_person_id UNIQUE (person_id),
284 CONSTRAINT voter_pkey PRIMARY KEY (voter_id),
285 CONSTRAINT fk_voter_person FOREIGN KEY (person_id)
286 REFERENCES public.person(person_id) ON DELETE RESTRICT ON UPDATE CASCADE,
287 CONSTRAINT fk_voter_station FOREIGN KEY (station_id)
288 REFERENCES public.polling_station(station_id) ON DELETE RESTRICT ON UPDATE CASCADE
289);
290
291
292CREATE TABLE public.voter_election (
293 voter_election_id int8 NOT NULL,
294 voter_id int8 NOT NULL,
295 station_id int8 NOT NULL,
296 election_id int8 NOT NULL,
297 checkin_timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
298 CONSTRAINT uk_ve_voter_election UNIQUE (voter_id, election_id),
299 CONSTRAINT voter_election_pkey PRIMARY KEY (voter_election_id),
300 CONSTRAINT fk_ve_election FOREIGN KEY (election_id)
301 REFERENCES public.election(election_id),
302 CONSTRAINT fk_ve_station FOREIGN KEY (station_id)
303 REFERENCES public.polling_station(station_id),
304 CONSTRAINT fk_ve_voter FOREIGN KEY (voter_id)
305 REFERENCES public.voter(voter_id)
306);
307
308
309-- ELECTION PARTICIPANTS AND VOTE RESULTS
310
311CREATE TABLE public.election_participant (
312 participant_id int8 NOT NULL,
313 district_id int8 NOT NULL,
314 entity_id int8 NOT NULL,
315 CONSTRAINT election_participant_pkey PRIMARY KEY (participant_id),
316 CONSTRAINT uk_participant UNIQUE (district_id, entity_id),
317 CONSTRAINT fk_participant_district FOREIGN KEY (district_id)
318 REFERENCES public.electoral_district(district_id) ON DELETE CASCADE ON UPDATE CASCADE,
319 CONSTRAINT fk_participant_entity FOREIGN KEY (entity_id)
320 REFERENCES public.political_entity(entity_id) ON DELETE CASCADE ON UPDATE CASCADE
321);
322
323
324CREATE TABLE public.vote_result (
325 result_id int8 NOT NULL,
326 election_id int8 NOT NULL,
327 station_id int8 NOT NULL,
328 entity_id int8 NOT NULL,
329 candidate_id int8 NULL,
330 votes int4 NOT NULL,
331 CONSTRAINT uk_vote_result UNIQUE (election_id, entity_id, station_id, candidate_id),
332 CONSTRAINT vote_result_pkey PRIMARY KEY (result_id),
333 CONSTRAINT vote_result_votes_check CHECK (votes >= 0),
334 CONSTRAINT fk_vr_candidate FOREIGN KEY (candidate_id)
335 REFERENCES public.candidate(candidate_id) ON DELETE RESTRICT ON UPDATE CASCADE,
336 CONSTRAINT fk_vr_election FOREIGN KEY (election_id)
337 REFERENCES public.election(election_id) ON DELETE CASCADE ON UPDATE CASCADE,
338 CONSTRAINT fk_vr_entity FOREIGN KEY (entity_id)
339 REFERENCES public.political_entity(entity_id) ON DELETE RESTRICT ON UPDATE CASCADE,
340 CONSTRAINT fk_vr_station FOREIGN KEY (station_id)
341 REFERENCES public.polling_station(station_id) ON DELETE RESTRICT ON UPDATE CASCADE,
342 CONSTRAINT fk_vr_station_election FOREIGN KEY (station_id, election_id)
343 REFERENCES public.station_election(station_id, election_id)
344);
345
346
347-- BALLOT
348
349CREATE TABLE public.ballot (
350 ballot_id int8 NOT NULL GENERATED ALWAYS AS IDENTITY,
351 election_id int8 NOT NULL,
352 station_id int8 NOT NULL,
353 entity_id int8 NULL,
354 candidate_id int8 NULL,
355 is_valid bool NOT NULL DEFAULT true,
356 ballot_timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
357 CONSTRAINT ballot_pkey PRIMARY KEY (ballot_id),
358 CONSTRAINT chk_ballot_validity CHECK (
359 (is_valid = false) OR (entity_id IS NOT NULL) OR (candidate_id IS NOT NULL)
360 ),
361 CONSTRAINT fk_ballot_candidate FOREIGN KEY (candidate_id)
362 REFERENCES public.candidate(candidate_id) ON DELETE RESTRICT ON UPDATE CASCADE,
363 CONSTRAINT fk_ballot_election FOREIGN KEY (election_id)
364 REFERENCES public.election(election_id) ON DELETE CASCADE ON UPDATE CASCADE,
365 CONSTRAINT fk_ballot_entity FOREIGN KEY (entity_id)
366 REFERENCES public.political_entity(entity_id) ON DELETE RESTRICT ON UPDATE CASCADE,
367 CONSTRAINT fk_ballot_station FOREIGN KEY (station_id)
368 REFERENCES public.polling_station(station_id) ON DELETE RESTRICT ON UPDATE CASCADE
369);
370
371