source: sql/schema.md

Last change on this file 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.1 KB
Line 
1# Schema diagram
2
3Generated from [`schema_creation.sql`](schema_creation.sql), which is the source of truth. If you change
4a table there, change it here too.
5
6Renders inline on GitHub and in the VS Code markdown preview (Ctrl+Shift+V) -
7no extension or tooling needed. Relationship labels use the names from the
8conceptual ER model.
9
10```mermaid
11erDiagram
12 users {
13 integer id PK
14 varchar name
15 varchar embg
16 varchar surname
17 varchar index
18 timestamp bday
19 varchar email UK
20 varchar password
21 user_role role
22 quota_type quota
23 integer enrollment_year
24 timestamp created_at
25 }
26
27 high_school {
28 integer id PK
29 integer user_id FK,UK
30 real gpa
31 hs_type type
32 }
33
34 contact {
35 integer id PK
36 integer user_id FK,UK
37 varchar city
38 varchar municipality
39 varchar address
40 varchar number
41 varchar microsoft_email
42 }
43
44 major {
45 integer id PK
46 varchar name
47 }
48
49 active_semesters {
50 integer id PK
51 integer year UK
52 semester_type type UK
53 }
54
55 subjects {
56 integer id PK
57 varchar name UK
58 varchar code UK
59 integer awarded_credits
60 integer dependency_credit
61 }
62
63 enrolled_semesters {
64 integer id PK
65 integer user_id FK,UK
66 quota_type quota
67 integer major_id FK
68 varchar note
69 varchar student_comment
70 timestamp created_at
71 timestamp last_change
72 timestamp completed
73 integer semester_id FK,UK
74 }
75
76 semesters_subjects {
77 integer id PK
78 integer enrolled_semesters_id FK,UK
79 integer subjects_id FK,UK
80 integer professor_id FK
81 boolean signature
82 }
83
84 passed_subjects {
85 integer id PK
86 integer enrolled_id FK,UK
87 grade_type grade
88 timestamp date_passed
89 }
90
91 documents {
92 integer id PK
93 varchar type
94 text body
95 integer cost
96 }
97
98 user_documents {
99 integer user_id PK,FK
100 integer document_id PK,FK
101 }
102
103 token {
104 integer id PK
105 integer user_id FK
106 varchar token
107 timestamp expires_at
108 boolean is_valid
109 }
110
111 payment {
112 integer id PK
113 integer enrollment_id FK
114 integer amount
115 }
116
117 major_subjects {
118 integer major_id PK,FK
119 integer subject_id PK,FK
120 integer mandatory_semester
121 }
122
123 dependency_subject {
124 integer subject_id PK,FK
125 integer dependency_id PK,FK
126 }
127
128 professour_subjects {
129 integer prof_id PK,FK
130 integer active_semester_id PK,FK
131 integer subject_id PK,FK
132 }
133
134 users ||--o| high_school : has_hs
135 users ||--o| contact : has_contact
136 users ||--o{ token : has_token
137 users ||--o{ enrolled_semesters : submits
138 users ||--o{ user_documents : owns
139 documents ||--o{ user_documents : owned_by
140 users ||--o{ semesters_subjects : teaches
141 users ||--o{ professour_subjects : teaches_subject
142
143 major ||--o{ enrolled_semesters : for_major
144 active_semesters ||--o{ enrolled_semesters : during
145 enrolled_semesters ||--o{ semesters_subjects : contains
146 enrolled_semesters ||--o{ payment : for_enrollment
147
148 subjects ||--o{ semesters_subjects : taken_in
149 semesters_subjects ||--o| passed_subjects : results_in
150
151 major ||--o{ major_subjects : includes
152 subjects ||--o{ major_subjects : included_in
153
154 subjects ||--o{ dependency_subject : requires
155 subjects ||--o{ dependency_subject : prerequisite_for
156
157 active_semesters ||--o{ professour_subjects : taught_in
158 subjects ||--o{ professour_subjects : taught_as
159```
160
161## Enum types
162
163| Type | Labels |
164|------|--------|
165| `user_role` | `student`, `prof`, `admin` |
166| `hs_type` | `strucen`, `gimnazija` |
167| `quota_type` | `privatna`, `drzavna`, `stipendija` |
168| `semester_type` | `summer`, `winter` |
169| `grade_type` | `6`, `7`, `8`, `9`, `10` |
170
171## Notes
172
173- `UK` on `enrolled_semesters.user_id` / `semester_id` is the composite
174 `UNIQUE (user_id, semester_id)` - one enrolment per student per semester.
175 Same for `semesters_subjects (enrolled_semesters_id, subjects_id)` and
176 `active_semesters (year, type)`.
177- `users` appears twice around `semesters_subjects`: once as the student, via
178 `enrolled_semesters.user_id`, and once as `professor_id`. The ER model links
179 the student through the enrolment, not directly.
180- `dependency_subject` is `subjects` related to itself: `subject_id` is the
181 dependent subject and `dependency_id` the prerequisite, with a `CHECK` that
182 they differ.
183- `professour_subjects` keeps the spelling used by the table in `schema_creation.sql`.
184- `payment` has no `user_id`: the student is reached through `enrollment_id`.
185 Storing it twice violated BCNF (`enrolled_id -> user_id`) and allowed a
186 payment to contradict the enrolment it refers to. Removed in Phase 5.
Note: See TracBrowser for help on using the repository browser.