-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcreation.sql
More file actions
320 lines (291 loc) · 10.9 KB
/
Copy pathcreation.sql
File metadata and controls
320 lines (291 loc) · 10.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
use cs3380;
-- Drop tables in reverse dependency order to avoid foreign key constraints errors
IF OBJECT_ID('GOALS', 'U') IS NOT NULL DROP TABLE GOALS;
IF OBJECT_ID('BOOKINGS', 'U') IS NOT NULL DROP TABLE BOOKINGS;
IF OBJECT_ID('SUBSTITUTIONS', 'U') IS NOT NULL DROP TABLE SUBSTITUTIONS;
IF OBJECT_ID('PENALTY_KICKS', 'U') IS NOT NULL DROP TABLE PENALTY_KICKS;
IF OBJECT_ID('PLAYER_APPEARANCES', 'U') IS NOT NULL DROP TABLE PLAYER_APPEARANCES;
IF OBJECT_ID('MANAGER_APPEARANCES', 'U') IS NOT NULL DROP TABLE MANAGER_APPEARANCES;
IF OBJECT_ID('MATCHES', 'U') IS NOT NULL DROP TABLE MATCHES;
IF OBJECT_ID('AWARD_WINNERS', 'U') IS NOT NULL DROP TABLE AWARD_WINNERS;
IF OBJECT_ID('TOURNAMENT_STANDINGS', 'U') IS NOT NULL DROP TABLE TOURNAMENT_STANDINGS;
IF OBJECT_ID('SQUADS', 'U') IS NOT NULL DROP TABLE SQUADS;
IF OBJECT_ID('QUALIFIED_TEAMS', 'U') IS NOT NULL DROP TABLE QUALIFIED_TEAMS;
IF OBJECT_ID('TOURNAMENTS', 'U') IS NOT NULL DROP TABLE TOURNAMENTS;
IF OBJECT_ID('STADIUMS', 'U') IS NOT NULL DROP TABLE STADIUMS;
IF OBJECT_ID('REFEREES', 'U') IS NOT NULL DROP TABLE REFEREES;
IF OBJECT_ID('MANAGERS', 'U') IS NOT NULL DROP TABLE MANAGERS;
IF OBJECT_ID('CITIES', 'U') IS NOT NULL DROP TABLE CITIES;
IF OBJECT_ID('PLAYERS', 'U') IS NOT NULL DROP TABLE PLAYERS;
IF OBJECT_ID('TEAMS', 'U') IS NOT NULL DROP TABLE TEAMS;
IF OBJECT_ID('AWARDS', 'U') IS NOT NULL DROP TABLE AWARDS;
IF OBJECT_ID('PLAYER_POSITIONS', 'U') IS NOT NULL DROP TABLE PLAYER_POSITIONS;
IF OBJECT_ID('CONFEDERATIONS', 'U') IS NOT NULL DROP TABLE CONFEDERATIONS;
IF OBJECT_ID('STAGE_HIERARCHY', 'U') IS NOT NULL DROP TABLE STAGE_HIERARCHY;
-- 22 tables
GO
-- SET NOCOUNT ON is often used to prevent the count of the number of rows affected by a T-SQL statement from being returned as part of the result set.
SET NOCOUNT ON;
GO
-- Data Type Mapping:
-- TEXT/IDs -> VARCHAR(50) for PK/FKs, VARCHAR(MAX) for large fields
-- INTEGER -> INT
-- BOOLEAN -> BIT
-- -----------------------------------------------------------
-- 1. Core Lookup Entities (Base Tables)
-- -----------------------------------------------------------
CREATE TABLE CONFEDERATIONS (
confederation_id VARCHAR(50) PRIMARY KEY NOT NULL,
confederation_name VARCHAR(MAX),
confederation_code VARCHAR(10) UNIQUE,
confederation_wikipedia VARCHAR(MAX)
);
CREATE TABLE PLAYER_POSITIONS (
position_code VARCHAR(50) PRIMARY KEY NOT NULL,
position_name VARCHAR(255) UNIQUE
);
CREATE TABLE AWARDS (
award_id VARCHAR(50) PRIMARY KEY NOT NULL,
award_name VARCHAR(255) UNIQUE,
award_description VARCHAR(MAX),
year_introduced INT
);
CREATE TABLE STAGE_HIERARCHY (
stage_name VARCHAR(255) PRIMARY KEY,
stage_level INT NOT NULL
);
GO
-- -----------------------------------------------------------
-- 2. Main Entities (Depend on Lookups)
-- -----------------------------------------------------------
CREATE TABLE TEAMS (
team_id VARCHAR(50) PRIMARY KEY NOT NULL,
team_name VARCHAR(255) UNIQUE,
team_code VARCHAR(10),
mens_team BIT,
womens_team BIT,
federation_name VARCHAR(255),
region_name VARCHAR(255),
mens_team_wikipedia_link VARCHAR(MAX),
womens_team_wikipedia_link VARCHAR(MAX),
federation_wikipedia_link VARCHAR(MAX),
confederation_id VARCHAR(50) NOT NULL,
FOREIGN KEY (confederation_id) REFERENCES CONFEDERATIONS(confederation_id)
);
CREATE TABLE PLAYERS (
player_id VARCHAR(50) PRIMARY KEY NOT NULL,
family_name VARCHAR(255),
given_name VARCHAR(255),
birth_date VARCHAR(20), -- TEXT equivalent
female BIT,
goal_keeper BIT,
defender BIT,
midfielder BIT,
forward BIT,
player_wikipedia_link VARCHAR(MAX)
-- BCNF Fix: Removed count_tournaments and list_tournaments
);
-- CITIES must be created after TEAMS (country_id FK points to TEAMS.team_id)
CREATE TABLE CITIES (
city_id VARCHAR(50) PRIMARY KEY NOT NULL,
city_name VARCHAR(255) UNIQUE,
city_wikipedia_link VARCHAR(MAX),
-- Per instructions: country_id FK references TEAMS(team_id)
country_id VARCHAR(50) NOT NULL,
FOREIGN KEY (country_id) REFERENCES TEAMS(team_id)
);
CREATE TABLE MANAGERS (
manager_id VARCHAR(50) PRIMARY KEY NOT NULL,
family_name VARCHAR(255),
given_name VARCHAR(255),
female BIT,
-- Per instructions: country_id FK references TEAMS(team_id)
country_id VARCHAR(50),
manager_wikipedia_link VARCHAR(MAX),
FOREIGN KEY (country_id) REFERENCES TEAMS(team_id)
);
CREATE TABLE REFEREES (
referee_id VARCHAR(50) PRIMARY KEY NOT NULL,
family_name VARCHAR(255),
given_name VARCHAR(255),
female BIT,
-- Per instructions: country_id FK references TEAMS(team_id)
country_id VARCHAR(50),
confederation_id VARCHAR(50),
referee_wikipedia_link VARCHAR(MAX),
FOREIGN KEY (country_id) REFERENCES TEAMS(team_id),
FOREIGN KEY (confederation_id) REFERENCES CONFEDERATIONS(confederation_id)
);
CREATE TABLE STADIUMS (
stadium_id VARCHAR(50) PRIMARY KEY NOT NULL,
stadium_name VARCHAR(255),
city_id VARCHAR(50),
stadium_capacity INT,
stadium_wikipedia_link VARCHAR(MAX),
FOREIGN KEY (city_id) REFERENCES CITIES(city_id)
);
GO
-- -----------------------------------------------------------
-- 3. Tournament Structure
-- -----------------------------------------------------------
CREATE TABLE TOURNAMENTS (
tournament_id VARCHAR(50) PRIMARY KEY NOT NULL,
tournament_name VARCHAR(255),
start_date VARCHAR(20), -- TEXT equivalent
end_date VARCHAR(20), -- TEXT equivalent
year INT UNIQUE, -- BCNF Fix: Year is unique
host_won BIT,
count_teams INT,
group_stage BIT,
second_group_stage BIT,
final_round BIT,
round_of_16 BIT,
quarter_finals BIT,
semi_finals BIT,
third_place_match BIT,
final BIT,
host_team_id VARCHAR(50),
winner_team_id VARCHAR(50),
FOREIGN KEY (host_team_id) REFERENCES TEAMS(team_id),
FOREIGN KEY (winner_team_id) REFERENCES TEAMS(team_id)
-- BCNF Fix: Removed winner (text)
);
CREATE TABLE QUALIFIED_TEAMS (
tournament_id VARCHAR(50) NOT NULL,
team_id VARCHAR(50) NOT NULL,
performance VARCHAR(255) NOT NULL,
PRIMARY KEY (tournament_id, team_id),
FOREIGN KEY (tournament_id) REFERENCES TOURNAMENTS(tournament_id),
FOREIGN KEY (team_id) REFERENCES TEAMS(team_id),
FOREIGN KEY (performance) REFERENCES STAGE_HIERARCHY(stage_name)
);
CREATE TABLE SQUADS (
tournament_id VARCHAR(50) NOT NULL,
team_id VARCHAR(50) NOT NULL,
player_id VARCHAR(50) NOT NULL,
shirt_number INT,
position_code VARCHAR(50),
PRIMARY KEY (tournament_id, team_id, player_id),
FOREIGN KEY (tournament_id) REFERENCES TOURNAMENTS(tournament_id),
FOREIGN KEY (team_id) REFERENCES TEAMS(team_id),
FOREIGN KEY (player_id) REFERENCES PLAYERS(player_id),
FOREIGN KEY (position_code) REFERENCES PLAYER_POSITIONS(position_code)
);
CREATE TABLE TOURNAMENT_STANDINGS (
tournament_id VARCHAR(50) NOT NULL,
team_id VARCHAR(50) NOT NULL,
position INT,
PRIMARY KEY (tournament_id, team_id),
FOREIGN KEY (tournament_id) REFERENCES TOURNAMENTS(tournament_id),
FOREIGN KEY (team_id) REFERENCES TEAMS(team_id)
);
CREATE TABLE AWARD_WINNERS (
tournament_id VARCHAR(50) NOT NULL,
award_id VARCHAR(50) NOT NULL,
player_id VARCHAR(50) NOT NULL,
shared BIT,
PRIMARY KEY (tournament_id, award_id, player_id),
FOREIGN KEY (tournament_id) REFERENCES TOURNAMENTS(tournament_id),
FOREIGN KEY (award_id) REFERENCES AWARDS(award_id),
FOREIGN KEY (player_id) REFERENCES PLAYERS(player_id)
);
GO
-- -----------------------------------------------------------
-- 4. Match & Event Transactions
-- -----------------------------------------------------------
CREATE TABLE MATCHES (
match_id VARCHAR(50) PRIMARY KEY NOT NULL,
tournament_id VARCHAR(50) NOT NULL,
match_name VARCHAR(255),
stage_name VARCHAR(255) NOT NULL,
group_name VARCHAR(255),
replayed BIT,
replay BIT,
match_date VARCHAR(20), -- TEXT equivalent
match_time VARCHAR(20), -- TEXT equivalent
stadium_id VARCHAR(50),
home_team_id VARCHAR(50),
away_team_id VARCHAR(50),
referee_id VARCHAR(50),
home_team_score INT,
away_team_score INT,
extra_time BIT,
penalty_shootout BIT,
score_penalties INT,
home_team_score_penalties INT,
away_team_score_penalties INT,
FOREIGN KEY (tournament_id) REFERENCES TOURNAMENTS(tournament_id),
FOREIGN KEY (stadium_id) REFERENCES STADIUMS(stadium_id),
FOREIGN KEY (home_team_id) REFERENCES TEAMS(team_id),
FOREIGN KEY (away_team_id) REFERENCES TEAMS(team_id),
FOREIGN KEY (referee_id) REFERENCES REFEREES(referee_id),
FOREIGN KEY (stage_name) REFERENCES STAGE_HIERARCHY(stage_name)
-- BCNF Fix: Removed group_stage and knockout_stage flags
);
CREATE TABLE MANAGER_APPEARANCES (
match_id VARCHAR(50) NOT NULL,
team_id VARCHAR(50) NOT NULL,
manager_id VARCHAR(50) NOT NULL,
PRIMARY KEY (match_id, team_id, manager_id),
FOREIGN KEY (match_id) REFERENCES MATCHES(match_id),
FOREIGN KEY (team_id) REFERENCES TEAMS(team_id),
FOREIGN KEY (manager_id) REFERENCES MANAGERS(manager_id)
);
CREATE TABLE PLAYER_APPEARANCES (
match_id VARCHAR(50) NOT NULL,
player_id VARCHAR(50) NOT NULL,
starter BIT,
substitute BIT,
position_code VARCHAR(50),
PRIMARY KEY (match_id, player_id),
FOREIGN KEY (match_id) REFERENCES MATCHES(match_id),
FOREIGN KEY (player_id) REFERENCES PLAYERS(player_id),
FOREIGN KEY (position_code) REFERENCES PLAYER_POSITIONS(position_code)
);
CREATE TABLE GOALS (
goal_id VARCHAR(50) PRIMARY KEY NOT NULL,
match_id VARCHAR(50) NOT NULL,
player_id VARCHAR(50) NOT NULL,
minute_regulation INT,
minute_stoppage INT,
match_period VARCHAR(255),
own_goal BIT,
penalty BIT,
FOREIGN KEY (match_id) REFERENCES MATCHES(match_id),
FOREIGN KEY (player_id) REFERENCES PLAYERS(player_id)
);
CREATE TABLE BOOKINGS (
booking_id VARCHAR(50) PRIMARY KEY NOT NULL,
match_id VARCHAR(50) NOT NULL,
player_id VARCHAR(50) NOT NULL,
minute_regulation INT,
minute_stoppage INT,
match_period VARCHAR(255),
yellow_card BIT,
red_card BIT,
second_yellow_card BIT,
sending_off BIT,
FOREIGN KEY (match_id) REFERENCES MATCHES(match_id),
FOREIGN KEY (player_id) REFERENCES PLAYERS(player_id)
);
CREATE TABLE SUBSTITUTIONS (
substitution_id VARCHAR(50) PRIMARY KEY NOT NULL,
match_id VARCHAR(50) NOT NULL,
player_id VARCHAR(50) NOT NULL,
going_off BIT,
coming_on BIT,
minute_regulation INT,
minute_stoppage INT,
match_period VARCHAR(255),
FOREIGN KEY (match_id) REFERENCES MATCHES(match_id),
FOREIGN KEY (player_id) REFERENCES PLAYERS(player_id)
);
CREATE TABLE PENALTY_KICKS (
penalty_kick_id VARCHAR(50) PRIMARY KEY NOT NULL,
match_id VARCHAR(50) NOT NULL,
player_id VARCHAR(50) NOT NULL,
converted BIT,
FOREIGN KEY (match_id) REFERENCES MATCHES(match_id),
FOREIGN KEY (player_id) REFERENCES PLAYERS(player_id)
);
GO