2013-05-21 10 views
5

私はこの機能をスケジューリングするためのユーザーインターフェイスの下に置いています。博士スケジューリングデータベース設計

enter image description here

私はセットアップに月の各週のためのいくつかの日のために医師に利用可能な時間を必要としています。

これを処理するためのテーブルを作成する方法

は、私は私が下の列

  1. DoctorId
  2. AvalableFrom
  3. AvalilableTo

しかし、ここでの問題は、私は2を追加していく予定れるとtable structureを作成することができると思いました彼が同じ日に2つの異なるタイミングを訪れるならば、同じ医者の行。

私のデータベースのスキーマに問題はありますか、それ以上のテーブルデザインはこれを簡単にするのに役立ちますか?この表では

私は医師が特定の日や時間、私は私のテーブルのデザインを向上させることができますどのように最善の

ために利用可能であるかを検出することができるはずですか?

編集:私が働いて、画面がHospital Staff to know when the visiting doctor is availableを助けるために、であるので、彼らは

+0

可能重複/stackoverflow.com/questions/16497386/schedule-table-design) – Pondlife

+1

参考:http://www.vertabelo.com/blog/technical-articles/a-database-model-to-manage-appointments-and-organize -schedules –

答えて

4

の時間のために患者のための任命を予約したり、他の利用可能な時間を知らせることができ、私はに日割るとなるだろうセグメントを15分または30分に設定し、利用可能な各スロットのすべての医師の記録を作成します。それは一意性を非常にうまく処理します。

アポイントは1つのレコードにすることができ、それがカバーするタイムスロットはアポイントレコードを参照できます。

予約時間と同じ方法で非予約可能時間を記録するため、この方法に対するクエリは一般に非常に単純です。たとえば、指定された長さの利用可能なタイムスロットを照会するか、医師の時間の予定、または予定の平均の長さなどのために使用されなかった。..

のようなテーブルが何かのようになります。allocation_idが予定またはトレーニング時間や他の割り当てを参照するか、

create table staff_time(
    staff_id integer, 
    time_slot date, 
    allocation_id) 

スロットが空いている場合は何も表示されません。

日付データ型には、Oracleの時刻コンポーネントが含まれています。

+0

ここでテーブルデザインを追加するともっと分かりやすくなると思います。 – Billa

+0

+ 1の予定と医者の可用性は同じ方法で表されているため、アプリケーションの設計が期待通りに簡単になります。 –

+0

「私は15分または30分のセグメントに分け、利用可能な各スロットのすべての医師の記録を作成します」これらのタイムスロットは1週間のみですか、または将来の実際の日付にマッピングされていますか? –

4

EDIT:質問に誤解されました。

あなたのデザインはうまくいきます。テーブルに複数のエフェンスを反映した複数の行があることは間違いありません。考慮すべき唯一の改良点は、AvailableFromとAvailableToが時刻ではなく日時の値になるため、「日付」列を削除できることです。これにより、深夜の空き状況を処理するのに役立ちます。

残りの質問は、問題の誤解に基づいています。

まず、医師の勤務時間がいつであるかを知る必要があります。これは単純なもの(毎日9~5日)または複雑なもの(9~5月曜日、火曜日は利用できない、9~12:30は水曜日 - 金曜日)。また、休憩時間(昼食など)を毎日記録する必要があるため、昼食以上に予定を設定しないでください。私は別の医師が別々の時間に彼らの休憩を取ると仮定しています。

次に、「可用性」を記録する代わりに、毎日「予定」を記録することをお勧めします。医師は、自分のスケジュールが働いていると言われたとき、そして予定された予定がないときに利用できます。

だから、あなたのスキーマは次のようになります。

Doctors 
-------- 
DoctorID 
.... 

DoctorSchedule 
------------ 
DoctorID 
DayOfWeek 
StartTime 
BreakStartTime 
BreakEndTime 
EndTime 

DoctorAppointment 
---------------- 
DoctorID 
Date 
AppointmentStartTime 
AppointmentEndTime 
+0

重要なことは、多くの訪問医がいることです。彼らは1日にわずか数時間しか訪れません。週/月ごとに変更される可能性があります。私はいつか「週3日」、「午前10時」から「午前12時」にしか訪れないことを意味します。その場合、私は医者が3時に、または特定の日付に利用できないことを知るべきです。 – Billa

+0

私が働いているスクリーンは、「病院のスタッフが訪問可能な医師が利用可能であることを知るのを助ける」ために、彼らが予約を予約できるようにすることです。 – Billa

+0

ああ - 大丈夫、答えを更新しました。 –

0
  1. 医師:(この表は、医師の詳細を持つことになります) 患者:
  2. 専門(このテーブルには、患者の詳細を持っています): (医師、歯科医師などの専門医を定義しています)
  3. 予定:
  4. 予約状況/:[スケジュール表デザイン](HTTPの任命予約をifferentステータス)
  5. 予約(ユーザー書籍特定のスケジュールのための特定の日時の予約)
-- Table structure for table 'appointment_schedule' 
CREATE TABLE IF NOT EXISTS 'appointment_schedule' (
    'id' int(11) NOT NULL AUTO_INCREMENT, 
    'doctors_id' int(11) NOT NULL, 
    'working_days' varchar(50) NOT NULL, 
    'morning_time_start' time DEFAULT NULL, 
    'morning_time_end' time DEFAULT NULL, 
    'morning_tokens' int(11) NOT NULL, 
    'afternoon_time_start' time DEFAULT NULL, 
    'afternoon_time_end' time DEFAULT NULL, 
    'afternoon_tokens' int(11) NOT NULL, 
    'evening_time_start' time DEFAULT NULL, 
    'evening_time_end' time DEFAULT NULL, 
    'evening_tokens' int(11) NOT NULL, 
    PRIMARY KEY ('id') 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; 
-- -------------------------------------------------------- 
-- Table structure for table 'bookings' 
CREATE TABLE IF NOT EXISTS 'bookings' (
    'id' int(11) NOT NULL AUTO_INCREMENT, 
    'doctors_id' int(11) NOT NULL, 
    'appointment_schedule_id' int(11) NOT NULL, 
    'patients_id' int(11) NOT NULL, 
    'diseases_description' text NOT NULL, 
    'datetime_start' datetime NOT NULL, 
    'datetime_end' datetime NOT NULL, 
    'status_id' int(11) NOT NULL DEFAULT '1', 
    PRIMARY KEY ('id') 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 
-- -------------------------------------------------------- 
-- Table structure for table 'booking_status' 
CREATE TABLE IF NOT EXISTS 'booking_status' (
    'id' int(11) NOT NULL AUTO_INCREMENT, 
    'name' varchar(25) NOT NULL, 
    PRIMARY KEY ('id') 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

-- Dumping data for table 'booking_status'  
INSERT INTO 'booking_status' ('id', 'name') VALUES 
(1, 'Pending for Approval'), 
(2, 'Approved & Booked'), 
(3, 'Cancelled by User'), 
(4, 'Visited'), 
(5, 'User failed to Visit'); 
-- -------------------------------------------------------- 
-- Table structure for table 'doctors' 
CREATE TABLE IF NOT EXISTS 'doctors' (
    'id' int(11) NOT NULL AUTO_INCREMENT, 
    'name' varchar(50) NOT NULL, 
    'specialization_id' int(11) NOT NULL, 
    'clinic_name' varchar(50) NOT NULL, 
    'address' varchar(1000) NOT NULL, 
    'qualification' varchar(50) NOT NULL, 
    'rating' int(11) NOT NULL, 
    PRIMARY KEY ('id') 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 
-- -------------------------------------------------------- 
-- Table structure for table 'patients' 
CREATE TABLE IF NOT EXISTS 'patients' (
    'id' int(11) NOT NULL AUTO_INCREMENT, 
    'first_name' varchar(50) NOT NULL, 
    'last_name' varchar(50) NOT NULL, 
    'address' varchar(500) NOT NULL, 
    'contact' varchar(100) NOT NULL, 
    PRIMARY KEY ('id') 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

-- -------------------------------------------------------- 
-- Table structure for table 'specialization' 
CREATE TABLE IF NOT EXISTS 'specialization' (
    'id' int(11) NOT NULL AUTO_INCREMENT, 
    'name' varchar(100) NOT NULL, 
    PRIMARY KEY ('id') 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 
+1

クレジットなしでここから取得した回答: http://forums.mcapoint.com/Thread-MySQL-Doctors-appointment-management-system-Database-Schema-Structuret5 –

関連する問題