录音状态转换

Recording status transitions

我们有一个 Rails 应用程序,它有一个 Subscription 模型,其中 status 字段是一个字符串。值为 activecanceleddunning

我们不记录 status 从一种状态转换到另一种状态的时间,但我愿意记录。我的挑战是思考如何能够轻松回答问题:

"What subscriptions were active 3 months ago?"

我可以制作一个 table 像 subscription_status_transitions 这样的:

为了回答上面的问题,我似乎必须得到第一个 status 那是 < 有问题的日期(3 个月前)?

有没有更好的方法记录这种事情来轻松回答那个问题?

我可以看到两个替代解决方案:事件溯源和临时 tables

使用事件溯源,您将记录有关状态更改的事件并根据事件列表构建 Subscription 状态。要获得历史状态,您只需查询您感兴趣的时间点之前的事件。跟你描述的差不多。

您还可以使用时间 table 并在订阅状态(或整个订阅)有效时保留时间戳(valid_tovalid_from)。您将插入一个新行并在旧行中设置 valid_to 时间戳,而不是更新行。您只需查询具有 valid_from < $date AND valid_to > $date 的订阅。有关 wiki 的更多详细信息 - 这是一个很好的入门。