我想知道有没有
对于以下问题:
我有一个具有某些属性的对象。
{
"name": "Foo",
"colour": "red",
"size": 17,
}
我的对象的属性随着时间的推移而改变/演变。 我只收到通过 API 模拟对象演化的差异更改(或者至少我能够将对对象的任何更新转换为某种补丁)。
{
"start": "2025-01-01",
"patch": {
"path": "/name"
"op": "replace",
"value": "Bar"
}
}
我以任意顺序接收对象的更新。 这意味着更新未排序。 在我收到有效期从 2025 年开始的补丁后,可能需要在之前(例如 2023 年)应用更新,并更改我的对象的过去历史记录(因为我们现在是 2024 年)。
[
{
"start": "2025-01-01",
"patch": {
"path": "/name"
"op": "replace",
"value": "Bar"
}
},
{
"start": "2023-01-01",
"patch": {
"path": "/size"
"op": "replace",
"value": 15
}
}
]
因此,如果我在 2024 年从应用程序中读取对象状态,它应该具有名称
Foo
,但颜色和大小 15
。但如果我使用 keydate >=2025 进行查询,名称应该是 Bar
。
我想在 (Postgre)SQL 数据库中模拟这个问题。
我想通过以下查询来查询我的数据:
我想到的选项是:
两种选择都有优点和缺点。
如果我存储对象的任何状态(A)
➕我可以在任何时间点轻松查询它们
➖ 在收到带有密钥日期的补丁后,我需要重新计算对象的每个状态
如果我在时间开始或结束时存储对象的完整状态 (B)
➖ 我只能查询数据库中的时间开始/结束属性,并且任何 WHERE 都必须在运行时计算对象的状态(在我的应用程序中,而不是在数据库中!)
➕如果收到补丁,我不需要冗余存储数据并更新多条记录
所以,我会尝试使用选项 A,但这并不简单。 我的直觉是,这种问题和解决方案 A 非常通用,必须有一种通用的软件/库来解决它,我不需要重新发明这个轮子。
但是这个问题的名字是什么? 你知道有什么软件包可以解决这个问题吗? (理想情况下是在带有 EF Core 的 .NET 中,但我不限于此)。
有用的资源: