【问题标题】:Recurring events attendance database design经常性事件出勤数据库设计
【发布时间】:2019-11-21 04:36:54
【问题描述】:

我正在尝试建立一种管理活动和活动出席的方法。

我有一个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_idid 来自events 表)和user_id,但我不确定如何处理重复发生的事件。

有没有办法设计这样我就不需要“复制”事件?

【问题讨论】:

  • 您的events 表中没有event_id,那么events_attendance 表中的event_id 指的是什么?我猜你是在捕捉个别与会者而不是计数?
  • events_attendance 有一个 event_id,即 events.id
  • 更新了问题。谢谢!
  • 如果 events_attendance 正在跟踪出勤率,为什么不根据日期和时间戳跟踪实际出勤率呢?您可以根据日期、月份、时间等分组定义和跟踪再次发生。但根据用户和日期时间戳,记录本身始终是唯一的。
  • 关于重复事件,您需要另一个模拟重复事件的表。鉴于您必须涵盖有关日历的规则,因此定期安排可能很困难。当您由此生成 event 记录时,您包含对 recurringevent 表的引用。

标签: sql postgresql database-design


【解决方案1】:

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

您需要一个 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 表正试图成为两件事。它应该只代表一个实际的“事件”,不应该包含重复信息。

【讨论】:

    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 2015-08-16
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2020-06-28
    相关资源
    最近更新 更多