P2: schema_creation.sql

File schema_creation.sql, 8.5 KB (added by 211099, 4 weeks ago)

Added schema creation script.

Line 
1-- Delete tables if they exist
2DROP TABLE IF EXISTS NEED_APPROVAL CASCADE;
3DROP TABLE IF EXISTS NOTIFY CASCADE;
4DROP TABLE IF EXISTS ROLES CASCADE;
5DROP TABLE IF EXISTS PERMISSION_LEVEL CASCADE;
6DROP TABLE IF EXISTS SUGGESTION_TYPE CASCADE;
7DROP TABLE IF EXISTS CONTENT_TYPE CASCADE;
8DROP TABLE IF EXISTS READING_LIST_ITEMS CASCADE;
9DROP TABLE IF EXISTS HAS_GENRE CASCADE;
10DROP TABLE IF EXISTS COLLABORATION CASCADE;
11DROP TABLE IF EXISTS COMMENT CASCADE;
12DROP TABLE IF EXISTS LIKES CASCADE;
13DROP TABLE IF EXISTS AI_SUGGESTION CASCADE;
14DROP TABLE IF EXISTS NOTIFICATION CASCADE;
15DROP TABLE IF EXISTS READING_LIST CASCADE;
16DROP TABLE IF EXISTS CHAPTER CASCADE;
17DROP TABLE IF EXISTS STATUS CASCADE;
18DROP TABLE IF EXISTS STORY CASCADE;
19DROP TABLE IF EXISTS WRITER CASCADE;
20DROP TABLE IF EXISTS REGULAR_USER CASCADE;
21DROP TABLE IF EXISTS ADMINS CASCADE;
22DROP TABLE IF EXISTS GENRE CASCADE;
23DROP TABLE IF EXISTS USERS CASCADE;
24
25-- Tables
26
27CREATE TABLE USERS(
28 user_id SERIAL PRIMARY KEY,
29 username VARCHAR(255) NOT NULL UNIQUE,
30 email VARCHAR(255) NOT NULL UNIQUE,
31 name VARCHAR(100) NOT NULL,
32 surname VARCHAR(100) NOT NULL,
33 password VARCHAR(255) NOT NULL,
34 created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
35 updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
36 CONSTRAINT email_format CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
37);
38
39CREATE TABLE ADMINS(
40 user_id INTEGER PRIMARY KEY,
41 FOREIGN KEY (user_id) REFERENCES USERS(user_id)
42 ON DELETE CASCADE
43 ON UPDATE CASCADE
44);
45
46CREATE TABLE REGULAR_USER(
47 user_id INTEGER PRIMARY KEY,
48 FOREIGN KEY (user_id) REFERENCES USERS(user_id)
49 ON DELETE CASCADE
50 ON UPDATE CASCADE
51);
52
53CREATE TABLE WRITER(
54 user_id INTEGER PRIMARY KEY,
55 FOREIGN KEY (user_id) REFERENCES USERS(user_id)
56 ON DELETE CASCADE
57 ON UPDATE CASCADE
58);
59
60CREATE TABLE STORY(
61 story_id SERIAL PRIMARY KEY,
62 mature_content BOOLEAN NOT NULL,
63 short_description VARCHAR(500) NOT NULL,
64 image VARCHAR(2048),
65 content TEXT NOT NULL,
66 user_id INTEGER NOT NULL,
67 created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
68 updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
69 FOREIGN KEY (user_id) REFERENCES WRITER(user_id)
70 ON DELETE CASCADE
71 ON UPDATE CASCADE
72);
73
74CREATE TABLE STATUS(
75 story_id INTEGER,
76 status VARCHAR(50) NOT NULL,
77 CONSTRAINT status_pk PRIMARY KEY(story_id, status),
78 CONSTRAINT status_values CHECK (status IN ('draft', 'published', 'archived')),
79 FOREIGN KEY (story_id) REFERENCES STORY(story_id)
80 ON DELETE CASCADE
81 ON UPDATE CASCADE
82);
83
84CREATE TABLE CHAPTER(
85 chapter_id SERIAL PRIMARY KEY,
86 chapter_number INTEGER NOT NULL,
87 chapter_name VARCHAR(100) NOT NULL,
88 title VARCHAR(200) NOT NULL,
89 content TEXT NOT NULL,
90 word_count INTEGER CHECK (word_count >= 0),
91 rating DECIMAL(3,2) CHECK (rating >= 0 AND rating <= 5),
92 published_at TIMESTAMPTZ NOT NULL,
93 view_count INTEGER DEFAULT 0 CHECK (view_count >= 0),
94 story_id INTEGER NOT NULL,
95 created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
96 updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
97 CONSTRAINT unique_chapter_number UNIQUE(story_id, chapter_number),
98 FOREIGN KEY (story_id) REFERENCES STORY(story_id)
99 ON DELETE CASCADE
100 ON UPDATE CASCADE
101);
102
103CREATE TABLE GENRE(
104 genre_id SERIAL PRIMARY KEY,
105 name VARCHAR(100) NOT NULL UNIQUE
106);
107
108CREATE TABLE READING_LIST(
109 list_id SERIAL PRIMARY KEY,
110 name VARCHAR(100) NOT NULL,
111 content TEXT,
112 is_public BOOLEAN NOT NULL,
113 user_id INTEGER NOT NULL,
114 created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
115 updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
116 FOREIGN KEY (user_id) REFERENCES USERS(user_id)
117 ON DELETE CASCADE
118 ON UPDATE CASCADE
119);
120
121CREATE TABLE NOTIFICATION(
122 notification_id SERIAL PRIMARY KEY,
123 content TEXT NOT NULL,
124 is_read BOOLEAN DEFAULT FALSE,
125 created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
126);
127
128CREATE TABLE CONTENT_TYPE(
129 notification_id INTEGER,
130 content_type VARCHAR(50) NOT NULL,
131 CONSTRAINT content_type_pk PRIMARY KEY(notification_id, content_type),
132 FOREIGN KEY (notification_id) REFERENCES NOTIFICATION(notification_id)
133 ON DELETE CASCADE
134 ON UPDATE CASCADE
135);
136
137CREATE TABLE AI_SUGGESTION(
138 suggestion_id SERIAL PRIMARY KEY,
139 original_text TEXT NOT NULL,
140 suggested_text TEXT NOT NULL,
141 accepted BOOLEAN NOT NULL DEFAULT FALSE,
142 created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
143 applied_at TIMESTAMPTZ
144);
145
146CREATE TABLE SUGGESTION_TYPE(
147 suggestion_id INTEGER,
148 suggestion_type VARCHAR(50) NOT NULL,
149 CONSTRAINT suggestion_type_pk PRIMARY KEY(suggestion_id, suggestion_type),
150 FOREIGN KEY (suggestion_id) REFERENCES AI_SUGGESTION(suggestion_id)
151 ON DELETE CASCADE
152 ON UPDATE CASCADE
153);
154
155CREATE TABLE LIKES(
156 user_id INTEGER,
157 story_id INTEGER,
158 created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
159 CONSTRAINT like_pk PRIMARY KEY(user_id, story_id),
160 FOREIGN KEY (user_id) REFERENCES USERS(user_id)
161 ON DELETE CASCADE
162 ON UPDATE CASCADE,
163 FOREIGN KEY (story_id) REFERENCES STORY(story_id)
164 ON DELETE CASCADE
165 ON UPDATE CASCADE
166);
167
168CREATE TABLE COMMENT(
169 comment_id SERIAL PRIMARY KEY,
170 content TEXT NOT NULL,
171 story_id INTEGER NOT NULL,
172 created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
173 updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
174 FOREIGN KEY (story_id) REFERENCES STORY(story_id)
175 ON DELETE CASCADE
176 ON UPDATE CASCADE
177);
178
179CREATE TABLE COLLABORATION(
180 user_id INTEGER,
181 story_id INTEGER,
182 created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
183 CONSTRAINT collaboration_pk PRIMARY KEY(user_id, story_id),
184 FOREIGN KEY (user_id) REFERENCES USERS(user_id)
185 ON DELETE CASCADE
186 ON UPDATE CASCADE,
187 FOREIGN KEY (story_id) REFERENCES STORY(story_id)
188 ON DELETE CASCADE
189 ON UPDATE CASCADE
190);
191
192CREATE TABLE ROLES(
193 user_id INTEGER,
194 story_id INTEGER,
195 roles VARCHAR(50) NOT NULL,
196 CONSTRAINT role_pk PRIMARY KEY(user_id, story_id, roles),
197 FOREIGN KEY (user_id, story_id) REFERENCES COLLABORATION(user_id, story_id)
198 ON DELETE CASCADE
199 ON UPDATE CASCADE
200);
201
202CREATE TABLE PERMISSION_LEVEL(
203 user_id INTEGER,
204 story_id INTEGER,
205 permission_level INTEGER NOT NULL,
206 CONSTRAINT permission_level_pk PRIMARY KEY(user_id, story_id, permission_level),
207 FOREIGN KEY (user_id, story_id) REFERENCES COLLABORATION(user_id, story_id)
208 ON DELETE CASCADE
209 ON UPDATE CASCADE
210);
211
212CREATE TABLE HAS_GENRE(
213 story_id INTEGER,
214 genre_id INTEGER,
215 CONSTRAINT has_genre_pk PRIMARY KEY(story_id, genre_id),
216 FOREIGN KEY (story_id) REFERENCES STORY(story_id)
217 ON DELETE CASCADE
218 ON UPDATE CASCADE,
219 FOREIGN KEY (genre_id) REFERENCES GENRE(genre_id)
220 ON DELETE CASCADE
221 ON UPDATE CASCADE
222);
223
224CREATE TABLE READING_LIST_ITEMS(
225 list_id INTEGER,
226 story_id INTEGER,
227 added_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
228 CONSTRAINT reading_list_items_pk PRIMARY KEY(list_id, story_id),
229 FOREIGN KEY (list_id) REFERENCES READING_LIST(list_id)
230 ON DELETE CASCADE
231 ON UPDATE CASCADE,
232 FOREIGN KEY (story_id) REFERENCES STORY(story_id)
233 ON DELETE CASCADE
234 ON UPDATE CASCADE
235);
236
237CREATE TABLE NOTIFY(
238 user_id INTEGER,
239 story_id INTEGER,
240 notification_id INTEGER,
241 CONSTRAINT notify_pk PRIMARY KEY(user_id, story_id, notification_id),
242 FOREIGN KEY (user_id) REFERENCES USERS(user_id)
243 ON DELETE CASCADE
244 ON UPDATE CASCADE,
245 FOREIGN KEY (story_id) REFERENCES STORY(story_id)
246 ON DELETE CASCADE
247 ON UPDATE CASCADE,
248 FOREIGN KEY (notification_id) REFERENCES NOTIFICATION(notification_id)
249 ON DELETE CASCADE
250 ON UPDATE CASCADE
251);
252
253CREATE TABLE NEED_APPROVAL(
254 suggestion_id INTEGER,
255 story_id INTEGER,
256 chapter_id INTEGER,
257 CONSTRAINT need_approval_pk PRIMARY KEY(suggestion_id, story_id, chapter_id),
258 FOREIGN KEY (suggestion_id) REFERENCES AI_SUGGESTION(suggestion_id)
259 ON DELETE CASCADE
260 ON UPDATE CASCADE,
261 FOREIGN KEY (story_id) REFERENCES STORY(story_id)
262 ON DELETE CASCADE
263 ON UPDATE CASCADE,
264 FOREIGN KEY (chapter_id) REFERENCES CHAPTER(chapter_id)
265 ON DELETE CASCADE
266 ON UPDATE CASCADE
267);