我正在尝试通过开发一个酒店管理系统来开始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:
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)我希望你们能帮助一个初学者完成他雄心勃勃的项目。
谢谢。
发布于 2016-05-10 20:07:36
完全删除cancellations表,然后在bookings表中添加以下内容之一:
cancelled_at时间戳可为空SELECT *从cancelled_at为NULL
is_cancelled布尔值默认值false的预订中选择*SELECT * FROM bookings WHERE is_cancelled = 0
发布于 2016-05-10 21:46:16
我会添加一个日期时间已取消字段,并将其包括在预订表中。我相信你无论如何都会想要跟踪它是什么时候被取消的。那么拥有它的布尔值也是多余的。这实际上只是一个偏好,有些人认为布尔值使SQL更容易阅读,但您必须添加约束,如取消没有时间戳的预订。
https://stackoverflow.com/questions/37137984
复制相似问题