Changes between Initial Version and Version 1 of DatabaseCreation


Ignore:
Timestamp:
05/26/26 09:17:48 (13 hours ago)
Author:
231550
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseCreation

    v1 v1  
     1-- Category
     2CREATE 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
     10CREATE TABLE Nutrient (
     11    id BIGSERIAL PRIMARY KEY,
     12    nutrient VARCHAR(255),
     13    CONSTRAINT uq_nutrient_name UNIQUE (nutrient)
     14);
     15
     16-- Food
     17CREATE 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
     27CREATE 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
     38CREATE 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
     50CREATE TABLE Activity (
     51    id BIGSERIAL PRIMARY KEY,
     52    name VARCHAR(255),
     53    CONSTRAINT uq_activity_name UNIQUE (name)
     54);
     55
     56-- Muscle
     57CREATE TABLE Muscle (
     58    id BIGSERIAL PRIMARY KEY,
     59    name VARCHAR(50),
     60    CONSTRAINT uq_muscle_name UNIQUE (name)
     61);
     62
     63-- Exercise
     64CREATE 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
     74CREATE 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
     83CREATE TABLE Roles (
     84    id BIGSERIAL PRIMARY KEY,
     85    name VARCHAR(255),
     86    CONSTRAINT uq_roles_name UNIQUE (name)
     87);
     88
     89-- User
     90CREATE 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
     105CREATE 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
     114CREATE 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
     128CREATE 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
     138CREATE 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
     149CREATE 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
     163CREATE 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
     177CREATE 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
     192CREATE 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
     202CREATE 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
     217CREATE 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
     231CREATE 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
     243CREATE 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
     254CREATE 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
     266CREATE 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
     275CREATE 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
     286ALTER TABLE "User" ALTER COLUMN height SET NOT NULL;
     287ALTER TABLE "User" ALTER COLUMN weight SET NOT NULL;
     288ALTER TABLE "User" ALTER COLUMN gender SET NOT NULL;
     289
     290ALTER TABLE Food ALTER COLUMN category_id SET NOT NULL;
     291
     292ALTER TABLE FoodLogs ALTER COLUMN UserId SET NOT NULL;
     293ALTER TABLE FoodLogs ALTER COLUMN FoodId SET NOT NULL;
     294
     295ALTER TABLE ActivityLogs ALTER COLUMN UserId SET NOT NULL;
     296ALTER TABLE ActivityLogs ALTER COLUMN ExerciseId SET NOT NULL;
     297ALTER TABLE ActivityLogs ALTER COLUMN Calories_burned SET NOT NULL;
     298
     299ALTER TABLE BodyMeasurements ALTER COLUMN User_id SET NOT NULL;
     300
     301ALTER TABLE Reminder ALTER COLUMN UserId SET NOT NULL;
     302ALTER TABLE Reminder ALTER COLUMN enabled SET NOT NULL;
     303
     304ALTER TABLE Streak ALTER COLUMN User_id SET NOT NULL;
     305ALTER TABLE Streak ALTER COLUMN Streak_type_id SET NOT NULL;
     306
     307ALTER TABLE User_achievements ALTER COLUMN user_id SET NOT NULL;
     308ALTER TABLE User_achievements ALTER COLUMN achievement_id SET NOT NULL;
     309ALTER TABLE User_achievements ALTER COLUMN dateEarned SET NOT NULL;
     310
     311ALTER TABLE User_roles ALTER COLUMN user_id SET NOT NULL;
     312ALTER TABLE User_roles ALTER COLUMN role_id SET NOT NULL;
     313
     314ALTER TABLE User_goals ALTER COLUMN user_id SET NOT NULL;
     315ALTER TABLE User_goals ALTER COLUMN GoalId SET NOT NULL;
     316
     317ALTER TABLE User_Diets ALTER COLUMN user_id SET NOT NULL;
     318ALTER TABLE User_Diets ALTER COLUMN Diet_id SET NOT NULL;
     319
     320ALTER TABLE Diet_Exercise_Targets ALTER COLUMN DietId SET NOT NULL;
     321ALTER TABLE Diet_Exercise_Targets ALTER COLUMN ExerciseId SET NOT NULL;
     322ALTER TABLE Diet_Exercise_Targets ALTER COLUMN frequency_per_week SET NOT NULL;
     323
     324ALTER TABLE Diet_foods ALTER COLUMN DietId SET NOT NULL;
     325ALTER TABLE Diet_foods ALTER COLUMN FoodId SET NOT NULL;
     326ALTER TABLE Diet_foods ALTER COLUMN unit SET NOT NULL;
     327
     328ALTER TABLE ServingSize ALTER COLUMN FoodId SET NOT NULL;
     329ALTER TABLE ServingSize ALTER COLUMN unit SET NOT NULL;
     330
     331ALTER TABLE Food_nutrients ALTER COLUMN FoodId SET NOT NULL;
     332ALTER TABLE Food_nutrients ALTER COLUMN NutrientId SET NOT NULL;
     333
     334ALTER TABLE Exercise_muscles ALTER COLUMN Exercise_id SET NOT NULL;
     335ALTER TABLE Exercise_muscles ALTER COLUMN Muscle_id SET NOT NULL;
     336
     337ALTER TABLE Goal ALTER COLUMN diet_id SET NOT NULL;
     338
     339ALTER TABLE Streak_type ALTER COLUMN description SET NOT NULL;
     340
     341ALTER TABLE Exercise ALTER COLUMN activity_id SET NOT NULL;