| COMP3311 25T2 |
Assignment 2 The mymyunsw Database |
Database Systems |
[Assignment Spec] [SQL Schema] [SQL Data] [Grades+Rules] [Examples] [Testing] [Submitting]
The following is the SQL schema used in building the mymyunsw database:
-- COMP3311 25T2 Assignment 2
-- Schema for MyMyUNSW database
create domain TermCode as char(4) check (value ~'[12][01239]T[0123]');
create domain SubjectCode as char(8) check (value ~ '[A-Z]{4}[0-9]{4}');
create domain StreamCode as char(6) check (value ~ '[A-Z]{4}[A-Z-][A-Z123-]');
create domain ProgramCode as char(4) check (value ~ '[0-9]{4}');
create domain ZidValue as integer check (value between 1000000 and 9999999);
create type ResidentType as enum ('AUS','AUSPR','INTL','NZ');
create type UnitType as enum ('UNSW','faculty','school','department');
create type CareerType as enum ('UGRD','PGRD','RSCH','NAWD');
create type GradeType as enum
('A', 'A+', 'A-', 'AF', 'AS', 'AW', 'B', 'B+', 'B-', 'C', 'C+',
'C-', 'CR', 'D', 'D+', 'D-', 'DN', 'E', 'E+', 'E-', 'EC',
'EM', 'F', 'FL', 'HD', 'NA', 'NC', 'NF', 'PE', 'PS', 'PW',
'RC', 'RD', 'RS', 'SY', 'UF', 'WD', 'WJ', 'XE');
create type ReqType as enum
('core','elective','free','gened','stream','uoc');
create table Terms (
id integer,
code TermCode not null,
starting date,
ending date,
description text,
primary key (id)
);
create table Countries (
id integer,
code char(3) not null,
name text not null,
primary key (id)
);
create table People (
id integer,
zid ZidValue unique not null,
family_name text,
given_names text,
full_name text,
origin integer references Countries(id),
primary key (id)
);
create table Students (
id integer references People(id),
status ResidentType,
primary key (id)
);
create table Staff (
id integer references People(id),
primary key (id)
);
create table Orgunits (
id integer,
code varchar(10) not null,
name text not null,
utype UnitType not null,
parent integer references Orgunits(id),
primary key (id)
);
create table Subjects (
id integer,
code SubjectCode not null,
title text not null,
uoc integer not null check (uoc between 0 and 24),
career CareerType,
owner integer not null references Orgunits(id),
primary key (id)
);
create table Courses (
id integer,
subject integer not null references Subjects(id),
term integer not null references Terms(id),
convenor integer references Staff(id),
satisfact integer check (satisfact between 0 and 100),
nresponses integer,
primary key (id)
);
create table Streams (
id integer,
code StreamCode,
name text, -- not null,
primary key (id)
);
create table Programs (
id integer,
code ProgramCode,
name text, -- not null,
primary key (id)
);
create table Program_enrolments (
id integer,
student integer references Students(id),
term integer references Terms(id),
program integer references Programs(id),
primary key (id)
);
create table Stream_enrolments (
part_of integer references Program_enrolments(id),
stream integer references Streams(id),
primary key (part_of,stream)
);
create table Course_enrolments (
student integer references Students(id),
course integer references Courses(id),
mark integer check (mark between 0 and 100),
grade GradeType,
primary key (student,course)
);
create table Requirements (
id integer,
name text not null,
rtype ReqType not null,
min_req integer check (min_req > 0),
max_req integer check (max_req > 0),
acadobjs text,
for_stream integer references Streams(id),
for_program integer references Programs(id),
constraint OneOrOther check (
for_stream is NULL and for_program is not null
or
for_stream is not null and for_program is null
),
primary key (id)
);