我正在使用asp.net的酒店管理系统,我在设计数据库时遇到了问题。
我有这样的事情:
我想我需要制作3张桌子:
guest id
主键,Guest name
,Member ID
外键Member ID
主键,Name
,address
,... Reservation ID
主键,guest ID
外键,... 我的问题是我不知道如何在表格之间建立关系。
例如,客人是公司,他为5名成员预订, 但一个月之后,他想再为8名成员预留。
我应该做些什么才能让我第二次预订,而没有义务再做一次guest ID
?
答案 0 :(得分:1)
似乎架构不需要比这复杂得多,除非你还需要显示某些客人在哪里得到自己的房间等等。正如我在评论中提到的,我认为没有什么这要求每位客人都必须是会员,在这种情况下,我只需要清除ReservationGuests
并在预订更新时重新填充。谁想写出试图猜测哪些原始客人实际上仍在列表中的逻辑?
CREATE TABLE dbo.Members
(
MemberID INT PRIMARY KEY,
-- ... name, address, etc.
);
CREATE TABLE dbo.Reservations
(
ReservationID INT PRIMARY KEY,
MemberID INT FOREIGN KEY REFERENCES dbo.Members(MemberID),
... other attributes such as dates
);
CREATE TABLE dbo.ReservationGuests
(
ReservationID INT FOREIGN KEY REFERENCES dbo.Reservations(ReservationID),
GuestName NVARCHAR(255),
... other guest attributes
);
答案 1 :(得分:0)
问题在于您假设客人有会员。这不是 - 正如你所提到的,本周我可能和我的配偶一起旅行,下周我可能和全家人一起旅行,一周之后我可能独自旅行。 预订有会员,每个预订的成员集可能不同。希望有所帮助。
答案 2 :(得分:0)
嗯,你需要为客人单独的桌子,所以他们第一次来到酒店你必须在你的系统上注册该客人。正如你所说,也许他会在一个月后再来,所以你必须搜索他的SSN(社会安全号码)。如果他已经注册,你不必再注册他。
并且您的预订表应该是分开的。您应该为每个预订签发预订ID。所以你可以分别识别字段。
例如
一家公司第一次抵制,他的注册号码是“101”,那时他的预订ID是“555”
一个月后他会再来。并且您的系统有选项,可以检查他是否已被抵制。在系统通知之后他已经抵制并且只为新预订制作新的预订ID答案 3 :(得分:0)
CREATE TABLE Member
(
Id INT IDENTITY (1,1) PRIMARY KEY,
Name VARCHAR(256),
Address VARCHAR(512),
MemberTypeId INT --FK to MemberType.Id
)
CREATE TABLE MemberType
(
Id INT IDENTITY(1,1) PRIMARY KEY,
TypeDescription VARCHAR(128)
)
CREATE TABLE Reservation
(
Id INT IDENTITY(1,1) PRIMARY KEY,
MemberId INT --FK to Member.Id
)
CREATE TABLE ReservationList
(
ReservationId INT, --FK to Reservation.Id
MemberId INT --FK to Member.Id
--Both of these values can act as a composite key
--At minimum, they should be unique as a pair
)
以上架构是我根据您的描述创建数据库的方式。预订表仅作为总体预订,可由公司成员制作,而无需在预订中实际包含公司成员(公司进行预订,但仅限于其员工)。然后,ReservationList是将与每个预订绑定的所有成员的列表。
希望这有助于:)