我们有一个 Rails 应用程序,它有一个Subscription
模型,status
字段是一个字符串。值是像active
、canceled
、dunning
等。
我们不会记录status
何时从一种状态过渡到另一种状态,但我想记录。我的挑战是思考如何能够轻松回答这个问题:
"3 个月前active
了哪些订阅?">
我可以用以下方法制作一张像subscription_status_transitions
这样的桌子:
-
subscription_id
-
status
-
transitioned_at
为了回答上面的问题,似乎我必须得到第一个status
,这是<日期(3个月前(?>
有没有更好的方法来记录这种事情来轻松回答这个问题?
我可以看到两种替代解决方案:事件源和临时表
使用事件溯源,您将记录有关状态更改的事件,并根据事件列表构建Subscription
状态。要获取历史状态,您只需查询事件,直到您感兴趣的时间点。它与您描述的非常相似。
您还可以使用时态表并保留订阅雕像(或整个订阅(有效时的时间戳(valid_to
、valid_from
(。您将插入一个新行并在旧行中设置valid_to
时间戳,而不是更新行。您只需查询具有valid_from < $date AND valid_to > $date
的子订阅。维基上的更多详细信息 - 这是一个很好的开端。