多房间预订的数据库设计:一对多
Posted
技术标签:
【中文标题】多房间预订的数据库设计:一对多【英文标题】:Database Design for Multiple Room Reservation: One To Many 【发布时间】:2012-03-06 20:51:27 【问题描述】:主要实体: 客户 客人 预订 房间分配
我想实现一个多房间预订数据库设计。首先,我想先解释一下这个概念:
-
客户是获得预订的人。
客户一次只能有 1 个预订
客户可以预订多个房间。
客人是被分配到特定房间的人。
所以对于表:
Client (client_id(PK), Name)
Guest (guest_id(PK), Name)
Reservation (reservation_id(PK), client_id(FK), roomAss_id(FK), checkInDate);
RoomAssignment (roomAss_id(PK), guest_id(FK), roomno(FK));
Room(room_id(PK), roomDetails);
//这里的问题是我不知道如何实现一对多的关系。我的预订应该处理多个 RoomAssignment?或者我的 RoomAssignment 会处理多个 guest_id 和 roomno,然后我会将 1 个 roomass_id 传递到我的预订表中?
谢谢,我真的很困惑这种一对多的关系。我希望有人能帮助我而不是给我负面的分数。 T_T
另一个尝试:
Room(room_id(PK), roomDetails);
Client (client_id(PK), Name)
Guest (guest_id(PK), Name)
Reservation (reservation_id(PK), client_id(FK), checkInDate);
Booking(book_id(PK), reservation_id(FK), room_id(FK));
Lodging(lodge_id(PK), guest_id(FK), book_id(FK))
(Client、Room、Guest 已满),添加 Reservation,添加 Booking,添加 Lodging
这是正确的吗??
【问题讨论】:
【参考方案1】:(编辑在考虑了更多之后改变了我的建议。这是一个比我最初想象的更深的谜题。)
我的偏好是让 Reservation 与房间具有多对多关系(使用桥接表)。使用 ReservationID 和 RoomID 外键调用此表,例如 . . . 预订。也许你可以想一个更好的名字。预订是预订的特定房间。然后,我将有另一个桥接表来表示客人和预订之间的关系。您也许可以称其为住宿。住宿是指分配给特定预订(预订房间)的特定客人。
这是一个很好的谜题。关键是你有几个具体的东西,它们独立存在并且显然是必要的(预订,房间,客人),还有其他几个概念,每个都有自己的属性,并且来自这些东西之间的关系。如果这将被正确规范化,您最终可能会得到比您想象的更多的表。不要认为这会变得更复杂。拥有足够的适当表格将最终简化这一过程。以下是一些其他建议:
花时间在每个表的名称上。我上面的建议非常好,但您可能可以改进它们。预订既是其他事物之间的关系,又成为一种思考本身,在另一张桌子上至少有一个外键。 您应该能够描述表中的记录所代表的内容。如果你不能做到这一点,那么你的桌子就糟透了。请参阅上面我如何描述预订和住宿。您的设计最终可能会有所不同,但当您集思广益时,请确保您可以描述该表上的实际记录。 考虑让 Guest 和 Client 来自同一个表。他们都是真正的“联系人”。有人可能在某一时刻成为客人,但在下个月成为客户。当联系人是客户时,您可能会保留一个额外的数据表(1 到 0 或 1)。如果某人只是作为客人,您的系统只会要求基本的联系信息,但如果他们作为客户,则更多。【讨论】:
是的,每个房间都应该有 1 位客人注册。所以 1 个房间也应该有 1 位客人。 先生,另一个问题,我将在哪里获得reservation_id,因为我打算最后添加预订。我的订单如下:房间(已经填写了值/详细信息等)、客户、客人、房间分配和预订。感谢您的回答 先生,请给我看看。我看不清楚。如果你展示它会更好,这样对我来说会更容易。请:))) 考虑在流程早期创建一个 Reservation(其中很多数据未填写)。您可能要等到以后才索要数据(抄送号码、牌照、是否打折等),但可能应该尽早创建记录。 Contact(Guest、Client 等)当然可以在 Reservation 之前创建,但预订应先于其他事物。并不是说使用该软件的人甚至会知道正在创建预订。 先生,是不是说我要先加订房再订房住宿?以上是关于多房间预订的数据库设计:一对多的主要内容,如果未能解决你的问题,请参考以下文章