[英]Hotel Management Database Design Problems
我正在尝试通过开发酒店管理系统来开始进行Web开发。
我正在使用MySQL 5.5.44(Raspberry Pi Debian)和PHP PDO进行通信。
外键和主键使我困惑。
这是我的数据库设计(通过DbVisualizer创建的图形)
问题是:
我在网站的会员区有一个选项,用户可以在其中取消预订。 为此,我想将已取消的预订(在“预订”表中的行)复制到“取消表”中,但是这样做之后我想从“预订表”中删除已取消的预订。 现在这是我的困境开始的地方。 我无法从预订表中删除父行,因为取消表中的预订ID和付款表是通过参考(FK和PK)连接的。
我需要BookingID作为PK,因为它是整个系统中唯一的唯一值。 客户可能具有唯一的ID,但他可以有多个预订,并且表中的PK必须唯一。 每个客户的多个预订允许同一客户ID在表中多次出现。 但是,即使是同一客户,BookingID也始终是唯一的。 这就是为什么我需要输入预订ID。
我该如何工作?
如何在“付款和取消”表中将BookingID保留为FK和PK,但仍然摆脱了Bookings表中的行?
我是否需要重新设计数据库架构? 如果是,您将如何做?
这是表的DESCRIBE
:
mysql> describe Bookings;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| BookingID | int(11) | NO | PRI | 0 | |
| Arrival | datetime | YES | | NULL | |
| Checkout | datetime | YES | | NULL | |
| RoomNumber | int(11) | YES | MUL | NULL | |
| CustomerID | int(11) | YES | MUL | NULL | |
| Breakfast | int(11) | YES | | NULL | |
| Nights | int(11) | YES | | NULL | |
| Comment | varchar(400) | YES | | NULL | |
| BookType | varchar(50) | YES | MUL | NULL | |
| BookTime | datetime | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
10 rows in set (0.00 sec)
mysql> describe Cancellations;
+------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+-------+
| BookingID | int(11) | NO | PRI | 0 | |
| Arrival | datetime | YES | | NULL | |
| Checkout | datetime | YES | | NULL | |
| RoomNumber | int(11) | YES | MUL | NULL | |
| CustomerID | int(11) | YES | MUL | NULL | |
| Breakfast | int(11) | YES | | NULL | |
| Nights | int(11) | YES | | NULL | |
| BookTime | datetime | YES | | NULL | |
| CancelTime | datetime | YES | | NULL | |
+------------+----------+------+-----+---------+-------+
9 rows in set (0.00 sec)
mysql> describe Payments;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| BookingID | int(11) | NO | PRI | 0 | |
| CustomerID | int(11) | YES | MUL | NULL | |
| Amount | decimal(10,0) | YES | | NULL | |
| Paid | varchar(10) | YES | | NULL | |
| PayTime | datetime | YES | | NULL | |
| Invoice | varchar(50) | YES | | NULL | |
| Cancelled | varchar(10) | YES | | NULL | |
+------------+---------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
我希望你们能帮助初学者完成他的雄心勃勃的项目。
谢谢。
我将添加一个datetime取消字段,并将其包括在预订表中。 我敢肯定,无论如何它都会被取消的时间保持跟踪。 然后使用布尔值也将是多余的。 不过,这实际上只是一个首选项,有些人认为布尔值使SQL易于阅读,但是您必须添加约束,例如取消保留而没有时间戳。
完全放下cancellations
表,然后在bookings
表中添加以下内容之一 :
cancelled_at
时间戳为可空
SELECT * FROM bookings WHERE cancelled_at IS NULL
is_cancelled
布尔默认false
SELECT * FROM bookings WHERE is_cancelled = 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.