source: sql/schema.md@ bcacc91

Last change on this file since bcacc91 was 1b20b22, checked in by Stefan-Saveski <stefansaveski19@…>, 8 days ago
  • ready for presentation
  • Property mode set to 100644
File size: 5.0 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 user_id FK
114 integer enrollment_id FK
115 integer amount
116 }
117
118 major_subjects {
119 integer major_id PK,FK
120 integer subject_id PK,FK
121 integer mandatory_semester
122 }
123
124 dependency_subject {
125 integer subject_id PK,FK
126 integer dependency_id PK,FK
127 }
128
129 professour_subjects {
130 integer prof_id PK,FK
131 integer active_semester_id PK,FK
132 integer subject_id PK,FK
133 }
134
135 users ||--o| high_school : has_hs
136 users ||--o| contact : has_contact
137 users ||--o{ token : has_token
138 users ||--o{ payment : pays
139 users ||--o{ enrolled_semesters : submits
140 users ||--o{ user_documents : owns
141 documents ||--o{ user_documents : owned_by
142 users ||--o{ semesters_subjects : teaches
143 users ||--o{ professour_subjects : teaches_subject
144
145 major ||--o{ enrolled_semesters : for_major
146 active_semesters ||--o{ enrolled_semesters : during
147 enrolled_semesters ||--o{ semesters_subjects : contains
148 enrolled_semesters ||--o{ payment : for_enrollment
149
150 subjects ||--o{ semesters_subjects : taken_in
151 semesters_subjects ||--o| passed_subjects : results_in
152
153 major ||--o{ major_subjects : includes
154 subjects ||--o{ major_subjects : included_in
155
156 subjects ||--o{ dependency_subject : requires
157 subjects ||--o{ dependency_subject : prerequisite_for
158
159 active_semesters ||--o{ professour_subjects : taught_in
160 subjects ||--o{ professour_subjects : taught_as
161```
162
163## Enum types
164
165| Type | Labels |
166|------|--------|
167| `user_role` | `student`, `prof`, `admin` |
168| `hs_type` | `strucen`, `gimnazija` |
169| `quota_type` | `privatna`, `drzavna`, `stipendija` |
170| `semester_type` | `summer`, `winter` |
171| `grade_type` | `6`, `7`, `8`, `9`, `10` |
172
173## Notes
174
175- `UK` on `enrolled_semesters.user_id` / `semester_id` is the composite
176 `UNIQUE (user_id, semester_id)` - one enrolment per student per semester.
177 Same for `semesters_subjects (enrolled_semesters_id, subjects_id)` and
178 `active_semesters (year, type)`.
179- `users` appears twice around `semesters_subjects`: once as the student, via
180 `enrolled_semesters.user_id`, and once as `professor_id`. The ER model links
181 the student through the enrolment, not directly.
182- `dependency_subject` is `subjects` related to itself: `subject_id` is the
183 dependent subject and `dependency_id` the prerequisite, with a `CHECK` that
184 they differ.
185- `professour_subjects` keeps the spelling used by the table in `schema_creation.sql`.
Note: See TracBrowser for help on using the repository browser.