医生调度数据库设计

时间:2013-05-21 11:43:54

标签: sql-server database oracle database-design

我在下面的用户界面中提供了调度功能。

enter image description here

我需要为每个月的每个星期设置医生可用时间。

我应该如何创建表来处理这个问题。

我以为我可以使用以下列创建table structure

  1. DoctorId
  2. 日期
  3. AvalableFrom
  4. AvalilableTo
  5. 但问题是,如果他在同一天访问两个不同的时间,我将为同一位医生添加2行。

    我的数据库架构中是否存在任何问题,或者更好的表格设计是否有助于我做到这一点?

    使用此表,我应该能够检测到特定日期和时间的医生是否可用

    如何才能最好地改善我的桌面设计?

    编辑:我正在工作的屏幕是为Hospital Staff to know when the visiting doctor is available提供帮助,以便他们可以为患者预约一段时间或通知其他可用时间

3 个答案:

答案 0 :(得分:4)

我会把这一天划分为15或30分钟,并为每个医生创建一个记录,为每个医生提供可用的记录。它很好地照顾了它的独特性。

约会可以是单个记录,它所涵盖的时间段可以引用约会记录。

因为它以与约会时间相同的方式记录非约会可用时间,因此针对此方法的查询通常非常简单 - 例如,查询给定长度的可用时间段,或计算多少医生的时间不用于预约,或平均预约时间等。

表格如下:

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

allocation_id引用约会或培训时间或其他分配,如果该时段是免费的,则不提供任何内容。

日期数据类型包括Oracle上的时间组件。

答案 1 :(得分:4)

编辑:我误解了这个问题。

你的设计很好 - 在反映多个平均值的表中有多行是没有错的。您可能考虑的唯一改进是将AvailableFrom和AvailableTo作为日期时间值而不是时间,因此您可以删除“日期”列。这有助于您处理跨越午夜的可用性。

答案的其余部分与问题无关 - 这是基于对问题的误解。

首先,你需要知道医生的工作时间是什么时候;这可能很简单(每天9 - 5),或复杂(周一9-5,周二不可用,周三 - 周五9-12:30)。您可能还需要记录每天的休息时间 - 例如午餐 - 所以您不要在午餐时安排预约;我假设不同的医生会在不同时间休息。

接下来,您可能希望记录每天的“约会”,而不是记录“可用性”。当他们的日程安排表明他们正在工作时,以及他们没有预定的预约时,医生可以使用。

因此,您的架构可能是:

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

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

DoctorAppointment
----------------
DoctorID
Date
AppointmentStartTime
AppointmentEndTime

答案 2 :(得分:-1)

  1. doctors: (This table will have details about the doctor) patients: (This table will have details about the patient)
  2. specialization: (It defines the specialization of a doctor e.g. Dentist, Dermatologist etc.)
  3. appointment_schedule: (Doctor will create an appointment schedule)
  4. booking_status (Has different status for booking an appointment)
  5. bookings (when a user books an appointment for a particular schedule and for a particular date and time)
-- 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 ;