RelationalDesign: schema_creation_v4.sql

File schema_creation_v4.sql, 3.7 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 FOREIGN KEY (building_id) REFERENCES building(building_id),
40 UNIQUE (building_id, floor_number)
41);
42
43CREATE TABLE unit (
44 unit_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
45 unit_number VARCHAR(64) NOT NULL,
46 room_number INTEGER NOT NULL,
47 floor_area DECIMAL(10,2) NOT NULL,
48 status VARCHAR(32) NOT NULL CHECK (status IN ('Available', 'Reserved', 'Sold')) DEFAULT 'Available',
49 price DECIMAL(15,2) NOT NULL,
50 image VARCHAR(512),
51 floorplan VARCHAR(512),
52 vector_image VARCHAR(512) NOT NULL,
53 floor_id VARCHAR(36) NOT NULL,
54 FOREIGN KEY (floor_id) REFERENCES floor(floor_id),
55 UNIQUE (floor_id, unit_number)
56);
57
58CREATE TABLE agent (
59 agent_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
60 name VARCHAR(256) NOT NULL,
61 email VARCHAR(256) NOT NULL UNIQUE,
62 password VARCHAR(256) NOT NULL
63);
64
65CREATE TABLE client (
66 client_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
67 name VARCHAR(128) NOT NULL,
68 email VARCHAR(256) NOT NULL UNIQUE,
69 phone VARCHAR(32) NOT NULL
70);
71
72CREATE TABLE timeslot (
73 timeslot_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
74 date DATE NOT NULL,
75 time_start TIME NOT NULL,
76 time_end TIME NOT NULL,
77 status VARCHAR(32) NOT NULL CHECK (status IN ('Available', 'Booked')) DEFAULT 'Available',
78 agent_id VARCHAR(36) NOT NULL,
79 FOREIGN KEY (agent_id) REFERENCES agent(agent_id),
80 UNIQUE (agent_id, date, time_start)
81);
82
83CREATE TABLE inquiry (
84 inquiry_id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,
85 message TEXT NOT NULL,
86 status VARCHAR(32) NOT NULL CHECK (status IN ('New', 'Replied', 'Closed')) DEFAULT 'New',
87 created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
88 unit_id VARCHAR(36) NOT NULL,
89 client_id VARCHAR(36) NOT NULL,
90 agent_id VARCHAR(36) NOT NULL,
91 response VARCHAR(500),
92 responded_at TIMESTAMP,
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 FOREIGN KEY (client_id) REFERENCES client(client_id),
105 FOREIGN KEY (unit_id) REFERENCES unit(unit_id),
106 FOREIGN KEY (timeslot_id) REFERENCES timeslot(timeslot_id),
107 UNIQUE (timeslot_id)
108);