次のようにデータモデルを変更します。
BookingPeriods にはタイムスロットのリストが含まれます。例えば。午前と午後で予約できます。この場合、StartTime は午前 9 時、EndTime は午後 1 時になります。または、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)
)
このデータ モデルは、次のように使用されます。
ここでタイムスロットに「オーバーラップ」を登録しないようにしてください。より細かい詳細が必要な場合は、たとえば 1 時間ごとにレコードを作成する必要があります。
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