ユーザーが医師の診察を予約できるテーブル構造が必要であると仮定すると (医師がスケジュールを管理するのを支援するのではなく、質問がさまざまな時間に両方を暗示しているように思われるため)、ユーザーに何を伝えるテーブルを設計したくありません。医師が行っています。ユーザーは、医師が空いているかどうかだけを気にする必要があります。なぜ、医師が休暇中であることを知る必要があるのでしょうか。医師に1〜2週間空きがないことを確認するだけで十分です。以下は、これの単純化されたテーブル構造を示しています。医師の名前の参照テーブルであり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 に設定することもできます)。