我会像这样更改您的数据模型:
BookingPeriods 将包含一个时间段列表。例如。您可以在早上和下午预订,这将使 StartTime 上午 9 点和 EndTime 下午 1 点。或者以一个小时为单位,这意味着记录上午 9 点到 10 点、上午 10 点到 11 点等。
Create table BookingPeriods (
id int primary key
, StartTime Time
, EndTime Time
, Description varchar(max)
)
BookingAvailability 将是时间段和日期之间的简单映射。所以你有一个每个日期的列表,其中可能有哪些时间段
Create table BookingAvailability(
id int primary key
, Day Date
, PeriodId int references BookingPeriods(id)
constraint uq_bookingAvailability unique (Day, PeriodId)
)
BookableAreas 只是成为物理位置的列表。
Create table BookableAreas(
id int primary key
, Name varchar(100)
, ActivityTypeId int
, Description varchar(max)
)
成员保持不变
Create table Members(
id int primary key
, FirstName varchar(100)
, ...
)
然后预订就变成了所有东西都汇集在一起的桌子。您每个可用性记录和区域的唯一记录。memberid 只是记录的一些辅助信息。
Create table Bookings(
id int primary key
, AvailabilityId int references BookingAvailability(id)
, AreaId int references BookableAreas(id)
, MemberId int references Members(id)
constraint uq_Bookings unique (AvailabilityId, AreaId)
)
该数据模型将按如下方式使用:
确保永远不要在此处的时隙中注册“重叠”。例如,如果您想要更细粒度的细节,您需要每小时创建一条记录。
INSERT INTO BookingPeriods (id, StartTime, EndTime, Description)
VALUES (1, '9:00 AM', '12:00 AM', 'Morning'),
(2, '1:00 PM', '4:00 PM', 'Afternoon')
这是您可以预订的可能时间段列表。(例如周末的日期不包括在内)
INSERT INTO BookingAvailability(id, [Day], PeriodId)
VALUES (1, '20120801', 1),
(2, '20120801', 2),
(3, '20120801', 1),
(4, '20120801', 2),
(5, '20120801', 1),
(6, '20120801', 2)
INSERT INTO BookableAreas (id, Name, ActivityTypeId, Description)
VALUES (1, 'Ground Floor', 1, 'The ground floor room'),
(2, 'East Wing Room', 1, 'The east wing room on the first floor'),
(3, 'West Wing Room', 1, 'The west wing room on the first floor')
INSERT INTO Members(id, FirstName)
VALUES (1, 'Barak'),
(2, 'Tony'),
(3, 'George')
在这里,我们尝试创建实际的预订。
INSERT INTO Bookings(id, AvailabilityId, AreaId, MemberId)
VALUES (1, 3, 1, 1) -- Barak books the ground floor on 20120801 in the morning
INSERT INTO Bookings(id, AvailabilityId, AreaId, MemberId)
VALUES (2, 3, 1, 2) -- Tony books the ground floor on 20120801 in the morning --> error
INSERT INTO Bookings(id, AvailabilityId, AreaId, MemberId)
VALUES (2, 4, 1, 2) -- Tony books the ground floor on 20120801 in the afternoon --> ok