โมเดลปฏิทิน Django
ฉันกำลังสร้างแอปนัดหมายแพทย์ด้วย Django และ Django Rest Framework แอปจะมีฟังก์ชันสำหรับเลขานุการในการเพิ่มการนัดหมายลงในปฏิทินของแพทย์และแพทย์แต่ละคนอาจมีคลินิกมากกว่าหนึ่งแห่ง (และเลขานุการหลายคน)
ฉันสร้างCalendarโมเดลนี้เพื่อเก็บข้อมูลความพร้อมของแพทย์ซึ่งโดยพื้นฐานแล้วจำเป็นต้องแจ้งให้ทราบ:
- ในวันใดวันหนึ่งแพทย์จะเริ่มและทำงานให้เสร็จในเวลาใด
- ในวันที่กำหนดเวลาที่แพทย์จะเริ่มและสิ้นสุดเวลาพัก (ถ้าเป็นเช่นนั้น)
วิธีนี้เป็นวิธีที่ดีที่สุดหรือไม่
class Calendar(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE, related_name="appointments")
clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE, related_name="appointments")
monday_start = models.TimeField()
monday_end = models.TimeField()
monday_break_start = models.TimeField()
monday_break_end = models.TimeField()
# continues for every single day of the week
คำตอบ
นี่เป็นวิธีแก้ปัญหาที่ค่อนข้างง่ายที่คุณมีที่นี่และอาจใช้งานได้ในทางทฤษฎี แต่จากประสบการณ์ของฉันในคำพูดจริงคุณต้องมีอะไรที่ยืดหยุ่นกว่านี้ นอกจากนี้คุณไม่คิดเกี่ยวกับความซ้ำซ้อนของข้อมูล
จะเกิดอะไรขึ้นถ้าแพทย์เช่นทำงานเพียงหนึ่งวันในหนึ่งสัปดาห์ จากนั้นคอลัมน์ส่วนใหญ่จะว่างเปล่า หรือถ้าหมอทำงานได้เฉพาะตอนเช้า? จากนั้นจะไม่มี break_start หรือสิ้นสุดในฟิลด์ปฏิทินใด ๆ ตัวอย่างเช่นถ้าแพทย์ทำงานทุกสัปดาห์ที่สอง? จากนั้นคุณจะไม่มีวิธีง่ายๆในการจัดเก็บข้อมูลนี้ นอกจากนี้จะมีข้อมูลที่ซ้ำซ้อนจำนวนมาก หากคุณจะให้แพทย์แต่ละคนทำงานตั้งแต่ 8.00-16.00 น. คุณจะมีข้อมูลนี้เก็บไว้ที่นั่นซ้ำ ต้องการพื้นที่น้อยกว่ามากหากคุณสามารถจัดเก็บข้อมูลดังกล่าวเป็นความสัมพันธ์กับบันทึกระยะเวลาบางประเภท
ถ้าฉันเป็นคุณฉันจะสร้างรูปแบบทั่วไปขึ้นซึ่งคุณสามารถจัดเก็บได้มากถึง 365 บันทึก (สำหรับแต่ละวันในปี) สำหรับแต่ละปฏิทิน จากนั้นแต่ละวันจะมีความสัมพันธ์กับรายการช่วงเวลาซึ่งอาจเป็นกิจกรรมที่จำเป็นในภายหลัง ด้วยวิธีนี้คุณจะได้รับการออกแบบที่ยืดหยุ่นมากขึ้น
ร่างอาจมีลักษณะดังนี้:
class Calendar(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE)
class CalendarDay(models.Model):
date = model.DateField()
calendar = models.ForeignKey(Calendar, on_delete=models.CASCADE)
class TimeInterval(models.Model):
activity = models.Integer(choices = [(1, 'Working'), (2,'Lunch Break'), (3, 'Afternoon Break') ...])
start = models.TimeField()
end = models.TimeField()
calendar_day = models.ForeignKey(CalendarDay, on_delete=models.CASCADE)
เพื่อให้ข้อมูลมีความสมบูรณ์คุณสามารถเพิ่มข้อ จำกัด เฉพาะในการรวมคอลัมน์วันที่และปฏิทินในตาราง CalendarDay ด้วยวิธีนี้แต่ละปฏิทินสามารถมีบันทึกวันที่เฉพาะในตาราง CalendarDay ได้เพียงรายการเดียว