# Концептуален дизајн - ЕР Дијаграм и податочни барања Below is the full ER documentation for your university/faculty database schema, modeled after the format you provided. --- ## ЕР Дијаграм ![image1](image1) *(The ER diagram above represents the reference example. Your schema's conceptual ER diagram is described textually below.)* ### Conceptual ER Diagram (Textual Description) --- --- ## Податочни барања ## Ентитети 1. **Users** – ентитет кој чува информации за секаков тип корисници на апликацијата (студенти, професори, администратори) - __id__ (integer, PK) - name (varchar, not null) - embg (integer, not null) - surname (varchar, not null) - index (varchar) - bday (timestamp) - email (varchar, not null, unique) - password (varchar, not null) - role (enum: 'student', 'prof', 'admin') - created_at (timestamp, default: now()) 2. **HighSchool** – ентитет кој чува податоци за средното образование на корисникот - __user_id*__ (integer, FK → Users.id, unique) - gpa (float) — просек вклучувајќи матура - type (enum: 'strucen', 'gimnazija') 3. **Contact** – ентитет кој чува контакт информации за корисникот - __user_id*__ (integer, FK → Users.id, unique) - city (varchar) - municipality (varchar) - address (varchar) - number (varchar) - microsoft_email (varchar) 4. **EnrolledSemesters** – ентитет кој чува податоци за семестрите во кои е запишан студентот - __id__ (integer, PK) - user_id (integer, FK → Users.id) - quota (enum: 'privatna', 'drzavna') - major_id (integer, FK → Major.id) - note_ (varchar) - student_comment (varchar) - created_at (timestamp) - last_change (timestamp) - completed (timestamp) - semeser_id (integer, FK → ActiveSemesters.id) 5. **ActiveSemesters** – ентитет кој чува податоци за активните семестри (академска година и тип) - __id__ (integer, PK) - year_ (integer) - type (enum: 'summer', 'winter') 6. **SemestersSubjects** – ентитет кој чува податоци за предметите запишани од студентот во одреден семестар - __id__ (integer, PK) - user_id (integer, FK → Users.id) - enrolled_semesters_id (integer, FK → EnrolledSemesters.id, PK) - subjects_id (integer, FK → Subjects.id, PK) - professor_id (integer, FK → Users.id) - signature (bool) 7. **Subjects** – ентитет кој чува податоци за предметите - __id__ (integer, PK) - name (varchar, unique) - code (varchar, unique) - awarded_credits (integer) - dependency_credit (integer) 8. **Major** – ентитет кој чува податоци за студиските програми (смерови) - __id__ (integer, PK) - name (varchar) 9. **MajorSubjects** – ентитет кој ги поврзува студиските програми со предметите и одредува задолжителен семестар - __major_id*__ (integer, FK → Major.id, PK) - __subject_id*__ (integer, FK → Subjects.id, PK) - manditory_semester (int) - akreditacija (int) 10. **PassedSubjects** – ентитет кој чува податоци за положените предмети - __passed_id__ (integer, PK) - enrolled_id (integer, FK → SemestersSubjects.id) - grade (enum: '6', '7', '8', '9', '10') - date_passed (timestamp) 11. **Documents** – ентитет кој чува податоци за документите достапни во системот - __id__ (integer, PK) - type (varchar) - body (text) - cost (integer) 12. **UserDocuments** – ентитет кој ги поврзува корисниците со побараните документи - __user_id*__ (integer, FK → Users.id, PK) - __document_id*__ (integer, FK → Documents.id, PK) 13. **Token** – ентитет кој чува автентикациски токени за корисниците - __id__ (integer, PK) - user_id (integer, FK → Users.id, PK) - token (varchar) - expires_at (timestamp) - is_valid (bool) 14. **Payment** – ентитет кој чува податоци за уплатите поврзани со запишување семестри - __id__ (integer, PK) - user_id (integer, FK → Users.id, PK) - enrollment_id (integer, FK → EnrolledSemesters.id, PK) - amount (int) - ukim (int) 15. **EnrollmentInfo** – ентитет кој чува историски податоци за запишување на студентот - __id__ (integer, PK) - user_id (integer, FK → Users.id) - quota (enum: 'privatna', 'drzavna') - major_id (integer, FK → Major.id) - enrollment_year (integer) 16. **DependencySubject** – ентитет кој чува зависности помеѓу предметите (предуслови) - subject_id (integer, FK → Subjects.id) - dependency_id (integer, FK → Subjects.id) 17. **ProfessourSubjects** – ентитет кој чува информации за тоа кој професор предава кој предмет во кој активен семестар - prof_id (integer, FK → Users.id) - active_semester_id (integer, FK → ActiveSemesters.id) - subject_id (integer, FK → Subjects.id) --- ## Релации 1. **has_high_school** (Users ↔ HighSchool, 1:1) Секој корисник може да има точно еден запис за средно образование. 2. **has_contact** (Users ↔ Contact, 1:1) Секој корисник може да има точно еден запис за контакт информации. 3. **enrolls_in** (Users ↔ EnrolledSemesters, 1:N) Еден корисник (студент) може да биде запишан во повеќе семестри. 4. **belongs_to_major** (EnrolledSemesters ↔ Major, N:1) Секое запишување е поврзано со точно една студиска програма. 5. **in_active_semester** (EnrolledSemesters ↔ ActiveSemesters, N:1) Секое запишување е поврзано со точно еден активен семестар. 6. **takes_subject** (Users ↔ SemestersSubjects, 1:N) Еден студент може да запише повеќе предмети во семестри. 7. **taught_by** (SemestersSubjects ↔ Users, N:1) Секој запишан предмет има точно еден задолжен професор. 8. **semester_has_subject** (SemestersSubjects ↔ Subjects, N:1) Секој запис во SemestersSubjects се однесува на точно еден предмет. 9. **enrolled_in_semester** (SemestersSubjects ↔ EnrolledSemesters, N:1) Секој запис за предмет е поврзан со точно едно запишување на семестар. 10. **passed** (SemestersSubjects ↔ PassedSubjects, 1:1) Секој запишан предмет може да има најмногу еден запис за положување. 11. **major_includes** (Major ↔ MajorSubjects, 1:N) Една студиска програма вклучува повеќе предмети. 12. **subject_in_major** (Subjects ↔ MajorSubjects, 1:N) Еден предмет може да биде дел од повеќе студиски програми. 13. **depends_on** (Subjects ↔ Subjects, N:M — преку DependencySubject) Еден предмет може да има повеќе предуслови (зависности) и може да биде предуслов за повеќе други предмети. Само-референцирачка релација. 14. **requests_document** (Users ↔ Documents, N:M — преку UserDocuments) Корисниц��те можат да побараат повеќе документи, и еден документ може да биде побаран од повеќе корисници. 15. **has_token** (Users ↔ Token, 1:N) Еден корисник може да има повеќе автентикациски токени. 16. **makes_payment** (Users ↔ Payment, 1:N) Еден корисник може да изврши повеќе уплати. 17. **payment_for_enrollment** (Payment ↔ EnrolledSemesters, N:1) Секоја уплата е поврзана со точно едно запишување на семестар. 18. **enrollment_history** (Users ↔ EnrollmentInfo, 1:N) Еден корисник може да има повеќе записи за историја на запишување. 19. **enrollment_info_major** (EnrollmentInfo ↔ Major, N:1) Секој запис за запишување е поврзан со точно една студиска програма. 20. **professor_teaches** (Users ↔ ProfessourSubjects, 1:N) Еден професор може да предава повеќе предмети во различни семестри. 21. **prof_subject_semester** (ProfessourSubjects ↔ ActiveSemesters, N:1) Секој запис за предавање е поврзан со точно еден активен семестар. 22. **prof_subject** (ProfessourSubjects ↔ Subjects, N:1) Секој запис за предавање се однесува на точно еден предмет. --- ## Забелешки - Ентитетот **Users** служи како генерален ентитет за сите типови корисници (студенти, професори, администратори), разликувани преку атрибутот `role`. - **HighSchool** и **Contact** се во 1:1 релација со Users (секој корисник има најмногу еден запис). - **DependencySubject** претставува само-референцирачка N:M релација врз ентитетот Subjects за дефинирање на предуслови. - **SemestersSubjects** е централна асоцијативна табела која го поврзува студентот, запишаниот семестар, предметот и професорот. - **ProfessourSubjects** е одделна табела што експлицитно го дефинира распоредот на професори по предмети и семестри, независно од студентските записи.