酒店管理数据库设计问题

时间:2016-05-10 12:02:48

标签: mysql sql database

我试图通过开发酒店管理系统来开始使用Web开发。

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

外键和主键让我感到困惑。

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

HotelDB

问题是:

我在网站的会员区有一个选项,用户可以取消预订。为此,我想将取消的预订(预订表中的行)复制到取消表中并且这样做但是在我这样做之后我想要从预订表中删除已取消的预订。现在这就是我的困境开始的地方。我无法从预订表中删除父行,因为取消表中的预订ID和付款表通过参考(FK和PK)连接。

我需要将BookingID作为PK,因为它是整个系统中唯一的唯一值。客户可能拥有唯一的ID,但他可以拥有多个预订,并且表中的PK必须是唯一的。每个客户的多次预订允许在表中多次出现相同的CustomerID。但是,即使是同一个客户,BookingID也始终是唯一的。这就是为什么我需要预订ID。

我如何让这个工作?

如何在付款和取消表中将BookingID保留为FK和PK,但仍然可以删除预订表中的行?

我是否必须重新设计DB-Schema?如果是的话,你会怎么做?

以下是表格的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)

我希望你们能用他雄心勃勃的项目来帮助初学者。

谢谢。

2 个答案:

答案 0 :(得分:3)

我会添加一个datetime取消字段并将其包含在预订表中。我相信你会想要跟踪它何时被取消。然后对它使用布尔也只是多余的。虽然这只是一个偏好,有些人认为布尔值使SQL更容易阅读,但你必须添加约束,比如没有时间戳就取消预订。

答案 1 :(得分:2)

完全删除cancellations表,然后将以下一个添加到bookings表中:

  • cancelled_at时间戳可以为空

    SELECT * FROM bookings WHERE cancelled_at IS NULL
    
  • is_cancelled boolean default false

    SELECT * FROM bookings WHERE is_cancelled = 0