Model kalendarza Django
Buduję aplikację do wizyt u lekarza z Django i Django Rest Framework. Aplikacja będzie miała funkcję umożliwiającą sekretarzom dodawanie spotkań do kalendarza lekarza, a każdy lekarz może mieć więcej niż jedną klinikę (i wiele sekretarek).
Zbudowałem ten CalendarModel, aby przechowywać informacje o dostępności lekarza, które zasadniczo muszą informować:
- danego dnia, o której lekarz rozpoczyna i kończy pracę
- danego dnia, o której lekarz zaczyna i kończy przerwę (jeśli tak).
Czy to optymalny sposób, aby to zrobić?
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
Odpowiedzi
Jest to stosunkowo proste rozwiązanie, które masz tutaj i teoretycznie mogłoby zadziałać, ale z mojego doświadczenia w praktyce wynika, że potrzebujesz czegoś bardziej elastycznego. Nie myślisz też o redundancji danych.
A gdyby tak np. Lekarz pracował tylko jeden dzień w tygodniu. Większość kolumn byłaby wtedy pusta. A może lekarz może pracować tylko rano? Wtedy nie byłoby break_start ani end w żadnym z pól kalendarza. A jeśli na przykład lekarz pracuje co drugi tydzień? Wtedy nie będziesz mieć łatwego sposobu przechowywania tych informacji. Byłoby też wiele zbędnych informacji. Jeśli każdy lekarz będzie pracował w godzinach od 8:00 do 16:00, dane te będą przechowywane w nim nadmiarowo. Potrzeba dużo mniej miejsca, jeśli takie informacje można przechowywać jako relację do jakiegoś rekordu czasu trwania.
Na twoim miejscu stworzyłbym bardziej ogólny projekt, w którym możesz przechowywać do 365 rekordów (na każdy dzień w roku) dla każdego kalendarza. Wtedy każdy dzień byłby powiązany z listą interwałów, które później mogą być wymaganą czynnością. W ten sposób uzyskasz bardziej elastyczny projekt.
Szkic mógłby wyglądać mniej więcej tak:
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)
Aby zapewnić integralność danych , można dodać unikalne ograniczenie dotyczące kombinacji kolumn daty i kalendarza w tabeli CalendarDay. W ten sposób każdy kalendarz może mieć tylko jeden rekord dla określonej daty w tabeli CalendarDay.