P2: schema_creation.sql

File schema_creation.sql, 3.6 KB (added by 216009, 3 weeks ago)
Line 
1-- Избришете ги ако веќе постојат
2DROP TABLE IF EXISTS Student_Subject CASCADE;
3DROP TABLE IF EXISTS Subject_Professor CASCADE;
4DROP TABLE IF EXISTS Subject CASCADE;
5DROP TABLE IF EXISTS Advice CASCADE;
6DROP TABLE IF EXISTS Student CASCADE;
7DROP TABLE IF EXISTS Professor CASCADE;
8DROP TABLE IF EXISTS Faculty CASCADE;
9DROP TABLE IF EXISTS University CASCADE;
10DROP TABLE IF EXISTS Affiliated CASCADE;
11DROP TYPE IF EXISTS study_field_enum CASCADE;
12DROP TYPE IF EXISTS enrollment_status CASCADE;
13
14-- Креирајте ги типовите
15CREATE TYPE study_field_enum AS ENUM (
16 'COMPUTER_SCIENCE',
17 'ECONOMICS',
18 'ENGINEERING',
19 'MEDICINE',
20 'LAW',
21 'ARTS',
22 'SCIENCE'
23);
24
25CREATE TYPE enrollment_status AS ENUM ('ENROLLED', 'PASSED', 'FAILED', 'DROPPED');
26
27-- University
28CREATE TABLE University (
29 Id SERIAL PRIMARY KEY,
30 Name VARCHAR(255) NOT NULL,
31 Location VARCHAR(100),
32 IsPrivate BOOLEAN NOT NULL
33);
34
35-- Faculty
36CREATE TABLE Faculty (
37 Id SERIAL PRIMARY KEY,
38 Name VARCHAR(255) NOT NULL,
39 Location VARCHAR(100),
40 Study_Field study_field_enum NOT NULL,
41 University_Id INT NOT NULL,
42 FOREIGN KEY (University_Id) REFERENCES University(Id) ON DELETE CASCADE
43);
44
45-- Professor (без Address поле)
46CREATE TABLE Professor (
47 Id SERIAL PRIMARY KEY,
48 Name VARCHAR(255) NOT NULL,
49 Surname VARCHAR(255),
50 Age INT CHECK (Age BETWEEN 18 AND 80),
51 Faculty_Id INT NOT NULL,
52 FOREIGN KEY (Faculty_Id) REFERENCES Faculty(Id) ON DELETE CASCADE
53);
54
55-- Student (без Adviser_Id, со Student_Index)
56CREATE TABLE Student (
57 Id SERIAL PRIMARY KEY,
58 Name VARCHAR(255) NOT NULL,
59 Surname VARCHAR(255),
60 Location VARCHAR(100),
61 Student_Index INT NOT NULL UNIQUE,
62 Faculty_Id INT NOT NULL,
63 FOREIGN KEY (Faculty_Id) REFERENCES Faculty(Id) ON DELETE RESTRICT
64);
65
66-- Advice (Student ↔ Professor, M:N)
67CREATE TABLE Advice (
68 Student_Id INT NOT NULL,
69 Professor_Id INT NOT NULL,
70 Start_Date DATE,
71 End_Date DATE,
72 PRIMARY KEY (Student_Id, Professor_Id),
73 FOREIGN KEY (Student_Id) REFERENCES Student(Id) ON DELETE CASCADE,
74 FOREIGN KEY (Professor_Id) REFERENCES Professor(Id) ON DELETE CASCADE
75);
76
77-- Subject (без Professor_Id)
78CREATE TABLE Subject (
79 Id SERIAL PRIMARY KEY,
80 Name VARCHAR(255) NOT NULL,
81 Semester INT CHECK (Semester BETWEEN 1 AND 8),
82 Credits INT CHECK (Credits BETWEEN 1 AND 10),
83 Faculty_Id INT NOT NULL,
84 FOREIGN KEY (Faculty_Id) REFERENCES Faculty(Id) ON DELETE RESTRICT
85);
86
87-- Subject_Professor (Teach, M:N)
88CREATE TABLE Subject_Professor (
89 Subject_Id INT NOT NULL,
90 Professor_Id INT NOT NULL,
91 PRIMARY KEY (Subject_Id, Professor_Id),
92 FOREIGN KEY (Subject_Id) REFERENCES Subject(Id) ON DELETE CASCADE,
93 FOREIGN KEY (Professor_Id) REFERENCES Professor(Id) ON DELETE CASCADE
94);
95
96-- Student_Subject (Enroll & Has)
97CREATE TABLE Student_Subject (
98 Ss_Id INT PRIMARY KEY,
99 Student_Id INT NOT NULL,
100 Subject_Id INT NOT NULL,
101 Enrollment_Date DATE NOT NULL,
102 Status VARCHAR(20) NOT NULL DEFAULT 'ENROLLED',
103 Final_Grade INT CHECK (Final_Grade BETWEEN 5 AND 10),
104 Absences_Count INT NOT NULL DEFAULT 0 CHECK (Absences_Count >= 0),
105 FOREIGN KEY (Student_Id) REFERENCES Student(Id) ON DELETE CASCADE,
106 FOREIGN KEY (Subject_Id) REFERENCES Subject(Id) ON DELETE CASCADE
107);
108
109-- Affiliated (University ↔ Professor, M:N)
110CREATE TABLE Affiliated (
111 University_Id INT NOT NULL,
112 Professor_Id INT NOT NULL,
113 PRIMARY KEY (University_Id, Professor_Id),
114 FOREIGN KEY (University_Id) REFERENCES University(Id) ON DELETE CASCADE,
115 FOREIGN KEY (Professor_Id) REFERENCES Professor(Id) ON DELETE CASCADE
116);