Mẫu lịch Django
Tôi đang xây dựng ứng dụng đặt lịch hẹn bác sĩ với Django và Django Rest Framework. Ứng dụng sẽ có chức năng để thư ký thêm các cuộc hẹn vào lịch của Bác sĩ và mỗi Bác sĩ có thể có nhiều phòng khám (và nhiều thư ký).
Tôi đã xây dựng CalendarMô hình này để lưu trữ thông tin về tình trạng sẵn sàng của một bác sĩ, về cơ bản cần thông báo:
- vào một ngày nhất định, bác sĩ bắt đầu và kết thúc công việc lúc mấy giờ
- vào một ngày nhất định, lúc nào bác sĩ bắt đầu và kết thúc thời gian nghỉ của họ (nếu có).
Đây có phải là cách tối ưu để làm điều đó?
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
Trả lời
Đây là giải pháp tương đối đơn giản mà bạn có ở đây và trên lý thuyết nó có thể hoạt động, nhưng theo kinh nghiệm của tôi trong một từ thực tế, bạn cần một thứ gì đó linh hoạt hơn. Ngoài ra, bạn không nghĩ về sự dư thừa của dữ liệu.
Điều gì sẽ xảy ra nếu một bác sĩ chỉ làm việc một ngày trong một tuần. Hầu hết các cột sau đó sẽ trống. Hoặc nếu một bác sĩ có thể chỉ làm việc vào buổi sáng? Sau đó, sẽ không có break_start hoặc kết thúc trong bất kỳ trường lịch nào. Ví dụ, nếu bác sĩ làm việc mỗi tuần thứ hai thì sao? Sau đó, bạn sẽ không có một cách dễ dàng làm thế nào để lưu trữ thông tin này. Ngoài ra sẽ có rất nhiều thông tin dư thừa. Nếu bạn có mỗi bác sĩ làm việc từ 8:00 sáng đến 4:00 chiều, bạn sẽ có dữ liệu này được lưu trữ dự phòng ở đó. Cần ít dung lượng hơn nhiều, nếu bạn có thể lưu trữ thông tin như một mối quan hệ với một số loại bản ghi thời lượng.
Nếu tôi là bạn, tôi sẽ tạo ra thiết kế chung hơn, nơi bạn có thể lưu trữ lên đến 365 bản ghi (cho mỗi ngày trong năm), cho mỗi lịch. Sau đó, mỗi ngày sẽ liên quan đến danh sách các khoảng thời gian, sau này có thể là hoạt động bắt buộc. Bằng cách đó, bạn sẽ có thiết kế linh hoạt hơn .
Bản nháp có thể trông giống như sau:
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)
Để đảm bảo tính toàn vẹn của dữ liệu , bạn có thể thêm một ràng buộc duy nhất vào sự kết hợp của cột ngày và lịch trong bảng CalendarDay. Bằng cách đó, mỗi lịch chỉ có thể có một bản ghi cho ngày cụ thể trong bảng CalendarDay.