| | 1 | {{{#!sql |
| | 2 | -- Delete tables if they exist |
| | 3 | DROP TABLE IF EXISTS product; |
| | 4 | DROP TABLE IF EXISTS image; |
| | 5 | DROP TABLE IF EXISTS color; |
| | 6 | DROP TABLE IF EXISTS store; |
| | 7 | DROP TABLE IF EXISTS personal; |
| | 8 | DROP TABLE IF EXISTS permissions; |
| | 9 | DROP TABLE IF EXISTS boss; |
| | 10 | DROP TABLE IF EXISTS employees; |
| | 11 | DROP TABLE IF EXISTS client; |
| | 12 | DROP TABLE IF EXISTS delivery_address; |
| | 13 | DROP TABLE IF EXISTS "order"; |
| | 14 | DROP TABLE IF EXISTS report; |
| | 15 | DROP TABLE IF EXISTS monthly_profit; |
| | 16 | DROP TABLE IF EXISTS request; |
| | 17 | DROP TABLE IF EXISTS makes_request; |
| | 18 | DROP TABLE IF EXISTS answers; |
| | 19 | DROP TABLE IF EXISTS for_store; |
| | 20 | DROP TABLE IF EXISTS review; |
| | 21 | DROP TABLE IF EXISTS "change"; |
| | 22 | DROP TABLE IF EXISTS makes_change; |
| | 23 | -- DROP TABLE IF EXISTS made_on CASCADE; |
| | 24 | DROP TABLE IF EXISTS works_in_store; |
| | 25 | DROP TABLE IF EXISTS worked; |
| | 26 | DROP TABLE IF EXISTS sells; |
| | 27 | DROP TABLE IF EXISTS includes; |
| | 28 | DROP TABLE IF EXISTS approves; |
| | 29 | DROP TABLE IF EXISTS exchanges_data; |
| | 30 | |
| | 31 | |
| | 32 | -- Table 0 |
| | 33 | -- Create CATEGORY table |
| | 34 | CREATE TABLE category ( |
| | 35 | id SERIAL PRIMARY KEY, |
| | 36 | name VARCHAR(50) NOT NULL, |
| | 37 | parent_category_id INTEGER REFERENCES category(id) |
| | 38 | ); |
| | 39 | |
| | 40 | -- Table 1 |
| | 41 | -- Create PRODUCT table |
| | 42 | CREATE TABLE product ( |
| | 43 | code VARCHAR(8) PRIMARY KEY DEFAULT -1, -- In format 3 digits for store, 5 digits for product (Total 8 digits). Ex. 00100155, 01500020,... |
| | 44 | price DECIMAL(10,2) NOT NULL CHECK (price >= 0.0), |
| | 45 | availability INTEGER NOT NULL, |
| | 46 | weight DECIMAL(5,2) NOT NULL CHECK (weight > 0), -- Shown in kg |
| | 47 | width_x_length_x_depth VARCHAR(20) NOT NULL, |
| | 48 | aprox_production_time INTEGER NOT NULL, |
| | 49 | description VARCHAR(500) NOT NULL, |
| | 50 | cathegory_id INTEGER NOT NULL REFERENCES category(id) |
| | 51 | ON DELETE SET DEFAULT |
| | 52 | ); |
| | 53 | |
| | 54 | -- Table 2 |
| | 55 | -- Create IMAGE table |
| | 56 | CREATE TABLE image( |
| | 57 | product_code VARCHAR(8) REFERENCES product(code) |
| | 58 | ON DELETE CASCADE, |
| | 59 | image VARCHAR NOT NULL DEFAULT 'Image NOT found!' |
| | 60 | ); |
| | 61 | |
| | 62 | -- Table 3 |
| | 63 | -- Create COLOR table |
| | 64 | CREATE TABLE color ( |
| | 65 | product_code VARCHAR(8) REFERENCES product(code) |
| | 66 | ON DELETE CASCADE, |
| | 67 | color VARCHAR(50) |
| | 68 | ); |
| | 69 | |
| | 70 | -- Table 4 |
| | 71 | -- Create STORE table |
| | 72 | CREATE TABLE store ( |
| | 73 | store_ID VARCHAR(3) PRIMARY KEY, -- In the format of 3 digits. Example : 001, 101, 567, 996,... |
| | 74 | name VARCHAR(50) UNIQUE NOT NULL, |
| | 75 | date_of_founding DATE NOT NULL, |
| | 76 | physical_address VARCHAR(100) NOT NULL, -- ADDRESS FORMAT : st.(st-name) num.(unit-num), (city) (post-code), (country)????? |
| | 77 | store_email VARCHAR(40) UNIQUE NOT NULL CHECK (store_email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'), |
| | 78 | rating DECIMAL(2,1) NOT NULL DEFAULT 0 CHECK (rating>=0.0 AND rating<=5.0) |
| | 79 | ); |
| | 80 | |
| | 81 | -- Table 5 |
| | 82 | -- Create PERSONAL table |
| | 83 | CREATE TABLE personal ( |
| | 84 | ssn VARCHAR(13) PRIMARY KEY CHECK (ssn ~ '^[0-9]{13}$'), -- Format 13 digits : 0101001451001, 1209995423736,... |
| | 85 | first_name VARCHAR(20) NOT NULL, |
| | 86 | last_name VARCHAR(20) NOT NULL, |
| | 87 | email VARCHAR(50) UNIQUE NOT NULL CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'), |
| | 88 | password VARCHAR NOT NULL |
| | 89 | ); |
| | 90 | |
| | 91 | -- Table 6 |
| | 92 | -- Create PERMISSIONS table |
| | 93 | CREATE TABLE permissions ( |
| | 94 | personal_SSN VARCHAR(13) PRIMARY KEY REFERENCES personal(ssn) |
| | 95 | ON DELETE CASCADE, |
| | 96 | type VARCHAR(100) UNIQUE NOT NULL, |
| | 97 | authorisation VARCHAR(50) NOT NULL |
| | 98 | ); |
| | 99 | |
| | 100 | -- Table 7 |
| | 101 | -- Create BOSS table |
| | 102 | CREATE TABLE boss ( |
| | 103 | boss_SSN VARCHAR(13) PRIMARY KEY REFERENCES personal(ssn) |
| | 104 | ON DELETE CASCADE |
| | 105 | ); |
| | 106 | |
| | 107 | -- Table 8 |
| | 108 | -- Create EMPLOYEES table |
| | 109 | CREATE TABLE employees ( |
| | 110 | employee_SSN VARCHAR(13) PRIMARY KEY REFERENCES personal(ssn) |
| | 111 | ON DELETE CASCADE, |
| | 112 | date_of_hire DATE NOT NULL |
| | 113 | ); |
| | 114 | |
| | 115 | -- Table 9 |
| | 116 | -- Create CLIENT table |
| | 117 | CREATE TABLE client ( |
| | 118 | client_ID SERIAL PRIMARY KEY, -- Format, just an order of an integer, starting from 1000. EX : 1005, 1023, 1200, ... |
| | 119 | first_name VARCHAR(50) NOT NULL, |
| | 120 | last_name VARCHAR(50) NOT NULL, |
| | 121 | email VARCHAR(50) UNIQUE NOT NULL CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'), |
| | 122 | password VARCHAR NOT NULL |
| | 123 | ); |
| | 124 | |
| | 125 | -- Table 10 |
| | 126 | -- Create DELIVERY_ADDRESS table |
| | 127 | CREATE TABLE delivery_address ( |
| | 128 | client_ID INTEGER PRIMARY KEY REFERENCES client(client_ID) |
| | 129 | ON DELETE CASCADE, |
| | 130 | address VARCHAR(200) NOT NULL, -- ADDRESS FORMAT : st.(st-name) num.(unit-num) |
| | 131 | city VARCHAR(30) NOT NULL, |
| | 132 | postcode VARCHAR(20) NOT NULL, |
| | 133 | country VARCHAR(40) NOT NULL, |
| | 134 | is_default BOOLEAN DEFAULT True |
| | 135 | ); |
| | 136 | |
| | 137 | -- Table 11 |
| | 138 | -- Create ORDER table |
| | 139 | CREATE TABLE "order" ( |
| | 140 | order_num VARCHAR(11) PRIMARY KEY, -- In the format: 3 digits for store ID, 3 digits for year when order is placed, 5 digits for the number of order for that store in that year |
| | 141 | client_ID INTEGER REFERENCES client(client_ID) |
| | 142 | ON DELETE CASCADE, |
| | 143 | quantity INTEGER NOT NULL, |
| | 144 | status VARCHAR(20) NOT NULL DEFAULT 'placed order', |
| | 145 | last_date_mod TIMESTAMP NOT NULL, |
| | 146 | payment_method VARCHAR (250) NOT NULL, -- Format : "credit card, **** **** **** 6750" , or "cash", or "paypal, user@gmail.com",... Contains important information that are going to be needed when issuing a refund |
| | 147 | discount DECIMAL(5,2) DEFAULT 0.0 CHECK(discount>=0.0 AND discount<= 100.00), |
| | 148 | CONSTRAINT check_status (status IN ('placed order', 'being processed', 'shipping', 'delivered', 'canceled')) |
| | 149 | ); |
| | 150 | |
| | 151 | -- Should there be also a table for refund??? |
| | 152 | |
| | 153 | -- Table 12 |
| | 154 | -- Create REPORT table |
| | 155 | CREATE TABLE report ( |
| | 156 | date TIMESTAMP NOT NULL, |
| | 157 | store_ID VARCHAR(3) NOT NULL REFERENCES store(store_ID) |
| | 158 | ON DELETE CASCADE, |
| | 159 | overall_profit NUMERIC NOT NULL DEFAULT 0.0 CHECK(overall_profit>=0), |
| | 160 | sales_trend VARCHAR NOT NULL, -- graph |
| | 161 | marketing_growth VARCHAR NOT NULL, -- graph |
| | 162 | owner_signature VARCHAR(30) NOT NULL, |
| | 163 | PRIMARY KEY (date, store_ID) |
| | 164 | ); |
| | 165 | |
| | 166 | -- Table 13 |
| | 167 | -- Create MONTHLY_PROFIT table |
| | 168 | CREATE TABLE monthly_profit ( |
| | 169 | report_date TIMESTAMP NOT NULL, |
| | 170 | store_ID VARCHAR(3) NOT NULL, |
| | 171 | month_and_year DATE NOT NULL, |
| | 172 | profit NUMERIC NOT NULL DEFAULT 0.0, |
| | 173 | PRIMARY KEY(report_date, store_ID), |
| | 174 | FOREIGN KEY (report_date, store_ID) REFERENCES report(date, store_ID) |
| | 175 | ON DELETE CASCADE |
| | 176 | ); |
| | 177 | |
| | 178 | -- Table 14 |
| | 179 | -- Create REQUEST table |
| | 180 | CREATE TABLE request ( |
| | 181 | request_num VARCHAR(14) PRIMARY KEY, -- Format: 3 digits for store ID, 2 digits for month in which the request is placed, 3 digits for year, 4 digits for client, 2 digits for request number |
| | 182 | date_and_time TIMESTAMP NOT NULL, |
| | 183 | problem VARCHAR(300) NOT NULL, |
| | 184 | notes_of_communication VARCHAR, |
| | 185 | customer_satisfaction NUMERIC NOT NULL -- Fixed from "costumer" to "customer" |
| | 186 | ); |
| | 187 | |
| | 188 | -- Table 15 |
| | 189 | -- Create MAKES_REQUEST table |
| | 190 | CREATE TABLE makes_request ( |
| | 191 | client_ID INTEGER NOT NULL REFERENCES client(client_ID) |
| | 192 | ON DELETE CASCADE, |
| | 193 | order_num VARCHAR(11) UNIQUE NOT NULL REFERENCES "order"(order_num) |
| | 194 | ON DELETE CASCADE, |
| | 195 | PRIMARY KEY(client_ID, order_num) |
| | 196 | ); |
| | 197 | |
| | 198 | -- Table 16 |
| | 199 | -- Create ANSWERS table |
| | 200 | CREATE TABLE answers ( |
| | 201 | request_num VARCHAR(14) REFERENCES request(request_num) |
| | 202 | ON DELETE CASCADE, |
| | 203 | personal_SSN VARCHAR(13) NOT NULL REFERENCES personal(ssn) |
| | 204 | ON DELETE CASCADE, |
| | 205 | PRIMARY KEY(request_num, personal_SSN) |
| | 206 | ); |
| | 207 | |
| | 208 | -- Table 17 |
| | 209 | -- Create FOR_STORE table |
| | 210 | CREATE TABLE for_store ( |
| | 211 | request_num VARCHAR(14) REFERENCES request(request_num) |
| | 212 | ON DELETE CASCADE, |
| | 213 | store_ID VARCHAR(3) REFERENCES store(store_ID) |
| | 214 | ON DELETE CASCADE, |
| | 215 | PRIMARY KEY(request_num, store_ID) |
| | 216 | ); |
| | 217 | |
| | 218 | -- Table 18 |
| | 219 | -- Create REVIEW table |
| | 220 | CREATE TABLE review ( |
| | 221 | order_num VARCHAR(11) PRIMARY KEY REFERENCES "order"(order_num) |
| | 222 | ON DELETE CASCADE, -- Should the review be deleted when the order is deleted? |
| | 223 | comment VARCHAR(300), |
| | 224 | rating NUMERIC NOT NULL, |
| | 225 | last_mod_date TIMESTAMP NOT NULL |
| | 226 | ); |
| | 227 | |
| | 228 | -- Table 19 |
| | 229 | -- Create CHANGE table |
| | 230 | CREATE TABLE "change" ( |
| | 231 | date_and_time TIMESTAMP NOT NULL, |
| | 232 | product_code VARCHAR(8) REFERENCES product(code) |
| | 233 | ON DELETE CASCADE, |
| | 234 | changes VARCHAR NOT NULL, |
| | 235 | PRIMARY KEY (date_and_time, product_code) |
| | 236 | ); |
| | 237 | |
| | 238 | -- Table 20 |
| | 239 | -- Create MAKES_CHANGE table |
| | 240 | CREATE TABLE makes_change ( |
| | 241 | personal_SSN VARCHAR(13) REFERENCES personal(ssn) |
| | 242 | ON DELETE CASCADE, |
| | 243 | change_date_time TIMESTAMP, |
| | 244 | product_code VARCHAR(8), |
| | 245 | PRIMARY KEY(personal_SSN, change_date_time, product_code), |
| | 246 | FOREIGN KEY (change_date_time, product_code) REFERENCES "change"(date_and_time, product_code) |
| | 247 | ON DELETE CASCADE |
| | 248 | ); |
| | 249 | |
| | 250 | -- Table 22 |
| | 251 | -- Create WORKS_IN_STORE table |
| | 252 | CREATE TABLE works_in_store ( |
| | 253 | personal_SSN VARCHAR(13) REFERENCES personal(ssn) |
| | 254 | ON DELETE CASCADE, |
| | 255 | store_ID VARCHAR(3) REFERENCES store(store_ID) |
| | 256 | ON DELETE CASCADE, |
| | 257 | PRIMARY KEY(personal_SSN, store_ID) |
| | 258 | ); |
| | 259 | |
| | 260 | -- Table 23 |
| | 261 | -- Create WORKED table |
| | 262 | CREATE TABLE worked ( |
| | 263 | personal_SSN VARCHAR(13) REFERENCES personal(ssn) |
| | 264 | ON DELETE CASCADE, |
| | 265 | report_date TIMESTAMP, |
| | 266 | store_ID VARCHAR(3), |
| | 267 | wage NUMERIC NOT NULL CHECK (wage>=62), |
| | 268 | pay_method VARCHAR DEFAULT 'hourly', |
| | 269 | total_hours NUMERIC NOT NULL, |
| | 270 | week VARCHAR(23) NOT NULL, -- Format : 15.12.2025 - 21.12.2025 |
| | 271 | PRIMARY KEY (personal_SSN, report_date, store_ID), |
| | 272 | FOREIGN KEY (report_date, store_ID) REFERENCES report(date, store_ID) |
| | 273 | ON DELETE CASCADE |
| | 274 | ); |
| | 275 | |
| | 276 | -- Table 24 |
| | 277 | -- Create SELLS table |
| | 278 | CREATE TABLE sells ( |
| | 279 | product_code VARCHAR(8) REFERENCES product(code) |
| | 280 | ON DELETE CASCADE, |
| | 281 | store_ID VARCHAR(3) REFERENCES store(store_ID) |
| | 282 | ON DELETE CASCADE, |
| | 283 | discount NUMERIC NOT NULL DEFAULT 0.0, |
| | 284 | PRIMARY KEY (product_code, store_ID) |
| | 285 | ); |
| | 286 | |
| | 287 | -- Table 25 |
| | 288 | -- Create INCLUDES table |
| | 289 | CREATE TABLE includes ( |
| | 290 | order_num VARCHAR(11) REFERENCES "order"(order_num) |
| | 291 | ON DELETE CASCADE, |
| | 292 | product_code VARCHAR(8) REFERENCES product(code) |
| | 293 | ON DELETE CASCADE, |
| | 294 | PRIMARY KEY (order_num, product_code) |
| | 295 | ); |
| | 296 | |
| | 297 | -- Table 26 |
| | 298 | -- Create APPROVES table |
| | 299 | CREATE TABLE approves ( |
| | 300 | boss_SSN VARCHAR(13) REFERENCES boss(boss_SSN) |
| | 301 | ON DELETE CASCADE, |
| | 302 | report_date TIMESTAMP, |
| | 303 | store_ID VARCHAR(3), |
| | 304 | owner_signature VARCHAR NOT NULL, |
| | 305 | PRIMARY KEY (boss_SSN, report_date, store_ID), |
| | 306 | FOREIGN KEY (report_date, store_ID) REFERENCES report(date, store_ID) |
| | 307 | ON DELETE CASCADE |
| | 308 | ); |
| | 309 | |
| | 310 | -- Table 27 |
| | 311 | -- Create EXCHANGES_DATA table |
| | 312 | CREATE TABLE exchanges_data ( |
| | 313 | report_date TIMESTAMP NOT NULL, |
| | 314 | store_ID VARCHAR(3) NOT NULL REFERENCES store(store_ID) |
| | 315 | ON DELETE CASCADE, |
| | 316 | monthly_profit NUMERIC NOT NULL DEFAULT 0.0, |
| | 317 | date TIMESTAMP NOT NULL, |
| | 318 | sales NUMERIC NOT NULL, -- Total profit achieved in sales (not "sells") |
| | 319 | damages NUMERIC NOT NULL DEFAULT 0.0 CHECK (damages>=0), -- Total loss in damages/refunds |
| | 320 | FOREIGN KEY (report_date, store_ID) REFERENCES report(date, store_ID) |
| | 321 | ON DELETE CASCADE, |
| | 322 | PRIMARY KEY (report_date, store_ID) |
| | 323 | ); |
| | 324 | |
| | 325 | -- Table 28 |
| | 326 | -- Create REFUND table |
| | 327 | CREATE TABLE refund ( |
| | 328 | refund_id SERIAL PRIMARY KEY, |
| | 329 | order_num VARCHAR(11) REFERENCES "order"(order_num) |
| | 330 | ON DELETE CASCADE, |
| | 331 | amount DECIMAL(10,2) NOT NULL CHECK(amount > 0.0), |
| | 332 | reason VARCHAR(200), |
| | 333 | status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'approved', 'rejected', 'processed')) |
| | 334 | ); |
| | 335 | |
| | 336 | |
| | 337 | |
| | 338 | }}} |