【发布时间】:2020-07-17 07:18:00
【问题描述】:
我有一个包含 2 个表的数据库(主键是斜体):
- ROOM(ROOM_ID,DAY,HOUR)
- 预订(CUSTOMER_ID,ROOM_ID,日期)
第一个表格描述了房间的可用性和客户进行的第二个预订。
现在假设我在ROOM 中插入了 3 行:
3898 WEDNESDAY 2.00
3454 MONDAY 1.00
3563 MONDAY 1.00
两行变成RESERVATION:
0898 3454 05-09-2019
0567 3898 05-08-2019
现在我想创建一个约束,不允许已经预订房间的客户预订另一个同时可用的房间!
如果我尝试插入:
0567 3563 05-10-2019
我会收到一个错误,因为根据第一张桌子,房间 3454 和 3563 都在 1.00 可用。
谢谢!
【问题讨论】:
-
我认为唯一的自动解决方案是有一个触发器,我不建议这样做。这是您应该在您的应用程序或执行插入的存储过程内部检查的内容。
-
MYSQL 和 SQLSERVER 非常不同。您应该删除不适当的标签,或者如果您想要同时解决这两个问题,您应该这样说。
-
预订和房间之间没有有用的关系,因为房间不知道可用的日期,而预订也不知道所需的时间。鉴于此,只需在 customer_id 和日期的预订中创建一个唯一键。
-
"现在我想创建一个约束,不允许已经预订房间的客户预订另一个同时可用的房间!" - 就像有人说“哦,我们带着孩子来,请给我两个房间”?这个要求至少对我来说听起来很糟糕,并且完全没有考虑到你为一个客户预订多个房间的现实世界场景。小心你真的想要这个 - 因为我可以想到很多原因我确实同时预订了多个房间。
-
补充一点,你的名字并不反映你的模型。 “房间”这个名字很糟糕,因为它反映了房间在给定(但非常有缺陷的)时间段内的可用性。请注意,您的描述中隐含了“句号”-这真的是您系统的限制吗?正如其他人已经说过的那样,您应该真正考虑您的模型。
标签: sql sql-server