1

模型

在我的应用程序的当前模型中,事件可以以几个不可组合的频率发生,其值枚举如下:ONCE、DAILY、WEEKLY、MONTHLY、YEARLY,并且(即事件发生)从某个日期开始,并且可选地在稍后结束(当它们没有结束时,它们的值为 NULL)。

例如,一个事件:

  • 每年和每周发生
  • 在这两种情况下都是在n周前开始的
  • 并且其结束日期为空

有:

  • 现在每周发生一次
  • 在 (52 - n%52) 周内每年发生一次

用法

这些数据可以通过后台非常频繁地更新。在我们的公共页面上需要它来显示所有事件发生的 3 天时间表,按 1 小时时段收集。

时间表的默认开始时间是今天的午夜。时间表开始时间可以下降到当前日期之前的 1 个月和之后的 2 个月。

我需要的

所有事件数据都通过后台插入,没有任何问题。当我需要以时间表的方式组织它们时,棘手的部分就来了。我尝试了一种粗暴的方法(选择所有事件,并自己复制事件),但我有点失败(这引发了每当数据发生变化时更新复制事件的大缓存的问题!)。

我真正想要的这个漂亮的模型(愚蠢的我:我没有同时考虑写入和读取查询)是在开始日期和结束日期之间发生所有事件,按 1 小时时段组织。

你有什么建议?

  1. 非规范化我的模型并找到一个自动将我的“主”模型同步到重新组织的模型的工具?那么,我如何首先对其进行非规范化呢?我如何同步它?
  2. 找到一个 JPQL(或 HQL,或原始 SQL)查询,该查询可以在提供的时间间隔内获取所有复制的事件发生(+ 可能进行一些后处理以按 1 小时时隙对它们进行索引)?如果你能提供给我,我会非常高兴:-)
  3. 别的东西?

顺便说一句,模型是开放的,因此可以更改它以更好地解决问题。一切都可以在这里讨论。

此致,

罗尔夫

PS:当前(有趣的部分)模型看起来像:

mysql> describe occurrences;
+----------------+-------------+------+-----+---------+----------------+
| Field          | Type        | Null | Key | Default | Extra          |
+----------------+-------------+------+-----+---------+----------------+
| id             | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| start_date     | datetime    | NO   |     | NULL    |                |
| end_date       | datetime    | YES  |     | NULL    |                |
| frequency_type | varchar(50) | NO   | MUL | NULL    |                |
| event_id       | bigint(20)  | NO   | MUL | NULL    |                |
+----------------+-------------+------+-----+---------+----------------+

mysql> describe frequency_types;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| value | varchar(50) | NO   | PRI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4

1 回答 1

1

您可以查询开始在请求的结束之前且结束为空或在请求的开始之后发生的所有事件,然后从结果集中复制/计算所有事件。

于 2013-01-13T11:15:26.727 回答