繁体   English   中英

酒店管理数据库设计问题

[英]Hotel Management Database Design Problems

我正在尝试通过开发酒店管理系统来开始进行Web开发。

我正在使用MySQL 5.5.44(Raspberry Pi Debian)和PHP PDO进行通信。

外键和主键使我困惑。

这是我的数据库设计(通过DbVisualizer创建的图形)

HotelDB

问题是:

我在网站的会员区有一个选项,用户可以在其中取消预订。 为此,我想将已取消的预订(在“预订”表中的行)复制到“取消表”中,但是这样做之后我想从“预订表”中删除已取消的预订。 现在这是我的困境开始的地方。 我无法从预订表中删除父行,因为取消表中的预订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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM