我在下面的用户界面中提供了调度功能。
我需要为每个月的每个星期设置医生可用时间。
我应该如何创建表来处理这个问题。
我以为我可以使用以下列创建table structure
但问题是,如果他在同一天访问两个不同的时间,我将为同一位医生添加2行。
我的数据库架构中是否存在任何问题,或者更好的表格设计是否有助于我做到这一点?
使用此表,我应该能够检测到特定日期和时间的医生是否可用
如何才能最好地改善我的桌面设计?
编辑:我正在工作的屏幕是为Hospital Staff to know when the visiting doctor is available
提供帮助,以便他们可以为患者预约一段时间或通知其他可用时间
答案 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)
-- 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 ;