【问题标题】:How to best handle exception to repeating calendar events如何最好地处理重复日历事件的异常
【发布时间】:2011-01-29 17:31:27
【问题描述】:

我正在开展一个需要我实施日历的项目。我正在尝试提出一个非常灵活的系统:可以处理重复事件、重复异常等。我查看了 iCal、Lotus Notes 和 Mozilla 等应用程序的架构,以了解如何着手实施这样的系统。目前,我无法确定处理重复事件异常的最佳方法是什么。我已经使用了很多数据库,但是在真正优化所有内容方面没有大量经验,所以我不确定我正在考虑的两种方法中的哪种方法在整体性能和查询/搜索能力方面是最佳的:

  1. 中断重复事件。因此,为重复事件更改当前行的结束日期,插入一个新行(例外),然后添加另一行继续旧序列。
  2. 只需添加一个异常。因此,添加一个带有一些字段的新行,将其指示为覆盖。

所以这就是我无法决定的原因。方法一将导致更多的行,因为每次编辑需要 2 额外的行,而第二种方法仅与一行相对。另一方面,我认为查找事件的查询会简单得多,因此使用第一种方法可能更快(?)。第二种方法似乎需要在应用程序服务器上进行更多计算,因为一旦获得数据,就必须删除两行的交集。我知道数据库通常是网站的瓶颈,虽然我相信你们中的很多人都认为这两者都很好,因为你的项目可能永远不会变得足够大,以至于效率差异真的很重要,但我仍然想实施最佳解决方案。那么你们会选择什么方法,还是会做一些完全不同的事情呢?

另外,作为旁注,我将使用 MySQL 和 PHP。如果有其他您认为更适合此的技术,尤其是在数据库领域,请提及。

感谢您的建议。

【问题讨论】:

    标签: php mysql database-design calendar performance


    【解决方案1】:

    活动不是永久性的,可能会更改或终止。

    您应该为事件中的每个日期插入一行,并在编辑重复事件时,选择编辑事件的所有实例或仅编辑一个。

    执行此操作时,您实际上应该只需要一个额外的字段来指示事件是否处于活动状态。

    如果索引正确,这不会对您的查询产生很大影响。

    一个例子是:

    SELECT * FROM events WHERE event_id = 123 AND active = 1;
    

    在这种情况下,您需要索引 event_id 和活动列。

    【讨论】:

    • 活跃到底是什么意思?因为假设您有一个重复事件,但您不希望它在某一天重复。保存事件应如何重复的数据的行仍然处于活动状态,添加的异常也将处于活动状态。简而言之,数据库中的每一行都将处于活动状态......如果没有必要,它将被删除。
    • 活动表示该事件将在该日期发生(没有取消,重新安排,没有重复的例外)。如果您有一个事件在每个星期六“触发”,但不是在 2010 年 6 月 19 日,您将为该事件“触发”的每一天插入行并将该日期标记为非活动日期。它不应该被删除,因为某些事情可能会发生变化,并且您希望该事件也在该日期触发,而不是添加新事件,您只需编辑现有事件并启用该日期即可。
    • 我现在明白了。我不打算为该事件应该触发的每一天创建一个条目,而是为我的代码可以轻松枚举并计算出日期的单行。例如,假设您有一个永远重复的事件......您不能向您的数据库添加无限数量的行。我明白你现在的意思了。感谢您的澄清。
    • 您可以询问用户事件会重复多久。即使它在接下来的 100 年内每天重复并且用户添加了 200 个事件,我怀疑你会遇到问题,它只有大约 700 万行:)
    【解决方案2】:

    我决定只输入包含异常的行并使用代码将它们从重复集中删除。我还需要一段时间才能完成它,但我会尽量记住在完成后将一些性能结果发回此处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2010-10-01
      • 2011-08-03
      • 1970-01-01
      • 2011-02-01
      • 2011-01-07
      相关资源
      最近更新 更多