假设您想要一个允许用户与医生预约的表格结构(而不是帮助医生管理他们的日程安排,因为这个问题似乎在不同的时间都暗示了两者),我们不想设计一个表格来告诉用户什么医生在做。用户应该只关心医生是否有空——为什么他们需要知道医生在休假?仅仅看医生一两个星期没有开口就足够了。下面显示了一个简化的表结构:医生姓名的参考表,在哪里DoctorID
可以显示医生的姓名和他/她的可用时间。
为了解决用户预约的问题,用户会看到有空闲时间的医生,并且时间会以一种DATETIME
格式安排,以便他们可以在适当的时间与医生预约。如果医生不在,则不会在特定日期为他们显示时间(这意味着用户可以选择他们想要的时间段 - 如下面的简单示例所示):
CREATE TABLE Doctor(
DoctorID INT,
DoctorName VARCHAR(250)
)
CREATE TABLE Appointment(
DoctorID INT,
AppointmentHour DATETIME,
Available BIT DEFAULT 1
)
INSERT INTO Doctor
VALUES (1,'John Doe')
, (2,'Jane Doe')
INSERT INTO Appointment (DoctorID, AppointmentHour)
VALUES (1,'2013-01-01 10:00:00.000')
, (1,'2013-01-01 11:00:00.000')
, (1, '2013-01-01 13:00:00.000')
, (1, '2013-01-01 14:00:00.000')
, (2, '2013-01-01 15:00:00.000')
SELECT d.DoctorName
, a.AppointmentHour
, a.Available
FROM Appointment a
INNER JOIN Doctor d ON a.DoctorID = d.DoctorID
DROP TABLE Doctor
DROP TABLE Appointment
SQLFiddle 展示了这个例子。另一方面,如果你想为医生建立一个应用程序来设置他们自己的时间表,这可以以类似的方式工作,医生将输入他们将可用的时间,然后,如上面的简单结构所示,用户只会看到那些可用时间(当他们选择时间时,该Available
列变为 0 - 意味着它不会显示在 C# 应用程序中)。例如:
UPDATE Appointment
SET Available = 0
WHERE AppointmentHour = @UserSelection --OR: @DoctorVacation/@DoctorLunch/@DoctorOther
将是用户选择时间时的 SQL 语句示例(现在,其他用户无法选择它)。对于医生来说,可能有一个默认时间,比如上午 8 点到下午 5 点,假定医生有空,除非他们决定不去(在这种情况下,这些时间将从预约表中删除,或者它们也可以设置为 0,这样它们就不会出现在应用程序上,这样用户就无法选择这些时间)。