RelationalDesign: schema_creation_v3.sql

File schema_creation_v3.sql, 3.8 KB (added by 213257, 2 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 response VARCHAR(500),
94 responded_at TIMESTAMP,
95 FOREIGN KEY (unit_id) REFERENCES unit(unit_id),
96 FOREIGN KEY (client_id) REFERENCES client(client_id),
97 FOREIGN KEY (agent_id) REFERENCES agent(agent_id)
98);
99
100CREATE TABLE appointment (
101 appointment_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
102 status VARCHAR(32) NOT NULL CHECK (status IN ('Scheduled', 'Completed', 'Cancelled')) DEFAULT 'Scheduled',
103 client_id VARCHAR(36) NOT NULL,
104 unit_id VARCHAR(36) NOT NULL,
105 timeslot_id VARCHAR(36) NOT NULL,
106 agent_id VARCHAR(36) NOT NULL,
107 FOREIGN KEY (client_id) REFERENCES client(client_id),
108 FOREIGN KEY (unit_id) REFERENCES unit(unit_id),
109 FOREIGN KEY (timeslot_id) REFERENCES timeslot(timeslot_id),
110 UNIQUE (timeslot_id)
111);