我在设计数据库时需要帮助

时间:2012-03-09 17:51:38

标签: sql sql-server database-design

enter image description here

我正在使用asp.net的酒店管理系统,我在设计数据库时遇到了问题。

我有这样的事情:

  1. 两类宾客:家庭和公司
  2. 每种类型都可以有许多成员,每个成员都有属性
  3. 预订由客人
  4. 预订

    我想我需要制作3张桌子:

    • 来宾: guest id主键,Guest nameMember ID外键
    • 会员: Member ID主键,Nameaddress,...
    • 预订: Reservation ID主键,guest ID外键,...

    我的问题是我不知道如何在表格之间建立关系。

    例如,客人是公司,他为5名成员预订, 但一个月之后,他想再为8名成员预留。

    我应该做些什么才能让我第二次预订,而没有义务再做一次guest ID

4 个答案:

答案 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是将与每个预订绑定的所有成员的列表。

希望这有助于:)