source: sql/schema_creation.sql@ c42181c

Last change on this file since c42181c was c42181c, checked in by Stefan-Saveski <stefansaveski19@…>, 7 days ago

Refactor payment model to remove redundant user_id, addressing BCNF violation in Phase 5 normalization

  • Property mode set to 100644
File size: 5.0 KB
Line 
1DROP SCHEMA IF EXISTS project CASCADE;
2CREATE SCHEMA project;
3
4SET search_path TO project;
5
6CREATE TYPE user_role AS ENUM ('student', 'prof', 'admin');
7CREATE TYPE hs_type AS ENUM ('strucen', 'gimnazija');
8CREATE TYPE quota_type AS ENUM ('privatna', 'drzavna', 'stipendija');
9CREATE TYPE semester_type AS ENUM ('summer', 'winter');
10CREATE TYPE grade_type AS ENUM ('6', '7', '8', '9', '10');
11
12CREATE TABLE users (
13 id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
14 name VARCHAR(100) NOT NULL,
15 embg VARCHAR(13),
16 surname VARCHAR(100) NOT NULL,
17 "index" VARCHAR(20),
18 bday TIMESTAMP,
19 email VARCHAR(150) NOT NULL UNIQUE,
20 password VARCHAR(255) NOT NULL,
21 role user_role NOT NULL,
22 quota quota_type,
23 enrollment_year INTEGER,
24 created_at TIMESTAMP NOT NULL DEFAULT now()
25);
26
27CREATE TABLE high_school (
28 id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
29 user_id INTEGER NOT NULL UNIQUE REFERENCES users (id),
30 gpa REAL NOT NULL,
31 type hs_type NOT NULL
32);
33
34CREATE TABLE contact (
35 id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
36 user_id INTEGER NOT NULL UNIQUE REFERENCES users (id),
37 city VARCHAR(100) NOT NULL,
38 municipality VARCHAR(100) NOT NULL,
39 address VARCHAR(150) NOT NULL,
40 number VARCHAR(20) NOT NULL,
41 microsoft_email VARCHAR(150)
42);
43
44CREATE TABLE major (
45 id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
46 name VARCHAR(150) NOT NULL
47);
48
49CREATE TABLE active_semesters (
50 id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
51 year INTEGER NOT NULL,
52 type semester_type NOT NULL,
53 UNIQUE (year, type)
54);
55
56CREATE TABLE subjects (
57 id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
58 name VARCHAR(150) NOT NULL UNIQUE,
59 code VARCHAR(30) NOT NULL UNIQUE,
60 awarded_credits INTEGER NOT NULL,
61 dependency_credit INTEGER
62);
63
64CREATE TABLE enrolled_semesters (
65 id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
66 user_id INTEGER NOT NULL REFERENCES users (id),
67 quota quota_type NOT NULL,
68 major_id INTEGER NOT NULL REFERENCES major (id),
69 note VARCHAR(255),
70 student_comment VARCHAR(255),
71 created_at TIMESTAMP NOT NULL DEFAULT now(),
72 last_change TIMESTAMP,
73 completed TIMESTAMP,
74 semester_id INTEGER NOT NULL REFERENCES active_semesters (id),
75 UNIQUE (user_id, semester_id)
76);
77
78CREATE TABLE semesters_subjects (
79 id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
80 enrolled_semesters_id INTEGER NOT NULL REFERENCES enrolled_semesters (id),
81 subjects_id INTEGER NOT NULL REFERENCES subjects (id),
82 professor_id INTEGER NOT NULL REFERENCES users (id),
83 signature BOOLEAN NOT NULL DEFAULT FALSE,
84 UNIQUE (enrolled_semesters_id, subjects_id)
85);
86
87CREATE TABLE passed_subjects (
88 id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
89 enrolled_id INTEGER NOT NULL UNIQUE REFERENCES semesters_subjects (id),
90 grade grade_type NOT NULL,
91 date_passed TIMESTAMP NOT NULL
92);
93
94CREATE TABLE documents (
95 id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
96 type VARCHAR(100) NOT NULL,
97 body TEXT NOT NULL,
98 cost INTEGER NOT NULL
99);
100
101CREATE TABLE user_documents (
102 user_id INTEGER NOT NULL REFERENCES users (id),
103 document_id INTEGER NOT NULL REFERENCES documents (id),
104 PRIMARY KEY (user_id, document_id)
105);
106
107CREATE TABLE token (
108 id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
109 user_id INTEGER NOT NULL REFERENCES users (id),
110 token VARCHAR(255) NOT NULL,
111 expires_at TIMESTAMP NOT NULL,
112 is_valid BOOLEAN NOT NULL DEFAULT TRUE
113);
114
115CREATE TABLE payment (
116 id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
117 enrollment_id INTEGER NOT NULL REFERENCES enrolled_semesters (id),
118 amount INTEGER NOT NULL
119);
120
121CREATE TABLE major_subjects (
122 major_id INTEGER NOT NULL REFERENCES major (id),
123 subject_id INTEGER NOT NULL REFERENCES subjects (id),
124 mandatory_semester INTEGER NOT NULL,
125 PRIMARY KEY (major_id, subject_id)
126);
127
128CREATE TABLE dependency_subject (
129 subject_id INTEGER NOT NULL REFERENCES subjects (id),
130 dependency_id INTEGER NOT NULL REFERENCES subjects (id),
131 PRIMARY KEY (subject_id, dependency_id),
132 CHECK (subject_id <> dependency_id)
133);
134
135CREATE TABLE professour_subjects (
136 prof_id INTEGER NOT NULL REFERENCES users (id),
137 active_semester_id INTEGER NOT NULL REFERENCES active_semesters (id),
138 subject_id INTEGER NOT NULL REFERENCES subjects (id),
139 PRIMARY KEY (prof_id, active_semester_id, subject_id)
140);
Note: See TracBrowser for help on using the repository browser.