重复事件考勤数据库设计

时间:2019-11-21 04:36:54

标签: sql postgresql database-design

我正在尝试建立一种管理事件和事件出勤的方法。

我有一个events表,该表具有以下相关字段:

id BIGINT NOT NULL UNIQUE
starts_at TIMESTAMPTZ NOT NULL
ends_at TIMESTAMPTZ
recurrence_days INT
recurrence_months INT
PRIMARY KEY(id)

有了这个,我就能得到“今天”或任意日期发生的单次或重复发生的事件。

不幸的是,我正在努力应对活动出席率。我有一个events_attendance表,其中有event_id(来自id表的events)和user_id,但是我不确定如何处理重复事件

有没有一种设计方法,这样我就不需要“复制”事件了?

1 个答案:

答案 0 :(得分:2)

您不应该避免避免记录重复事件的实例。那就是数据库的用途。

您需要一个recurringevent表,每个表具有一个包含重复规则的每个重复事件记录。一个非常简单的方法如下:

id
event_name
start_date
end_date
DaysBetween
RecordCreateDateTime
RecordCreatedBy

请注意,根据日历对重复事件进行建模非常复杂……每周一次,每月一次,每月第二个星期二。

您需要另一个记录该重复事件的“实例”的表,例如events。它具有每个实际事件的记录,并带有对recurringevent的引用。创建,编辑,删除父recurringevent记录会自动生成这些记录。

此表中的记录可能是也可能不是由重复事件生成的。您可能只发生了一次事件,在这种情况下,您只有一个events条记录,而没有父级recurringevent

id
recurringevent_id   (null if this is a once off)
date
event_name
RecordCreateDateTime
RecordCreatedBy

然后,您需要一个eventattendance表,每个参会人员一行,这将返回到events

id
event_id
user_id
event_feedback
RecordCreateDateTime
RecordCreatedBy    

现在,您的events表正试图成为两件事。它只能代表一个实际的“事件”,而不能保存重复发生的信息。