-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstructure.sql
125 lines (111 loc) · 4.97 KB
/
structure.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
-- lists and products can be deleted
-- categories cannot be deleted
-- users cannot be deleted
CREATE TABLE APP.USERS (
ID INTEGER GENERATED ALWAYS AS IDENTITY(start with 1 increment by 1) NOT NULL,
EMAIL VARCHAR(100) NOT NULL UNIQUE,
PASSWORD VARCHAR(64) NOT NULL,
FIRSTNAME VARCHAR(100) NOT NULL,
LASTNAME VARCHAR(100) NOT NULL,
IS_ADMIN BOOLEAN DEFAULT FALSE NOT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE APP.NV_USERS (
EMAIL VARCHAR(100) NOT NULL,
PASSWORD VARCHAR(64) NOT NULL,
FIRSTNAME VARCHAR(100) NOT NULL,
LASTNAME VARCHAR(100) NOT NULL,
VERIFICATION_CODE VARCHAR(50) NOT NULL,
PRIMARY KEY (EMAIL)
);
CREATE TABLE APP.LISTS_CATEGORIES (
ID INTEGER GENERATED ALWAYS AS IDENTITY(start with 1 increment by 1) NOT NULL,
NAME VARCHAR(100) NOT NULL,
DESCRIPTION VARCHAR(1000) NOT NULL,
PRIMARY KEY (ID),
UNIQUE (NAME)
);
CREATE TABLE APP.PRODUCTS_CATEGORIES (
ID INTEGER GENERATED ALWAYS AS IDENTITY(start with 1 increment by 1) NOT NULL,
NAME VARCHAR(100) NOT NULL,
RENEW_TIME INTEGER NOT NULL DEFAULT 0,
DESCRIPTION VARCHAR(1000) NOT NULL,
PRIMARY KEY (ID),
UNIQUE (NAME)
);
CREATE TABLE APP.LISTS_PRODUCTS_CATEGORIES (
LIST_CAT INTEGER NOT NULL CONSTRAINT lists_products_categories__list_cat REFERENCES APP.LISTS_CATEGORIES (ID),
PRODUCT_CAT INTEGER NOT NULL CONSTRAINT lists_products_categories__product_cat REFERENCES APP.PRODUCTS_CATEGORIES (ID),
UNIQUE (LIST_CAT, PRODUCT_CAT)
);
CREATE TABLE APP.LISTS (
ID INTEGER GENERATED ALWAYS AS IDENTITY(start with 1 increment by 1) NOT NULL,
NAME VARCHAR(100) NOT NULL,
DESCRIPTION VARCHAR(1000),
CATEGORY INTEGER NOT NULL CONSTRAINT lists__category REFERENCES APP.LISTS_CATEGORIES (ID),
OWNER INTEGER NOT NULL CONSTRAINT lists__owner REFERENCES APP.USERS (ID),
PRIMARY KEY (ID),
UNIQUE (NAME, CATEGORY, OWNER)
);
CREATE TABLE APP.LISTS_ANONYMOUS (
ID INTEGER GENERATED ALWAYS AS IDENTITY(start with 1 increment by 1) NOT NULL,
NAME VARCHAR(100) NOT NULL,
DESCRIPTION VARCHAR(1000),
CATEGORY INTEGER NOT NULL CONSTRAINT lists_anonymous__category REFERENCES APP.LISTS_CATEGORIES (ID),
LAST_SEEN TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (ID)
);
CREATE TABLE APP.PRODUCTS (
ID INTEGER GENERATED ALWAYS AS IDENTITY(start with 1 increment by 1) NOT NULL,
NAME VARCHAR(100) NOT NULL,
UPPER_NAME GENERATED ALWAYS AS (UPPER(NAME)),
DESCRIPTION VARCHAR(1000),
CATEGORY INTEGER NOT NULL CONSTRAINT products__category REFERENCES APP.PRODUCTS_CATEGORIES (ID),
CREATOR INTEGER NOT NULL CONSTRAINT products__creator REFERENCES APP.USERS (ID),
NUM_VOTES INTEGER NOT NULL DEFAULT 0,
RATING REAL NOT NULL DEFAULT 0,
CONSTRAINT products__num_votes CHECK(NUM_VOTES >= 0),
CONSTRAINT products__rating CHECK(RATING >= 0 AND RATING <= 5),
PRIMARY KEY (ID),
UNIQUE (NAME, CATEGORY, CREATOR)
);
CREATE INDEX productsUpperNameIndex ON APP.PRODUCTS(UPPER_NAME);
CREATE TABLE APP.LISTS_PRODUCTS (
LIST INTEGER NOT NULL CONSTRAINT lists_products__list REFERENCES APP.LISTS (ID) ON DELETE CASCADE,
PRODUCT INTEGER NOT NULL CONSTRAINT lists_products__product REFERENCES APP.PRODUCTS (ID) ON DELETE CASCADE,
TOTAL INTEGER NOT NULL DEFAULT 1,
PURCHASED INTEGER NOT NULL DEFAULT 0,
LAST_PURCHASE TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT lists_products__total CHECK(TOTAL >= 1),
CONSTRAINT lists_products__purchased CHECK(PURCHASED <= TOTAL),
PRIMARY KEY (LIST,PRODUCT)
);
CREATE TABLE APP.LISTS_ANONYMOUS_PRODUCTS (
LIST_ANONYMOUS INTEGER NOT NULL CONSTRAINT lists_anonymous_products__list_anonymous REFERENCES APP.LISTS_ANONYMOUS (ID) ON DELETE CASCADE,
PRODUCT INTEGER NOT NULL CONSTRAINT lists_anonymous_products__product REFERENCES APP.PRODUCTS (ID) ON DELETE CASCADE,
TOTAL INTEGER NOT NULL DEFAULT 1,
PURCHASED INTEGER NOT NULL DEFAULT 0,
LAST_PURCHASE TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT lists_anonymous_products__total CHECK(TOTAL >= 1),
CONSTRAINT lists_anonymous_products__purchased CHECK(PURCHASED <= TOTAL),
PRIMARY KEY (LIST_ANONYMOUS,PRODUCT)
);
CREATE TABLE APP.LISTS_SHARING (
LIST INTEGER NOT NULL CONSTRAINT lists_sharing__list REFERENCES APP.LISTS (ID) ON DELETE CASCADE,
USER_ID INTEGER NOT NULL CONSTRAINT lists_sharing__user_id REFERENCES APP.USERS (ID),
ACCESS INTEGER NOT NULL CONSTRAINT lists_sharing__access_ck CHECK (ACCESS IN (0, 1, 2)), -- (read, add/rm prods, full(rename, delete, etc))
PRIMARY KEY (LIST,USER_ID)
);
CREATE TABLE APP.CHATS (
LIST INTEGER NOT NULL CONSTRAINT chats__list REFERENCES APP.LISTS (ID) ON DELETE CASCADE,
USER_ID INTEGER NOT NULL CONSTRAINT chats__user_id REFERENCES APP.USERS (ID),
TIME TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
MESSAGE VARCHAR(500) NOT NULL,
IS_LOG BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE APP.INVITES (
INVITED INTEGER NOT NULL CONSTRAINT invites__invited REFERENCES APP.USERS (ID),
LIST INTEGER NOT NULL CONSTRAINT invites__list REFERENCES APP.LISTS (ID) ON DELETE CASCADE,
ACCESS INTEGER NOT NULL CONSTRAINT invites__access_ck CHECK (ACCESS IN (0, 1, 2)), -- (read, add/rm prods, full(rename, delete, etc))
PRIMARY KEY(INVITED, LIST)
);