首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >酒店管理数据库设计问题

酒店管理数据库设计问题
EN

Stack Overflow用户
提问于 2016-05-10 20:02:48
回答 2查看 9.6K关注 0票数 2

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

我使用MySQL 5.5.44 (树莓派Debian)和PHP的通信。

外键和主键把我搞糊涂了。

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

问题是:

我在网站的会员区域有一个选项,在那里用户可以取消预订。为此,我想要将取消的预订( Bookings表中的行)复制到取消表中,这是可行的,但在这样做之后,我想从Bookings表中删除取消的预订。这就是我的困境开始的地方。我不能从Bookings表中删除父行,因为取消表和Payments表中的Booking ID通过引用(FK和PK)连接。

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

我怎么才能让它工作呢?

如何在付款和取消表中保留BookingID作为FK和PK,但仍然删除Bookings表中的行?

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

以下是表的DESCRIBE

代码语言:javascript
复制
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)

我希望你们能帮助一个初学者完成他雄心勃勃的项目。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-10 20:07:36

完全删除cancellations表,然后在bookings表中添加以下内容之一:

  • cancelled_at时间戳可为空

SELECT *从cancelled_at为NULL

  • is_cancelled布尔值默认值false的预订中选择*

SELECT * FROM bookings WHERE is_cancelled = 0

票数 2
EN

Stack Overflow用户

发布于 2016-05-10 21:46:16

我会添加一个日期时间已取消字段,并将其包括在预订表中。我相信你无论如何都会想要跟踪它是什么时候被取消的。那么拥有它的布尔值也是多余的。这实际上只是一个偏好,有些人认为布尔值使SQL更容易阅读,但您必须添加约束,如取消没有时间戳的预订。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37137984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档