| | 1 | -- Category |
| | 2 | CREATE TABLE Category ( |
| | 3 | category_id BIGSERIAL PRIMARY KEY, |
| | 4 | name VARCHAR(255), |
| | 5 | ParentCategory_id BIGINT, |
| | 6 | FOREIGN KEY (ParentCategory_id) REFERENCES Category(category_id) ON DELETE SET NULL ON UPDATE CASCADE |
| | 7 | ); |
| | 8 | |
| | 9 | -- Nutrient |
| | 10 | CREATE TABLE Nutrient ( |
| | 11 | id BIGSERIAL PRIMARY KEY, |
| | 12 | nutrient VARCHAR(255), |
| | 13 | CONSTRAINT uq_nutrient_name UNIQUE (nutrient) |
| | 14 | ); |
| | 15 | |
| | 16 | -- Food |
| | 17 | CREATE TABLE Food ( |
| | 18 | id BIGSERIAL PRIMARY KEY, |
| | 19 | name VARCHAR(255), |
| | 20 | calories_per_100g INT4, |
| | 21 | category_id BIGINT, |
| | 22 | CONSTRAINT chk_food_calories CHECK (calories_per_100g >= 0), |
| | 23 | FOREIGN KEY (category_id) REFERENCES Category(category_id) ON DELETE SET NULL ON UPDATE CASCADE |
| | 24 | ); |
| | 25 | |
| | 26 | -- ServingSize |
| | 27 | CREATE TABLE ServingSize ( |
| | 28 | id BIGSERIAL PRIMARY KEY, |
| | 29 | label VARCHAR(50), |
| | 30 | amount NUMERIC(6, 2), |
| | 31 | unit VARCHAR(10), |
| | 32 | FoodId BIGINT, |
| | 33 | CONSTRAINT chk_servingsize_amount CHECK (amount > 0), |
| | 34 | FOREIGN KEY (FoodId) REFERENCES Food(id) ON DELETE CASCADE ON UPDATE CASCADE |
| | 35 | ); |
| | 36 | |
| | 37 | -- Food_nutrients |
| | 38 | CREATE TABLE Food_nutrients ( |
| | 39 | id BIGSERIAL PRIMARY KEY, |
| | 40 | FoodId BIGINT, |
| | 41 | NutrientId BIGINT, |
| | 42 | amount NUMERIC(8, 2), |
| | 43 | unit VARCHAR(10), |
| | 44 | CONSTRAINT chk_foodnutrients_amount CHECK (amount >= 0), |
| | 45 | FOREIGN KEY (FoodId) REFERENCES Food(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 46 | FOREIGN KEY (NutrientId) REFERENCES Nutrient(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 47 | ); |
| | 48 | |
| | 49 | -- Activity |
| | 50 | CREATE TABLE Activity ( |
| | 51 | id BIGSERIAL PRIMARY KEY, |
| | 52 | name VARCHAR(255), |
| | 53 | CONSTRAINT uq_activity_name UNIQUE (name) |
| | 54 | ); |
| | 55 | |
| | 56 | -- Muscle |
| | 57 | CREATE TABLE Muscle ( |
| | 58 | id BIGSERIAL PRIMARY KEY, |
| | 59 | name VARCHAR(50), |
| | 60 | CONSTRAINT uq_muscle_name UNIQUE (name) |
| | 61 | ); |
| | 62 | |
| | 63 | -- Exercise |
| | 64 | CREATE TABLE Exercise ( |
| | 65 | id BIGSERIAL PRIMARY KEY, |
| | 66 | name VARCHAR(100), |
| | 67 | calories_per_minute NUMERIC(5, 2), |
| | 68 | activity_id BIGINT, |
| | 69 | CONSTRAINT chk_exercise_calories CHECK (calories_per_minute >= 0), |
| | 70 | FOREIGN KEY (activity_id) REFERENCES Activity(id) ON DELETE SET NULL ON UPDATE CASCADE |
| | 71 | ); |
| | 72 | |
| | 73 | -- Exercise_muscles |
| | 74 | CREATE TABLE Exercise_muscles ( |
| | 75 | id BIGSERIAL PRIMARY KEY, |
| | 76 | Exercise_id BIGINT, |
| | 77 | Muscle_id BIGINT, |
| | 78 | FOREIGN KEY (Exercise_id) REFERENCES Exercise(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 79 | FOREIGN KEY (Muscle_id) REFERENCES Muscle(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 80 | ); |
| | 81 | |
| | 82 | -- Roles |
| | 83 | CREATE TABLE Roles ( |
| | 84 | id BIGSERIAL PRIMARY KEY, |
| | 85 | name VARCHAR(255), |
| | 86 | CONSTRAINT uq_roles_name UNIQUE (name) |
| | 87 | ); |
| | 88 | |
| | 89 | -- User |
| | 90 | CREATE TABLE "User" ( |
| | 91 | id BIGSERIAL PRIMARY KEY, |
| | 92 | username VARCHAR(255), |
| | 93 | email VARCHAR(255), |
| | 94 | password VARCHAR(255), |
| | 95 | height INT4, |
| | 96 | weight INT4, |
| | 97 | gender VARCHAR(20), |
| | 98 | created_at TIMESTAMP, |
| | 99 | CONSTRAINT uq_user_email UNIQUE (email), |
| | 100 | CONSTRAINT chk_user_email CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'), |
| | 101 | CONSTRAINT chk_user_gender CHECK (gender IN ('male', 'female')) |
| | 102 | ); |
| | 103 | |
| | 104 | -- User_roles |
| | 105 | CREATE TABLE User_roles ( |
| | 106 | id BIGSERIAL PRIMARY KEY, |
| | 107 | user_id BIGINT, |
| | 108 | role_id BIGINT, |
| | 109 | FOREIGN KEY (user_id) REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 110 | FOREIGN KEY (role_id) REFERENCES Roles(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 111 | ); |
| | 112 | |
| | 113 | -- Achievements |
| | 114 | CREATE TABLE Achievements ( |
| | 115 | id BIGSERIAL PRIMARY KEY, |
| | 116 | name VARCHAR(255), |
| | 117 | requirement_type VARCHAR(50), |
| | 118 | target_value NUMERIC(8, 2), |
| | 119 | period_type VARCHAR(50), |
| | 120 | Activity_id BIGINT, |
| | 121 | CONSTRAINT chk_achievements_target CHECK (target_value > 0), |
| | 122 | CONSTRAINT chk_achievements_period CHECK (period_type IN ('daily', 'weekly', 'monthly', 'all_time')), |
| | 123 | CONSTRAINT chk_achievements_reqtype CHECK (requirement_type IN ('count', 'duration', 'calories', 'streak')), |
| | 124 | FOREIGN KEY (Activity_id) REFERENCES Activity(id) ON DELETE SET NULL ON UPDATE CASCADE |
| | 125 | ); |
| | 126 | |
| | 127 | -- User_achievements |
| | 128 | CREATE TABLE User_achievements ( |
| | 129 | id BIGSERIAL PRIMARY KEY, |
| | 130 | user_id BIGINT, |
| | 131 | achievement_id BIGINT, |
| | 132 | dateEarned DATE, |
| | 133 | FOREIGN KEY (user_id) REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 134 | FOREIGN KEY (achievement_id) REFERENCES Achievements(id) ON DELETE CASCADE ON UPDATE CASCADE |
| | 135 | ); |
| | 136 | |
| | 137 | -- Reminder |
| | 138 | CREATE TABLE Reminder ( |
| | 139 | id BIGSERIAL PRIMARY KEY, |
| | 140 | dateTime TIMESTAMP, |
| | 141 | UserId BIGINT, |
| | 142 | type VARCHAR(20), |
| | 143 | enabled BOOL, |
| | 144 | CONSTRAINT chk_reminder_type CHECK (type IN ('meal', 'exercise', 'water')), |
| | 145 | FOREIGN KEY (UserId) REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE |
| | 146 | ); |
| | 147 | |
| | 148 | -- BodyMeasurements |
| | 149 | CREATE TABLE BodyMeasurements ( |
| | 150 | id BIGSERIAL PRIMARY KEY, |
| | 151 | User_id BIGINT, |
| | 152 | weight NUMERIC(5, 2), |
| | 153 | waist NUMERIC(5, 2), |
| | 154 | body_fat NUMERIC(5, 2), |
| | 155 | dateTime TIMESTAMP, |
| | 156 | CONSTRAINT chk_bm_weight CHECK (weight > 0), |
| | 157 | CONSTRAINT chk_bm_bodyfat CHECK (body_fat BETWEEN 0 AND 100), |
| | 158 | CONSTRAINT chk_bm_waist CHECK (waist > 0), |
| | 159 | FOREIGN KEY (User_id) REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE |
| | 160 | ); |
| | 161 | |
| | 162 | -- ActivityLogs |
| | 163 | CREATE TABLE ActivityLogs ( |
| | 164 | id BIGSERIAL PRIMARY KEY, |
| | 165 | dateTime TIMESTAMP, |
| | 166 | UserId BIGINT, |
| | 167 | Duration_minutes INT4, |
| | 168 | Calories_burned NUMERIC(8, 2), |
| | 169 | ExerciseId BIGINT, |
| | 170 | CONSTRAINT chk_activitylogs_duration CHECK (Duration_minutes > 0), |
| | 171 | CONSTRAINT chk_activitylogs_calories CHECK (Calories_burned >= 0), |
| | 172 | FOREIGN KEY (UserId) REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 173 | FOREIGN KEY (ExerciseId) REFERENCES Exercise(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 174 | ); |
| | 175 | |
| | 176 | -- FoodLogs |
| | 177 | CREATE TABLE FoodLogs ( |
| | 178 | id BIGSERIAL PRIMARY KEY, |
| | 179 | quantity NUMERIC(10, 2), |
| | 180 | unit VARCHAR(10), |
| | 181 | meal_type VARCHAR(20), |
| | 182 | dateTime TIMESTAMP, |
| | 183 | UserId BIGINT, |
| | 184 | FoodId BIGINT, |
| | 185 | CONSTRAINT chk_foodlogs_quantity CHECK (quantity > 0), |
| | 186 | CONSTRAINT chk_foodlogs_mealtype CHECK (meal_type IN ('breakfast', 'lunch', 'dinner', 'snack')), |
| | 187 | FOREIGN KEY (UserId) REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 188 | FOREIGN KEY (FoodId) REFERENCES Food(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 189 | ); |
| | 190 | |
| | 191 | -- Streak_type |
| | 192 | CREATE TABLE Streak_type ( |
| | 193 | id BIGSERIAL PRIMARY KEY, |
| | 194 | name VARCHAR(255), |
| | 195 | description VARCHAR(255), |
| | 196 | metric_type VARCHAR(50), |
| | 197 | CONSTRAINT chk_streaktype_metric CHECK (metric_type IN ('steps', 'calories', 'workouts')), |
| | 198 | CONSTRAINT uq_streak_type_name UNIQUE (name) |
| | 199 | ); |
| | 200 | |
| | 201 | -- Streak |
| | 202 | CREATE TABLE Streak ( |
| | 203 | id BIGSERIAL PRIMARY KEY, |
| | 204 | User_id BIGINT, |
| | 205 | Streak_type_id BIGINT, |
| | 206 | current_count INT4, |
| | 207 | longest_count INT4, |
| | 208 | last_updated DATE, |
| | 209 | CONSTRAINT chk_streak_current CHECK (current_count >= 0), |
| | 210 | CONSTRAINT chk_streak_longest CHECK (longest_count >= 0), |
| | 211 | CONSTRAINT chk_streak_counts CHECK (longest_count >= current_count), |
| | 212 | FOREIGN KEY (User_id) REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 213 | FOREIGN KEY (Streak_type_id) REFERENCES Streak_type(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 214 | ); |
| | 215 | |
| | 216 | -- Diet |
| | 217 | CREATE TABLE Diet ( |
| | 218 | id BIGSERIAL PRIMARY KEY, |
| | 219 | name VARCHAR(255), |
| | 220 | calorie_target INT4, |
| | 221 | protein_target INT4, |
| | 222 | carb_target INT4, |
| | 223 | fat_target INT4, |
| | 224 | CONSTRAINT chk_diet_calories CHECK (calorie_target > 0), |
| | 225 | CONSTRAINT chk_diet_protein CHECK (protein_target >= 0), |
| | 226 | CONSTRAINT chk_diet_carb CHECK (carb_target >= 0), |
| | 227 | CONSTRAINT chk_diet_fat CHECK (fat_target >= 0) |
| | 228 | ); |
| | 229 | |
| | 230 | -- User_Diets |
| | 231 | CREATE TABLE User_Diets ( |
| | 232 | id BIGSERIAL PRIMARY KEY, |
| | 233 | user_id BIGINT, |
| | 234 | Diet_id BIGINT, |
| | 235 | start_date DATE, |
| | 236 | end_date DATE, |
| | 237 | CONSTRAINT chk_diet_dates CHECK (end_date >= start_date), |
| | 238 | FOREIGN KEY (user_id) REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 239 | FOREIGN KEY (Diet_id) REFERENCES Diet(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 240 | ); |
| | 241 | |
| | 242 | -- Diet_Exercise_Targets |
| | 243 | CREATE TABLE Diet_Exercise_Targets ( |
| | 244 | id BIGSERIAL PRIMARY KEY, |
| | 245 | frequency_per_week INT4, |
| | 246 | DietId BIGINT, |
| | 247 | ExerciseId BIGINT, |
| | 248 | CONSTRAINT chk_det_frequency CHECK (frequency_per_week BETWEEN 1 AND 7), |
| | 249 | FOREIGN KEY (DietId) REFERENCES Diet(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 250 | FOREIGN KEY (ExerciseId) REFERENCES Exercise(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 251 | ); |
| | 252 | |
| | 253 | -- Diet_foods |
| | 254 | CREATE TABLE Diet_foods ( |
| | 255 | id BIGSERIAL PRIMARY KEY, |
| | 256 | unit VARCHAR(10), |
| | 257 | amount NUMERIC(10, 2), |
| | 258 | DietId BIGINT, |
| | 259 | FoodId BIGINT, |
| | 260 | CONSTRAINT chk_dietfoods_amount CHECK (amount > 0), |
| | 261 | FOREIGN KEY (DietId) REFERENCES Diet(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 262 | FOREIGN KEY (FoodId) REFERENCES Food(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 263 | ); |
| | 264 | |
| | 265 | -- Goal |
| | 266 | CREATE TABLE Goal ( |
| | 267 | id BIGSERIAL PRIMARY KEY, |
| | 268 | name VARCHAR(255), |
| | 269 | diet_id BIGINT, |
| | 270 | FOREIGN KEY (diet_id) REFERENCES Diet(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 271 | ); |
| | 272 | |
| | 273 | |
| | 274 | -- User_goals |
| | 275 | CREATE TABLE User_goals ( |
| | 276 | id BIGSERIAL PRIMARY KEY, |
| | 277 | user_id BIGINT, |
| | 278 | GoalId BIGINT, |
| | 279 | start_date DATE, |
| | 280 | end_date DATE, |
| | 281 | CONSTRAINT chk_usergoals_dates CHECK (end_date >= start_date), |
| | 282 | FOREIGN KEY (user_id) REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 283 | FOREIGN KEY (GoalId) REFERENCES Goal(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 284 | ); |
| | 285 | |
| | 286 | ALTER TABLE "User" ALTER COLUMN height SET NOT NULL; |
| | 287 | ALTER TABLE "User" ALTER COLUMN weight SET NOT NULL; |
| | 288 | ALTER TABLE "User" ALTER COLUMN gender SET NOT NULL; |
| | 289 | |
| | 290 | ALTER TABLE Food ALTER COLUMN category_id SET NOT NULL; |
| | 291 | |
| | 292 | ALTER TABLE FoodLogs ALTER COLUMN UserId SET NOT NULL; |
| | 293 | ALTER TABLE FoodLogs ALTER COLUMN FoodId SET NOT NULL; |
| | 294 | |
| | 295 | ALTER TABLE ActivityLogs ALTER COLUMN UserId SET NOT NULL; |
| | 296 | ALTER TABLE ActivityLogs ALTER COLUMN ExerciseId SET NOT NULL; |
| | 297 | ALTER TABLE ActivityLogs ALTER COLUMN Calories_burned SET NOT NULL; |
| | 298 | |
| | 299 | ALTER TABLE BodyMeasurements ALTER COLUMN User_id SET NOT NULL; |
| | 300 | |
| | 301 | ALTER TABLE Reminder ALTER COLUMN UserId SET NOT NULL; |
| | 302 | ALTER TABLE Reminder ALTER COLUMN enabled SET NOT NULL; |
| | 303 | |
| | 304 | ALTER TABLE Streak ALTER COLUMN User_id SET NOT NULL; |
| | 305 | ALTER TABLE Streak ALTER COLUMN Streak_type_id SET NOT NULL; |
| | 306 | |
| | 307 | ALTER TABLE User_achievements ALTER COLUMN user_id SET NOT NULL; |
| | 308 | ALTER TABLE User_achievements ALTER COLUMN achievement_id SET NOT NULL; |
| | 309 | ALTER TABLE User_achievements ALTER COLUMN dateEarned SET NOT NULL; |
| | 310 | |
| | 311 | ALTER TABLE User_roles ALTER COLUMN user_id SET NOT NULL; |
| | 312 | ALTER TABLE User_roles ALTER COLUMN role_id SET NOT NULL; |
| | 313 | |
| | 314 | ALTER TABLE User_goals ALTER COLUMN user_id SET NOT NULL; |
| | 315 | ALTER TABLE User_goals ALTER COLUMN GoalId SET NOT NULL; |
| | 316 | |
| | 317 | ALTER TABLE User_Diets ALTER COLUMN user_id SET NOT NULL; |
| | 318 | ALTER TABLE User_Diets ALTER COLUMN Diet_id SET NOT NULL; |
| | 319 | |
| | 320 | ALTER TABLE Diet_Exercise_Targets ALTER COLUMN DietId SET NOT NULL; |
| | 321 | ALTER TABLE Diet_Exercise_Targets ALTER COLUMN ExerciseId SET NOT NULL; |
| | 322 | ALTER TABLE Diet_Exercise_Targets ALTER COLUMN frequency_per_week SET NOT NULL; |
| | 323 | |
| | 324 | ALTER TABLE Diet_foods ALTER COLUMN DietId SET NOT NULL; |
| | 325 | ALTER TABLE Diet_foods ALTER COLUMN FoodId SET NOT NULL; |
| | 326 | ALTER TABLE Diet_foods ALTER COLUMN unit SET NOT NULL; |
| | 327 | |
| | 328 | ALTER TABLE ServingSize ALTER COLUMN FoodId SET NOT NULL; |
| | 329 | ALTER TABLE ServingSize ALTER COLUMN unit SET NOT NULL; |
| | 330 | |
| | 331 | ALTER TABLE Food_nutrients ALTER COLUMN FoodId SET NOT NULL; |
| | 332 | ALTER TABLE Food_nutrients ALTER COLUMN NutrientId SET NOT NULL; |
| | 333 | |
| | 334 | ALTER TABLE Exercise_muscles ALTER COLUMN Exercise_id SET NOT NULL; |
| | 335 | ALTER TABLE Exercise_muscles ALTER COLUMN Muscle_id SET NOT NULL; |
| | 336 | |
| | 337 | ALTER TABLE Goal ALTER COLUMN diet_id SET NOT NULL; |
| | 338 | |
| | 339 | ALTER TABLE Streak_type ALTER COLUMN description SET NOT NULL; |
| | 340 | |
| | 341 | ALTER TABLE Exercise ALTER COLUMN activity_id SET NOT NULL; |