回答
这听起来像 “复发事件”,如在Outlook中。我会使用一个名为RecurrenceType的表来存储每个时间段(每天,每周等)。另一个名为Event woud的表通过RecurrenceType的键引用。然后可以使用标准日期函数计算大多数重复类型的未来日期。
有复杂的解决方案和简单的解决方案。最简单的两个解决方案:
扇出重复事件多达某个常数许多情况下,或最多在未来的某个固定日期范围。存储FK recurrence_id,每个实例指向重复的描述,并允许批量编辑和取消。
预定义扇出方法的优点是它可以非常容易地执行重复异常,这几乎肯定会成为您获得的第一个功能请求。
在显示时间计算。计算机速度很快,取决于您希望能够回答您的数据的问题,计算日期范围内的所有事件通常会非常容易。在进行重复计算之前,您可以很聪明并尝试快速将日期范围括起来,或者可以从发病日期开始蛮力。
除此之外,您只需要一个解决方案来存储重复规则,该规则适用于计算重复出现的任何内容。 (例如,如果您使用的是iCalendar启用库,则您的模式为varchar(255),其中包含RRULE值)
如果您不得不推出自己的重复计算器,并且希望保持简单,您每天,每周,每月或每年的重现率覆盖您的第一个80%用例,并且非常容易计算。
此时你的潜在复发的架构看起来像:
id
recurrence_start
recurrence_end
type (daily|weekly|monthly|yearly)
day_of_week (for weekly)
month
day_of_month
而与此同时,复杂的解决方案可能是不值得的:)
的问题是,有指定这样的无限可能间隔。例如 - “每隔一个月的第一个星期一,如果日期是偶数,但不是4,并且这个月不是漫长的一年的二月”。你愿意走多远?最终你只需要让用户键入一个布尔表达式,在事件重新发生的日子里,这个布尔表达式的值为TRUE。从用户界面角度看,这不太好。
您应该为您的系统决定一些限制。一旦你知道了这些,其余的应该很容易 - 或者至少在SO上负责。 :)
Martin Fowler对此写了a really great paper。您可以在runt中找到许多与他讨论的相同的想法,这是一个用于处理时态表达式的Ruby库。
Fowler的论文清晰易读,但它并不涉及规则的例外情况,IMO是这种设计模式中的一个棘手问题...... – 2009-05-20 11:31:38
这里所描述的架构捕捉重复日期
它提到的a related, useful SO thread,但如果你碰巧使用Ruby是ice_cube一个很好的,积极维护替代小个子。你没有提到你的存储后端需求是什么,但对于数据库模式,@ kellan和上述线程中的一些是好的开始。
- 1. 如何处理经常性时间?
- 2. 如何在SQL中存储可用性信息,包括经常性项目
- 3. 如何描述经常性不完整的时间间隔?
- 4. 经常性付款的远程信用卡存储(可能是PayPal)
- 5. 您将如何储存大量的JSON
- 6. 经常性功能
- 7. 如何在数据库中存储每周时间可用性?
- 8. 如何将Mysql存储为时间?
- 9. 您可以在StorageItemAccessList中存储文件多长时间?
- 10. 是否有可能将行按照时间戳存储一天?
- 11. 如何存储时间表?
- 12. 时间如何存储它
- 13. 如何存储时间HH:MM:SS
- 14. 锁定性能:锁定更长时间与锁定更经常
- 15. openwrt存储时间在哪里?它如何存储时间?
- 16. 存储帐户之间的Azure性能
- 17. 存储性能
- 18. Android:数据存储的可能性
- 19. 什么gettable,可设定和存储性能之间的关系,计算性能
- 20. Git如何检测您从中拉出的正常存储库?
- 21. 长时间运行的存储过程对性能的影响
- 22. 您可以通过另一个dojo.data存储的属性创建dojo.data存储吗?
- 23. File.Copy()性能如果文件可能已经存在
- 24. 如何将本地时间的日期时间存储为可以用hibernate明确检索的时间?
- 25. 如何在rails中存储可能的属性
- 26. 在MongoDB中存储日期时间对性能的影响
- 27. 如何检查您的存储数据?
- 28. 如何存储时间protobuf的3
- 29. 如何安全地存储经常更新的值?
- 30. 如何测试经常性神经网络的准确性
嘿kellan,您将如何使用您提供的重复模式来实现事件的范围(开始和结束日期)?有任何想法吗?我在设计这样的东西时遇到了很多麻烦。谢谢! – Tom 2014-08-12 03:42:17