RelationalDesign: schema_creation_v2.sql

File schema_creation_v2.sql, 3.8 KB (added by 213257, 3 weeks ago)
Line 
1DROP SCHEMA IF EXISTS project CASCADE;
2CREATE SCHEMA project;
3SET search_path TO project;
4
5CREATE TABLE admin (
6 admin_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
7 name VARCHAR(128) NOT NULL,
8 email VARCHAR(128) NOT NULL UNIQUE,
9 password VARCHAR(256) NOT NULL
10);
11
12CREATE TABLE architect (
13 architect_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
14 full_name VARCHAR(128) NOT NULL
15);
16
17CREATE TABLE building (
18 building_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
19 name VARCHAR(256) NOT NULL,
20 address VARCHAR(512) NOT NULL,
21 description TEXT,
22 admin_id VARCHAR(36) NOT NULL,
23 FOREIGN KEY (admin_id) REFERENCES admin(admin_id)
24);
25
26CREATE TABLE designs (
27 architect_id VARCHAR(36) NOT NULL,
28 building_id VARCHAR(36) NOT NULL,
29 PRIMARY KEY (architect_id, building_id),
30 FOREIGN KEY (architect_id) REFERENCES architect(architect_id),
31 FOREIGN KEY (building_id) REFERENCES building(building_id)
32);
33
34CREATE TABLE floor (
35 floor_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
36 floor_number INTEGER NOT NULL,
37 layout_image VARCHAR(512) NOT NULL,
38 building_id VARCHAR(36) NOT NULL,
39 admin_id VARCHAR(36) NOT NULL,
40 FOREIGN KEY (building_id) REFERENCES building(building_id),
41 UNIQUE (building_id, floor_number)
42);
43
44CREATE TABLE unit (
45 unit_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
46 unit_number VARCHAR(64) NOT NULL,
47 room_number INTEGER NOT NULL,
48 floor_area DECIMAL(10,2) NOT NULL,
49 status VARCHAR(32) NOT NULL CHECK (status IN ('Available', 'Reserved', 'Sold')) DEFAULT 'Available',
50 price DECIMAL(15,2) NOT NULL,
51 image VARCHAR(512),
52 floorplan VARCHAR(512),
53 vector_image VARCHAR(512) NOT NULL,
54 floor_id VARCHAR(36) NOT NULL,
55 admin_id VARCHAR(36) NOT NULL,
56 FOREIGN KEY (floor_id) REFERENCES floor(floor_id),
57 UNIQUE (floor_id, unit_number)
58);
59
60CREATE TABLE agent (
61 agent_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
62 name VARCHAR(256) NOT NULL,
63 email VARCHAR(256) NOT NULL UNIQUE,
64 password VARCHAR(256) NOT NULL
65);
66
67CREATE TABLE client (
68 client_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
69 name VARCHAR(128) NOT NULL,
70 email VARCHAR(256) NOT NULL UNIQUE,
71 phone VARCHAR(32) NOT NULL
72);
73
74CREATE TABLE timeslot (
75 timeslot_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
76 date DATE NOT NULL,
77 time_start TIME NOT NULL,
78 time_end TIME NOT NULL,
79 status VARCHAR(32) NOT NULL CHECK (status IN ('Available', 'Booked')) DEFAULT 'Available',
80 agent_id VARCHAR(36) NOT NULL,
81 FOREIGN KEY (agent_id) REFERENCES agent(agent_id),
82 UNIQUE (agent_id, date, time_start)
83);
84
85CREATE TABLE inquiry (
86 inquiry_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
87 message TEXT NOT NULL,
88 status VARCHAR(32) NOT NULL CHECK (status IN ('New', 'Replied', 'Closed')) DEFAULT 'New',
89 created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
90 unit_id VARCHAR(36) NOT NULL,
91 client_id VARCHAR(36) NOT NULL,
92 agent_id VARCHAR(36) NOT NULL,
93 FOREIGN KEY (unit_id) REFERENCES unit(unit_id),
94 FOREIGN KEY (client_id) REFERENCES client(client_id),
95 FOREIGN KEY (agent_id) REFERENCES agent(agent_id)
96);
97
98CREATE TABLE appointment (
99 appointment_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
100 status VARCHAR(32) NOT NULL CHECK (status IN ('Scheduled', 'Completed', 'Cancelled')) DEFAULT 'Scheduled',
101 client_id VARCHAR(36) NOT NULL,
102 unit_id VARCHAR(36) NOT NULL,
103 timeslot_id VARCHAR(36) NOT NULL,
104 agent_id VARCHAR(36) NOT NULL,
105 FOREIGN KEY (client_id) REFERENCES client(client_id),
106 FOREIGN KEY (unit_id) REFERENCES unit(unit_id),
107 FOREIGN KEY (timeslot_id) REFERENCES timeslot(timeslot_id),
108 UNIQUE (timeslot_id)
109);