RelationalDesign: ddl_nutritioneer_1.0.sql

File ddl_nutritioneer_1.0.sql, 7.1 KB (added by 201165, 2 weeks ago)

version 2_ddl

Line 
1
2CREATE TYPE user_role AS ENUM (
3 'user',
4 'administrator',
5 'trainer'
6);
7
8CREATE TYPE ingredient_type AS ENUM (
9 'dairy',
10 'meat',
11 'fish',
12 'herb',
13 'carb',
14 'vegetable',
15 'fruit',
16 'legume',
17 'nut',
18 'seed',
19 'oil',
20 'spice',
21 'beverage',
22 'other'
23);
24
25CREATE TYPE nutrient_unit AS ENUM (
26 'milligram',
27 'gram',
28 'microgram'
29);
30
31CREATE TYPE nutrient_type AS ENUM (
32 'macro',
33 'micro'
34);
35
36CREATE TYPE restriction_type AS ENUM (
37 'vegan',
38 'vegetarian',
39 'halal',
40 'kosher',
41 'pescatarian',
42 'allergen',
43 'keto',
44 'paleo',
45 'gluten_free',
46 'lactose_free',
47 'diabetic',
48 'low_sodium',
49 'other'
50);
51
52CREATE TYPE post_status AS ENUM (
53 'published',
54 'draft',
55 'archived'
56);
57
58
59CREATE TABLE "user" (
60 email TEXT PRIMARY KEY,
61 username TEXT NOT NULL,
62 password TEXT NOT NULL,
63 role user_role NOT NULL DEFAULT 'user',
64
65 CONSTRAINT uq_user_username UNIQUE (username),
66 CONSTRAINT ck_user_email_format CHECK (email LIKE '%_@_%.__%'),
67 CONSTRAINT ck_user_username_len CHECK (length(username) BETWEEN 3 AND 40),
68 CONSTRAINT ck_user_password_len CHECK (length(password) >= 8)
69);
70
71CREATE TABLE ingredient (
72 name TEXT NOT NULL PRIMARY KEY,
73 description TEXT NOT NULL,
74 energy NUMERIC NOT NULL,
75 kcal NUMERIC NOT NULL,
76 type ingredient_type NOT NULL DEFAULT 'other',
77
78 CONSTRAINT ck_ingredient_energy CHECK (energy >= 0),
79 CONSTRAINT ck_ingredient_kcal CHECK (kcal >= 0),
80);
81
82CREATE TABLE nutrient (
83 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
84 quantity NUMERIC NOT NULL,
85 description TEXT NOT NULL,
86 unit nutrient_unit NOT NULL,
87 type nutrient_type NOT NULL,
88
89 CONSTRAINT uq_nutrient_description UNIQUE (description),
90 CONSTRAINT ck_nutrient_quantity CHECK (quantity > 0)
91);
92
93CREATE TABLE restriction (
94 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
95 description TEXT NOT NULL,
96 type restriction_type NOT NULL,
97
98 CONSTRAINT uq_restriction_description UNIQUE (description)
99);
100
101
102CREATE TABLE recipe (
103 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
104 name TEXT NOT NULL,
105 guide TEXT NOT NULL,
106 kcal_sum NUMERIC NOT NULL,
107 servings NUMERIC NOT NULL DEFAULT 1,
108 user_email TEXT NOT NULL REFERENCES "user"(email) ON DELETE CASCADE,
109
110 CONSTRAINT ck_recipe_kcal_sum CHECK (kcal_sum >= 0),
111 CONSTRAINT ck_recipe_servings CHECK (servings > 0)
112);
113
114
115CREATE TABLE post (
116 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
117 media BYTEA,
118 media_type TEXT,
119 media_name TEXT,
120 is_private BOOLEAN NOT NULL DEFAULT FALSE,
121 is_favourite BOOLEAN NOT NULL DEFAULT FALSE,
122 status post_status NOT NULL DEFAULT 'draft',
123 created_at TIMESTAMP NOT NULL DEFAULT NOW(),
124 created_by TEXT NOT NULL REFERENCES "user"(email) ON DELETE CASCADE,
125 recipe_id BIGINT REFERENCES recipe(id) ON DELETE SET NULL,
126
127 CONSTRAINT ck_post_media_type CHECK (media IS NULL OR media_type IS NOT NULL)
128 CONSTRAINT uq_post_recipe UNIQUE (recipe_id);
129);
130
131CREATE TABLE comment (
132 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
133 description TEXT NOT NULL,
134 created_at TIMESTAMP NOT NULL DEFAULT NOW(),
135 post_id BIGINT NOT NULL REFERENCES post(id) ON DELETE CASCADE,
136 created_by TEXT NOT NULL REFERENCES "user"(email) ON DELETE CASCADE,
137
138 CONSTRAINT ck_comment_not_empty CHECK (length(trim(description)) > 0)
139);
140
141CREATE TABLE grocery_list (
142 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
143 date_time TIMESTAMP NOT NULL DEFAULT NOW(),
144 notes TEXT,
145 is_bought BOOLEAN NOT NULL DEFAULT FALSE,
146 kcal NUMERIC NOT NULL,
147 user_email TEXT NOT NULL REFERENCES "user"(email) ON DELETE CASCADE,
148
149 CONSTRAINT ck_grocery_list_kcal CHECK (kcal >= 0)
150);
151
152CREATE TABLE intake_planner (
153 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
154 date_time TIMESTAMP NOT NULL DEFAULT NOW(),
155 notes TEXT,
156 kcal NUMERIC NOT NULL,
157 is_consumed BOOLEAN NOT NULL DEFAULT FALSE,
158 user_email TEXT NOT NULL REFERENCES "user"(email) ON DELETE CASCADE,
159
160 CONSTRAINT ck_intake_planner_kcal CHECK (kcal >= 0)
161);
162
163CREATE TABLE biometrics (
164 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
165 date DATE NOT NULL,
166 weight NUMERIC,
167 height NUMERIC,
168 age NUMERIC,
169 muscle_fat_ratio NUMERIC,
170 user_email TEXT NOT NULL REFERENCES "user"(email) ON DELETE CASCADE,
171
172 CONSTRAINT uq_biometrics_user_date UNIQUE (user_email, date),
173);
174
175
176CREATE TABLE recipe_contains_ingredient (
177 recipe_id BIGINT NOT NULL REFERENCES recipe(id) ON DELETE CASCADE,
178 ingredient_name TEXT NOT NULL REFERENCES ingredient(name) ON DELETE CASCADE,
179 ingredient_quantity NUMERIC NOT NULL,
180 PRIMARY KEY (recipe_id, ingredient_name),
181
182);
183
184CREATE TABLE ingredient_contains_nutrient (
185 ingredient_name TEXT NOT NULL REFERENCES ingredient(name) ON DELETE CASCADE,
186 nutrient_id BIGINT NOT NULL REFERENCES nutrient(id) ON DELETE CASCADE,
187 quantity NUMERIC NOT NULL,
188 PRIMARY KEY (ingredient_name, nutrient_id),
189
190);
191
192CREATE TABLE recipe_contains_restriction (
193 recipe_id BIGINT NOT NULL REFERENCES recipe(id) ON DELETE CASCADE,
194 restriction_id BIGINT NOT NULL REFERENCES restriction(id) ON DELETE CASCADE,
195 PRIMARY KEY (recipe_id, restriction_id)
196);
197
198CREATE TABLE grocery_list_bulk_add_ingredient (
199 list_id BIGINT NOT NULL REFERENCES grocery_list(id) ON DELETE CASCADE,
200 recipe_id BIGINT NOT NULL REFERENCES recipe(id) ON DELETE CASCADE,
201 PRIMARY KEY (list_id, recipe_id)
202);
203
204CREATE TABLE grocery_list_single_add_ingredient (
205 list_id BIGINT NOT NULL REFERENCES grocery_list(id) ON DELETE CASCADE,
206 ingredient_name TEXT NOT NULL REFERENCES ingredient(name) ON DELETE CASCADE,
207 buy_quantity NUMERIC NOT NULL,
208 PRIMARY KEY (list_id, ingredient_name),
209
210);
211
212CREATE TABLE intake_planner_save_to_list_post (
213 planner_id BIGINT NOT NULL REFERENCES intake_planner(id) ON DELETE CASCADE,
214 post_id BIGINT NOT NULL REFERENCES post(id) ON DELETE CASCADE,
215 PRIMARY KEY (planner_id, post_id)
216);
217
218