Django Takvim Modeli
Django ve Django Rest Framework ile bir doktor randevu uygulaması oluşturuyorum. Uygulama, sekreterlerin bir Doktor takvimine randevu ekleme işlevine sahip olacak ve her Doktorun birden fazla kliniği (ve birden fazla sekreteri) olabilir.
Bu CalendarModeli, temelde bilgilendirmesi gereken bir doktorun uygunluk bilgilerini saklamak için oluşturdum:
- belirli bir günde doktor hangi saatte işe başlar ve biter
- belirli bir günde, doktorun mola saatini ne zaman başlattığı ve bitirdiği (eğer yaparsa).
Bunu yapmanın en uygun yolu bu mu?
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
Yanıtlar
Bu, burada sahip olduğunuz görece basit bir çözümdür ve teoride işe yarayabilir, ancak benim deneyimime göre gerçek anlamda daha esnek bir şeye ihtiyacınız var. Ayrıca verilerin fazlalığını düşünmüyorsunuz.
Ya örneğin bir doktor haftada sadece bir gün çalışırsa? Sütunların çoğu bu durumda boş olacaktır. Ya da bir doktor sadece sabah çalışabiliyorsa? Bu durumda, takvim alanlarının hiçbirinde break_start veya end olmazdı. Ya örneğin, doktor her iki haftada bir çalışırsa? O zaman bu bilgileri saklamanın kolay bir yolunu bulamayacaksınız. Ayrıca çok fazla gereksiz bilgi olacaktır. Her doktorun 08:00 - 16:00 saatleri arasında çalışmasını sağlayacaksanız, bu veriler orada yedekli olarak saklanacaktır. Bu tür bilgileri bir tür süre kaydıyla ilişkili olarak saklayabiliyorsanız, çok daha az alana ihtiyaç vardır.
Yerinizde olsam, her takvim için 365'e kadar kayıt (yılın her günü için) saklayabileceğiniz daha genel bir tasarım yaratırdım. Daha sonra her gün, daha sonra gerekli etkinlik olabilecek bir aralıklar listesiyle ilişkili olacaktır. Bu şekilde daha esnek bir tasarım elde edersiniz .
Taslak şunun gibi görünebilir:
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)
Veri bütünlüğünü sağlamak için, CalendarDay tablosundaki tarih ve takvim sütunlarının kombinasyonuna benzersiz bir kısıtlama ekleyebilirsiniz. Bu şekilde, her takvimin CalendarDay tablosunda belirli bir tarih için yalnızca bir kaydı olabilir.