DatabaseCreation: schema.sql

File schema.sql, 10.0 KB (added by 231219, 7 hours ago)
Line 
1-- =============================================
2-- Restaurant Management System - DB Schema
3-- =============================================
4
5-- Lookup / Type Tables
6
7CREATE TABLE EmployeeType (
8 Id SERIAL PRIMARY KEY,
9 Type VARCHAR(30) NOT NULL UNIQUE,
10 Permissions INT4 NOT NULL DEFAULT 0
11);
12
13CREATE TABLE OrderType (
14 Id SERIAL PRIMARY KEY,
15 Type VARCHAR(20) NOT NULL UNIQUE
16);
17
18CREATE TABLE OrderStatus (
19 Id SERIAL PRIMARY KEY,
20 Status VARCHAR(20) NOT NULL UNIQUE
21);
22
23CREATE TABLE MenuType (
24 Id SERIAL PRIMARY KEY,
25 Type VARCHAR(30) NOT NULL UNIQUE
26);
27
28CREATE TABLE ProductType (
29 Id SERIAL PRIMARY KEY,
30 Type VARCHAR(30) NOT NULL UNIQUE
31);
32
33CREATE TABLE MenuMemberType (
34 Id SERIAL PRIMARY KEY,
35 Type VARCHAR(20) NOT NULL UNIQUE
36);
37
38CREATE TABLE TableType (
39 Id SERIAL PRIMARY KEY,
40 Type VARCHAR(20) NOT NULL UNIQUE
41);
42
43CREATE TABLE UnitType (
44 Id SERIAL PRIMARY KEY,
45 Type VARCHAR(20) NOT NULL UNIQUE
46);
47
48CREATE TABLE ChangeType (
49 Id SERIAL PRIMARY KEY,
50 Type VARCHAR(30) NOT NULL UNIQUE,
51 Sign BOOL NOT NULL
52);
53
54CREATE TABLE Location (
55 Id SERIAL PRIMARY KEY,
56 Name VARCHAR(30) NOT NULL UNIQUE
57);
58
59-- Core Tables
60
61CREATE TABLE Unit (
62 Id SERIAL PRIMARY KEY,
63 Name VARCHAR(20) NOT NULL,
64 Conversion_to_base INT4 NOT NULL DEFAULT 1 CHECK (Conversion_to_base > 0),
65 TypeId INT4 NOT NULL,
66 CONSTRAINT FKUnit_UnitType FOREIGN KEY (TypeId) REFERENCES UnitType (Id)
67 ON DELETE RESTRICT ON UPDATE CASCADE
68);
69
70CREATE TABLE RestaurantTable (
71 TableNumber SERIAL PRIMARY KEY,
72 Capacity INT4 NOT NULL DEFAULT 2 CHECK (Capacity > 0),
73 Status BOOL NOT NULL DEFAULT TRUE,
74 TableTypeId INT4 NOT NULL,
75 CONSTRAINT FKTable_TableType FOREIGN KEY (TableTypeId) REFERENCES TableType (Id)
76 ON DELETE RESTRICT ON UPDATE CASCADE
77);
78
79CREATE TABLE Employee (
80 Id SERIAL PRIMARY KEY,
81 FirstName VARCHAR(50) NOT NULL DEFAULT 'Unknown',
82 LastName VARCHAR(50) NOT NULL DEFAULT 'Unknown',
83 SSN VARCHAR(13) NOT NULL UNIQUE,
84 Sex CHAR(1) NOT NULL CHECK (Sex IN ('M', 'F', 'O')),
85 Email VARCHAR(100) UNIQUE CHECK (Email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$'),
86 PasswordHash VARCHAR(255) NOT NULL,
87 DateEmployment DATE NOT NULL DEFAULT CURRENT_DATE,
88 DateResignation DATE,
89 CHECK (DateResignation IS NULL OR DateResignation >= DateEmployment)
90);
91
92CREATE TABLE EmployeeRole (
93 Id SERIAL PRIMARY KEY,
94 EmployeeId INT4 NOT NULL,
95 EmployeeTypeid INT4 NOT NULL,
96 CONSTRAINT FKEmployeeRole_Employee FOREIGN KEY (EmployeeId) REFERENCES Employee (Id)
97 ON DELETE CASCADE ON UPDATE CASCADE,
98 CONSTRAINT FKEmployeeRole_EmployeeType FOREIGN KEY (EmployeeTypeid) REFERENCES EmployeeType (Id)
99 ON DELETE RESTRICT ON UPDATE CASCADE
100);
101
102CREATE TABLE Product (
103 Id SERIAL PRIMARY KEY,
104 Name VARCHAR(30) NOT NULL UNIQUE,
105 Url VARCHAR(255),
106 TypeId INT4 NOT NULL,
107 BaseUnitId INT4 NOT NULL,
108 CONSTRAINT FKProduct_ProductType FOREIGN KEY (TypeId) REFERENCES ProductType (Id)
109 ON DELETE RESTRICT ON UPDATE CASCADE,
110 CONSTRAINT FKProduct_Unit FOREIGN KEY (BaseUnitId) REFERENCES Unit (Id)
111 ON DELETE RESTRICT ON UPDATE CASCADE
112);
113
114CREATE TABLE MenuItem (
115 Id INT4 PRIMARY KEY,
116 CONSTRAINT FKMenuItem_Product FOREIGN KEY (Id) REFERENCES Product (Id)
117 ON DELETE RESTRICT ON UPDATE CASCADE
118);
119
120CREATE TABLE StoredProduct (
121 Id SERIAL PRIMARY KEY,
122 Quantity INT4 NOT NULL DEFAULT 0 CHECK (Quantity >= 0),
123 ProductId INT4 NOT NULL,
124 CONSTRAINT FKStoredProduct_Product FOREIGN KEY (ProductId) REFERENCES Product (Id)
125 ON DELETE RESTRICT ON UPDATE CASCADE
126);
127
128CREATE TABLE ConsistsOf (
129 Parent INT4 NOT NULL, -- The Recipe
130 Component INT4 NOT NULL, -- The Ingredient
131 Amount INT4 NOT NULL CHECK (Amount > 0),
132 UnitId INT4 NOT NULL,
133 PRIMARY KEY (Parent, Component),
134 CONSTRAINT FKConsistsOf_ParentProduct FOREIGN KEY (Parent) REFERENCES Product (Id)
135 ON DELETE CASCADE ON UPDATE CASCADE,
136 CONSTRAINT FKConsistsOf_ComponentProduct FOREIGN KEY (Component) REFERENCES Product (Id)
137 ON DELETE RESTRICT ON UPDATE CASCADE,
138 CONSTRAINT FKConsistsOf_Unit FOREIGN KEY (UnitId) REFERENCES Unit (Id)
139 ON DELETE RESTRICT ON UPDATE CASCADE
140);
141
142CREATE TABLE ProductUsageLog (
143 Id SERIAL PRIMARY KEY,
144 ProductId INT4 NOT NULL,
145 ChangeAmount INT4 NOT NULL,
146 InputAmount INT4 NOT NULL,
147 Timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
148 ChangeTypeId INT4 NOT NULL,
149 BaseUnitId INT4 NOT NULL,
150 InputUnitId INT4 NOT NULL,
151 CONSTRAINT FKProductUsageLog_Product FOREIGN KEY (ProductId) REFERENCES Product (Id)
152 ON DELETE RESTRICT ON UPDATE CASCADE,
153 CONSTRAINT FKProductUsageLog_ChangeType FOREIGN KEY (ChangeTypeId) REFERENCES ChangeType (Id)
154 ON DELETE RESTRICT ON UPDATE CASCADE,
155 CONSTRAINT FKProductUsageLog_BaseUnit FOREIGN KEY (BaseUnitId) REFERENCES Unit (Id)
156 ON DELETE RESTRICT ON UPDATE CASCADE,
157 CONSTRAINT FKProductUsageLog_InputUnit FOREIGN KEY (InputUnitId) REFERENCES Unit (Id)
158 ON DELETE RESTRICT ON UPDATE CASCADE
159);
160
161CREATE TABLE Menu (
162 Id SERIAL PRIMARY KEY,
163 Name VARCHAR(30) NOT NULL DEFAULT 'Standard Menu',
164 Active BOOL NOT NULL DEFAULT TRUE,
165 Wallpaper VARCHAR(255),
166 TypeId INT4 NOT NULL,
167 CONSTRAINT FKMenu_MenuType FOREIGN KEY (TypeId) REFERENCES MenuType (Id)
168 ON DELETE RESTRICT ON UPDATE CASCADE
169);
170
171CREATE TABLE MenuMember (
172 Id SERIAL NOT NULL,
173 MenuItemId INT4 NOT NULL,
174 Price NUMERIC(10,2) NOT NULL CHECK (Price >= 0),
175 TypeId INT4 NOT NULL,
176 MenuId INT4 NOT NULL,
177 PRIMARY KEY (Id, MenuItemId),
178 CONSTRAINT FKMenuMember_MenuItem FOREIGN KEY (MenuItemId) REFERENCES MenuItem (Id)
179 ON DELETE CASCADE ON UPDATE CASCADE,
180 CONSTRAINT FKMenuMember_MenuMemberType FOREIGN KEY (TypeId) REFERENCES MenuMemberType (Id)
181 ON DELETE RESTRICT ON UPDATE CASCADE,
182 CONSTRAINT FKMenuMember_Menu FOREIGN KEY (MenuId) REFERENCES Menu (Id)
183 ON DELETE CASCADE ON UPDATE CASCADE
184);
185
186CREATE TABLE Discount (
187 Id SERIAL PRIMARY KEY,
188 Name VARCHAR(30) NOT NULL,
189 "From" DATE NOT NULL,
190 "To" DATE NOT NULL,
191 MenuId INT4 NOT NULL,
192 Status BOOL NOT NULL DEFAULT TRUE,
193 CONSTRAINT FKDiscount_Menu FOREIGN KEY (MenuId) REFERENCES Menu (Id)
194 ON DELETE CASCADE ON UPDATE CASCADE,
195 CHECK ("To" >= "From")
196);
197
198CREATE TABLE DiscountItem (
199 Id SERIAL PRIMARY KEY,
200 NewPrice NUMERIC(10,2) NOT NULL CHECK (NewPrice >= 0),
201 MenuMemberId INT4 NOT NULL,
202 MenuMemberMenuItemId INT4 NOT NULL,
203 DiscountId INT4 NOT NULL,
204 CONSTRAINT FKDiscountItem_Discount FOREIGN KEY (DiscountId) REFERENCES Discount (Id)
205 ON DELETE CASCADE ON UPDATE CASCADE,
206 CONSTRAINT FKDiscountItem_MenuMember FOREIGN KEY (MenuMemberId, MenuMemberMenuItemId) REFERENCES MenuMember (Id, MenuItemId)
207 ON DELETE RESTRICT ON UPDATE CASCADE
208);
209
210CREATE TABLE "Order" (
211 Id SERIAL PRIMARY KEY,
212 WaiterId INT4,
213 DateCreated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
214 DateFinished TIMESTAMP,
215 TypeId INT4 NOT NULL,
216 StatusId INT4 NOT NULL,
217 TableNumber INT4,
218 CONSTRAINT FKOrder_OrderType FOREIGN KEY (TypeId) REFERENCES OrderType (Id)
219 ON DELETE RESTRICT ON UPDATE CASCADE,
220 CONSTRAINT FKOrder_OrderStatus FOREIGN KEY (StatusId) REFERENCES OrderStatus (Id)
221 ON DELETE RESTRICT ON UPDATE CASCADE,
222 CONSTRAINT FKOrder_Employee FOREIGN KEY (WaiterId) REFERENCES Employee (Id)
223 ON DELETE SET NULL ON UPDATE CASCADE,
224 CONSTRAINT FKOrder_Table FOREIGN KEY (TableNumber) REFERENCES RestaurantTable (TableNumber)
225 ON DELETE SET NULL ON UPDATE CASCADE
226);
227
228CREATE TABLE OrderItem (
229 Id SERIAL PRIMARY KEY,
230 Quantity INT4 NOT NULL CHECK (Quantity > 0),
231 OrderId INT4 NOT NULL,
232 CreatedBy INT4,
233 Finished BOOL NOT NULL DEFAULT FALSE,
234 MenuMemberId INT4 NOT NULL,
235 MenuItemId INT4 NOT NULL,
236 CONSTRAINT FKOrderItem_Order FOREIGN KEY (OrderId) REFERENCES "Order" (Id)
237 ON DELETE CASCADE ON UPDATE CASCADE,
238 CONSTRAINT FKOrderItem_Employee FOREIGN KEY (CreatedBy) REFERENCES Employee (Id)
239 ON DELETE SET NULL ON UPDATE CASCADE,
240 CONSTRAINT FKOrderItem_MenuMember FOREIGN KEY (MenuMemberId, MenuItemId) REFERENCES MenuMember (Id, MenuItemId)
241 ON DELETE RESTRICT ON UPDATE CASCADE
242);
243
244CREATE TABLE Reservation (
245 Id SERIAL PRIMARY KEY,
246 GuestName VARCHAR(50) NOT NULL,
247 GuestPhone VARCHAR(50),
248 CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
249 StartTime TIME NOT NULL,
250 EndTime TIME NOT NULL,
251 "Date" DATE NOT NULL,
252 EmployeeId INT4,
253 TableNumber INT4,
254 CONSTRAINT FKReservation_Employee FOREIGN KEY (EmployeeId) REFERENCES Employee (Id)
255 ON DELETE SET NULL ON UPDATE CASCADE,
256 CONSTRAINT FKReservation_Table FOREIGN KEY (TableNumber) REFERENCES RestaurantTable (TableNumber)
257 ON DELETE SET NULL ON UPDATE CASCADE,
258 CHECK (EndTime > StartTime)
259);
260
261
262CREATE EXTENSION IF NOT EXISTS btree_gist;
263
264ALTER TABLE Reservation
265ADD CONSTRAINT no_overlap EXCLUDE USING gist (
266 TableNumber WITH =,
267 "Date" WITH =,
268 tsrange(("Date" + StartTime)::timestamp, ("Date" + EndTime)::timestamp) WITH &&
269);
270
271CREATE TABLE Invoice (
272 Id SERIAL PRIMARY KEY,
273 OrderId INT4 NOT NULL,
274 InvoiceDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
275 TotalAmount NUMERIC(10,2) NOT NULL DEFAULT 0 CHECK (TotalAmount >= 0),
276 TaxAmount NUMERIC(10,2) NOT NULL DEFAULT 0 CHECK (TaxAmount >= 0),
277 CONSTRAINT FKInvoice_Order FOREIGN KEY (OrderId) REFERENCES "Order" (Id)
278 ON DELETE RESTRICT ON UPDATE CASCADE
279);
280
281CREATE TABLE InvoiceItem (
282 Id SERIAL PRIMARY KEY,
283 InvoiceId INT4 NOT NULL,
284 OrderItemId INT4 NOT NULL,
285 OriginalPrice NUMERIC(10,2) NOT NULL CHECK (OriginalPrice >= 0),
286 DiscountedPrice NUMERIC(10,2) CHECK (DiscountedPrice >= 0),
287 Quantity INT4 NOT NULL CHECK (Quantity > 0),
288 CONSTRAINT FKInvoiceItem_Invoice FOREIGN KEY (InvoiceId) REFERENCES Invoice (Id)
289 ON DELETE CASCADE ON UPDATE CASCADE,
290 CONSTRAINT FKInvoiceItem_OrderItem FOREIGN KEY (OrderItemId) REFERENCES OrderItem (Id)
291 ON DELETE RESTRICT ON UPDATE CASCADE
292);
293
294
295