【发布时间】:2018-03-10 02:05:48
【问题描述】:
我正在尝试通过开发酒店管理系统来开始 Web 开发。
我使用 MySQL 5.5.44 (Raspberry Pi Debian) 和 PHP PDO 进行通信。
外键和主键把我搞糊涂了。
这是我的数据库设计(通过 DbVisualizer 创建的图表)
问题是:
我在网站的会员区有一个选项,用户可以在其中取消预订。为此,我想将取消的预订(预订表中的行)复制到取消表中,但这样做之后我想从预订表中删除取消的预订。现在这是我的困境开始的地方。我无法从预订表中删除父行,因为取消表中的预订 ID 和付款表通过参考(FK 和 PK)连接。
我需要 BookingID 作为 PK,因为它是整个系统中唯一的唯一值。一个客户可能有一个唯一的 ID,但他可以有多个预订,并且 PK 在表中必须是唯一的。每个客户的多个预订允许相同的客户 ID 在表中多次出现。但是 BookingID 始终是唯一的,即使它是同一个 Customer。这就是我需要预订 ID 的原因。
我如何让它工作?
如何将 BookingID 在 Payments 和 Cancellation 表中保留为 FK 和 PK,但仍摆脱 Bookings 表中的行?
我必须重新设计 DB-Schema 吗?如果是,你会怎么做?
这里是表格的DESCRIBEs:
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)
我希望你们可以帮助初学者完成他雄心勃勃的项目。
谢谢。
【问题讨论】:
-
让
Bookings和Cancellations成为两个单独的表似乎有点不自然。它们包含相同的数据并代表相同的事物。为什么要把它们分开?Bookings可以简单地拥有某种“状态”列,其中“已取消”可以是有效状态。最多,如果Cancellation有额外的数据,不一定是Booking的一部分,那么给它一个FK 到Bookings并将额外的数据存储在其中。但不要将相同的数据复制到多个表中。手动保持数据同步既困难又不必要。 -
我只想在预订表中有“成功”的预订。所以我决定分开,但我想这是个坏主意。