Changes between Version 1 and Version 2 of DatabaseCreation


Ignore:
Timestamp:
05/26/26 09:19:41 (17 hours ago)
Author:
231550
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseCreation

    v1 v2  
     1== DDL ==
    12-- Category
    23CREATE TABLE Category (
     
    340341
    341342ALTER TABLE Exercise ALTER COLUMN activity_id SET NOT NULL;
     343
     344== Views ==
     345
     346-- 1. User Profile Overview
     347CREATE VIEW vw_user_profile AS
     348SELECT
     349    u.id,
     350    u.email,
     351    u.height,
     352    u.weight,
     353    u.gender,
     354    u.created_at,
     355    r.name AS role,
     356    d.name AS active_diet,
     357    ud.start_date AS diet_start,
     358    ud.end_date AS diet_end
     359FROM "User" u
     360LEFT JOIN User_roles ur ON u.id = ur.user_id
     361LEFT JOIN Roles r ON ur.role_id = r.id
     362LEFT JOIN User_Diets ud ON u.id = ud.user_id
     363LEFT JOIN Diet d ON ud.Diet_id = d.id;
     364
     365-- 2. Daily Food Log Summary
     366CREATE VIEW vw_daily_food_summary AS
     367SELECT
     368    fl.UserId,
     369    DATE(fl.dateTime) AS log_date,
     370    fl.meal_type,
     371    SUM(CASE WHEN LOWER(n.nutrient) LIKE '%energy-kcal%'
     372        THEN fn.amount * fl.quantity / 100 ELSE 0 END) AS total_calories,
     373    SUM(CASE WHEN LOWER(n.nutrient) LIKE '%protein%'
     374        THEN fn.amount * fl.quantity / 100 ELSE 0 END) AS total_protein,
     375    SUM(CASE WHEN LOWER(n.nutrient) LIKE '%fat%'
     376        THEN fn.amount * fl.quantity / 100 ELSE 0 END) AS total_fat,
     377    SUM(CASE WHEN LOWER(n.nutrient) LIKE '%carbohydrate%'
     378        THEN fn.amount * fl.quantity / 100 ELSE 0 END) AS total_carbs,
     379    COUNT(fl.id) AS total_entries
     380FROM FoodLogs fl
     381JOIN Food_nutrients fn ON fl.FoodId = fn.FoodId
     382JOIN Nutrient n ON fn.NutrientId = n.id
     383GROUP BY fl.UserId, DATE(fl.dateTime), fl.meal_type;
     384
     385-- 3. Exercise Calories Burned per User
     386CREATE VIEW vw_user_calories_burned AS
     387SELECT
     388    al.UserId,
     389    DATE(al.dateTime) AS log_date,
     390    SUM(al.Calories_burned) AS total_calories_burned,
     391    SUM(al.Duration_minutes) AS total_minutes,
     392    COUNT(al.id) AS total_sessions
     393FROM ActivityLogs al
     394GROUP BY al.UserId, DATE(al.dateTime);
     395
     396-- 4. Food Nutritional Info
     397CREATE VIEW vw_food_nutrition AS
     398SELECT
     399    f.id AS food_id,
     400    f.name AS food_name,
     401    f.calories_per_100g,
     402    c.name AS category,
     403    n.nutrient AS nutrient_name,
     404    fn.amount,
     405    fn.unit
     406FROM Food f
     407LEFT JOIN Category c ON f.category_id = c.category_id
     408LEFT JOIN Food_nutrients fn ON f.id = fn.FoodId
     409LEFT JOIN Nutrient n ON fn.NutrientId = n.id;
     410
     411-- 5. User Achievements Progress
     412CREATE VIEW vw_user_achievements AS
     413SELECT
     414    u.id AS user_id,
     415    u.email,
     416    a.name AS achievement_name,
     417    a.requirement_type,
     418    a.target_value,
     419    a.period_type,
     420    ua.dateEarned
     421FROM "User" u
     422JOIN User_achievements ua ON u.id = ua.user_id
     423JOIN Achievements a ON ua.achievement_id = a.id
     424ORDER BY ua.dateEarned DESC;
     425
     426-- 6. User Streak Summary
     427CREATE VIEW vw_user_streaks AS
     428SELECT
     429    u.id AS user_id,
     430    u.email,
     431    st.name AS streak_type,
     432    st.metric_type,
     433    s.current_count,
     434    s.longest_count,
     435    s.last_updated
     436FROM "User" u
     437JOIN Streak s ON u.id = s.User_id
     438JOIN Streak_type st ON s.Streak_type_id = st.id;
     439
     440-- 7. Body Measurements History
     441CREATE VIEW vw_body_measurements AS
     442SELECT
     443    u.id AS user_id,
     444    u.email,
     445    bm.weight,
     446    bm.waist,
     447    bm.body_fat,
     448    bm.dateTime AS measured_at
     449FROM "User" u
     450JOIN BodyMeasurements bm ON u.id = bm.User_id
     451ORDER BY bm.dateTime DESC;
     452
     453-- 8. Diet Plan Details
     454CREATE VIEW vw_diet_plan AS
     455SELECT
     456    d.id AS diet_id,
     457    d.name AS diet_name,
     458    d.calorie_target,
     459    d.protein_target,
     460    d.carb_target,
     461    d.fat_target,
     462    f.name AS food_name,
     463    df.amount AS food_amount,
     464    df.unit AS food_unit,
     465    e.name AS exercise_name,
     466    det.frequency_per_week
     467FROM Diet d
     468LEFT JOIN Diet_foods df ON d.id = df.DietId
     469LEFT JOIN Food f ON df.FoodId = f.id
     470LEFT JOIN Diet_Exercise_Targets det ON d.id = det.DietId
     471LEFT JOIN Exercise e ON det.ExerciseId = e.id;
     472
     473-- 9. Exercise Library
     474CREATE VIEW vw_exercise_library AS
     475SELECT
     476    e.id AS exercise_id,
     477    e.name AS exercise_name,
     478    e.calories_per_minute,
     479    a.name AS activity_type,
     480    STRING_AGG(m.name, ', ') AS muscles_targeted
     481FROM Exercise e
     482LEFT JOIN Activity a ON e.activity_id = a.id
     483LEFT JOIN Exercise_muscles em ON e.id = em.Exercise_id
     484LEFT JOIN Muscle m ON em.Muscle_id = m.id
     485GROUP BY e.id, e.name, e.calories_per_minute, a.name;
     486