录音状态转换
Recording status transitions
我们有一个 Rails 应用程序,它有一个 Subscription
模型,其中 status
字段是一个字符串。值为 active
、canceled
、dunning
等
我们不记录 status
从一种状态转换到另一种状态的时间,但我愿意记录。我的挑战是思考如何能够轻松回答问题:
"What subscriptions were active
3 months ago?"
我可以制作一个 table 像 subscription_status_transitions
这样的:
subscription_id
status
transitioned_at
为了回答上面的问题,我似乎必须得到第一个 status
那是 < 有问题的日期(3 个月前)?
有没有更好的方法记录这种事情来轻松回答那个问题?
我可以看到两个替代解决方案:事件溯源和临时 tables
使用事件溯源,您将记录有关状态更改的事件并根据事件列表构建 Subscription
状态。要获得历史状态,您只需查询您感兴趣的时间点之前的事件。跟你描述的差不多。
您还可以使用时间 table 并在订阅状态(或整个订阅)有效时保留时间戳(valid_to
、valid_from
)。您将插入一个新行并在旧行中设置 valid_to
时间戳,而不是更新行。您只需查询具有 valid_from < $date AND valid_to > $date
的订阅。有关 wiki 的更多详细信息 - 这是一个很好的入门。
我们有一个 Rails 应用程序,它有一个 Subscription
模型,其中 status
字段是一个字符串。值为 active
、canceled
、dunning
等
我们不记录 status
从一种状态转换到另一种状态的时间,但我愿意记录。我的挑战是思考如何能够轻松回答问题:
"What subscriptions were active
3 months ago?"
我可以制作一个 table 像 subscription_status_transitions
这样的:
subscription_id
status
transitioned_at
为了回答上面的问题,我似乎必须得到第一个 status
那是 < 有问题的日期(3 个月前)?
有没有更好的方法记录这种事情来轻松回答那个问题?
我可以看到两个替代解决方案:事件溯源和临时 tables
使用事件溯源,您将记录有关状态更改的事件并根据事件列表构建 Subscription
状态。要获得历史状态,您只需查询您感兴趣的时间点之前的事件。跟你描述的差不多。
您还可以使用时间 table 并在订阅状态(或整个订阅)有效时保留时间戳(valid_to
、valid_from
)。您将插入一个新行并在旧行中设置 valid_to
时间戳,而不是更新行。您只需查询具有 valid_from < $date AND valid_to > $date
的订阅。有关 wiki 的更多详细信息 - 这是一个很好的入门。