【问题标题】:Efficiently persisting calendar data with Entity Framework?使用实体框架有效地保存日历数据?
【发布时间】:2011-08-03 02:49:50
【问题描述】:

我正在从事一个涉及管理驾驶教练日历的学校项目。

应用程序存储教师可用的时间段。

public partial class AvailabilityPeriod // kind of pseudo code
{
  Instructor instructor;
  DateTime start;
  DateTime end;
}

它还以类似的方式存储该讲师的个人约会。

例如,当客户说“我想要 2 小时的课程”时,我必须获取所有讲师的可用时段和预约,以计算他们的“实际可用时间”,然后找到超过 2 小时的老师在他/她的日程安排中免费。

有没有更好的办法?

我的问题几乎与Time Calendar Data Structure 完全相同,我知道。但是,嗯......我们在 2011 年,我对实体框架特定的信息感兴趣,或者至少对使用对象关系映射做这件事感兴趣 :-)

【问题讨论】:

    标签: .net entity-framework database-design orm performance


    【解决方案1】:

    我编写了一个类似的调度应用程序,最后我采用了一些不同的方法(尽管你的方法肯定会奏效)。

    在那个系统中,时间表被分解为 15 分钟的增量,称为块,并存储在一个表中。除非他们特别要求休假,否则每个人都随时待命。这些休假请求存储在一个单独的表中,同样以 15 分钟为增量。

    我们有一个 ScheduleBlock 表,它基本上存储了根据业务规则填充的所有潜在块,还有一个 ScheduleException 表,用于存储用户无法工作的块。

    使用这个表结构,很容易创建一个显示所有 ScheduleBlock 实体的 UI(这是所有潜在的可用时间,即营业时间),然后额外绑定所有 ScheduleException 实体(约会、PTO ,病假等)来显示用户无法工作的时间(每个用户的颜色编码)。从那里,系统用户可以选择他们想要安排特定活动的时间段,类似于 MS Outlook 的工作方式。

    当我们进行自动安排时,例如在您的案例中,我们查询在指定日期范围内有 X 块可用块的用户,按他们拥有的约会数量排序,并循环通过他们寻找匹配项。我们按照约会的数量进行排序,以便首先安排时间最多的人。

    希望这会有所帮助!

    【讨论】:

    • 如果我理解正确的话,在给定的 15 分钟间隔内,整​​个数据库中只有一个 ScheduleBlock。那么实际的约会存储在哪里?
    • ScheduleBlock 存储了“营业时间”(系统中的所有时间块),ScheduleException 存储了用户无法“工作”的时间(指向 ScheduleBlock 的外键),我们还有另一个表存储了我们的实际约会(ScheduleAppointment,同样是 ScheduleBlock 的外键)。您可以组合 ScheduleException 和 ScheduleAppointment 表,如果需要,只需使用“约会类型”或其他东西。如果您的业务规则没有改变,您也不能存储 ScheduleBlock 条目。它只是让它更容易。
    • 我的业务规则没有改变 :) 我理解您存储的是不可用时间段而不是可用性。不幸的是,我必须存储它们的可用性,因为它可能会有很大差异,例如。 Alice 周一和周二工作,Bob 周二和周三工作......
    • 这很酷。然后在您的情况下,如果您将所有可用性存储在开始日期/结束日期记录中,并且您正在寻找具有开放 2 小时窗口的任何人,您可以指定“where DateDiff(hh, StartDate, EndDate) >= 2”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多