source: sql/ddl_nutritioneer_1_0.sql

Last change on this file was 2e0035f, checked in by Acko <lavurovski.a65@…>, 8 days ago

Initial Commit

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