Django-Kalendermodell
Ich baue eine Arzttermin-App mit Django und Django Rest Framework. Die App bietet Sekretären die Möglichkeit, Termine zum Kalender eines Arztes hinzuzufügen, und jeder Arzt kann mehr als eine Klinik (und mehrere Sekretäre) haben.
Ich habe dieses CalendarModell erstellt, um die Verfügbarkeitsinformationen eines Arztes zu speichern, die grundsätzlich Folgendes informieren müssen:
- An einem bestimmten Tag beginnt und beendet der Arzt die Arbeit
- Zu welcher Zeit beginnt und endet der Arzt an einem bestimmten Tag seine Pausenzeit (falls dies der Fall ist).
Ist dies der optimale Weg, dies zu tun?
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
Antworten
Dies ist eine relativ einfache Lösung, die Sie hier haben und die theoretisch funktionieren könnte, aber meiner Erfahrung nach brauchen Sie etwas Flexibleres. Sie denken auch nicht an Redundanz der Daten.
Was ist, wenn ein Arzt zum Beispiel nur einen Tag in der Woche arbeitet? Die meisten Spalten wären dann leer. Oder wenn ein Arzt nur morgens arbeiten kann? Dann würde es in keinem der Kalenderfelder break_start oder end geben. Was ist, wenn der Arzt zum Beispiel jede zweite Woche arbeitet? Dann haben Sie keine einfache Möglichkeit, diese Informationen zu speichern. Es würde auch viele redundante Informationen geben. Wenn jeder Arzt von 8.00 bis 16.00 Uhr arbeitet, werden diese Daten dort redundant gespeichert. Es wird viel weniger Speicherplatz benötigt, wenn Sie solche Informationen als Beziehung zu einer Art Daueraufzeichnung speichern können.
Wenn ich Sie wäre, würde ich ein allgemeineres Design erstellen, in dem Sie bis zu 365 Datensätze (für jeden Tag im Jahr) für jeden Kalender speichern können. Dann würde jeder Tag eine Beziehung zu einer Liste von Intervallen haben, die später von erforderlicher Aktivität sein könnten. Auf diese Weise erhalten Sie ein flexibleres Design.
Der Entwurf könnte ungefähr so aussehen:
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)
Um die Datenintegrität sicherzustellen , können Sie der Kombination von Datums- und Kalenderspalten in der CalendarDay-Tabelle eine eindeutige Einschränkung hinzufügen. Auf diese Weise kann jeder Kalender nur einen Datensatz für ein bestimmtes Datum in der CalendarDay-Tabelle enthalten.