2017-08-01 26 views
0

我构建了一个调度应用程序,允许用户存储经常性事件。 这是我想出了一个在互联网上阅读很多相关的帖子后(而简化的)数据库设计:存储具有自己数据的经常性事件的模式

表约会:持有约在日历上特定事件的信息,并有一个标志,指示是否是复发;

表RRule:频率(以天计),开始日期,事件持续时间,重复结束日期;

现在,如果约会表中的记录是经常性的,我可以通过克隆对象并简单地更改每个对象的开始日期来构建未来事件。

尽管从规则中构建事件增加了复杂性,但这对我来说已经运行良好了一段时间。

现在,当我需要将其他数据链接到经常性事件时,我遇到了问题,因为它们实际上并不存在于数据库中。例如,我允许用户为他们的每个事件添加一个观察值,由于数据库中不存在经常性事件,并且“观察”列是“约会”表的一部分,所以没有简单的方法为每次重复做单独的观察。

另一个问题:我目前正在实现我的系统的财务控制部分,该部分允许用户为他们的日历上的每个约会创建收据,并且由于经常性事件实际上并不存在于我的数据库中,没有办法将它们链接到它们的收据,这是通过预约表上的外键列完成的。

所以这里是我的问题:在使用众所周知的rrule模式时,如何将特定信息添加到经常性事件?

我知道谷歌日历允许您为每个重复性事件添加特定信息,即使您可以创建一个“永不结束”的日常事件,它实际上在大约2年后结束,这让我感觉像是在复制信息而不是使用规则。

回答

0

你可以有两个表。 EventTemplate & EventInstanceEventTemplate将持有事件再发生的信息。 EventInstance将为每个事件保存一个条目。您可以为每个事件实例在数据库中创建一个条目,并为观察字段(INNER JOIN)保留NULL,或者只保留有观察字段(LEFT JOIN)的用户条目的条目。

因此,无论是哪种情况,都建议使用EventInstance表。但是,存储这些值,您可以决定。我建议你存储NULL并为每个事件实例维护条目。它使得更新事件的方式,以及未来的更新和更清洁的设计。

+0

是的......恐怕我将不得不建立另一个表来存储有关每次重复的特定信息。事情是:因为这些事件实际上并不存在,所以它们没有主键。目前,我基于规则中的rrule id和循环指数构建了一个'虚拟'主键。例如:规则ID 4,第三次出现将具有PK =“4-3”,这是一种真正的痛苦,因为所有其他主键都是整数。 – victor

+0

为什么现在不用主键生成一个表作为“INT标识”并避免使用虚拟主键。这可能是一次性活动。从现在起,你可以利用这张桌子来满足你的需求。 –

相关问题