对 SQL 数据库中随时间演变的对象和对象更改进行建模

问题描述 投票:0回答:1

我想知道有没有

  1. 至少有一个名字
  2. 和/或通用解决方案

对于以下问题:

我有一个具有某些属性的对象。

{
   "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 数据库中模拟这个问题。

我想通过以下查询来查询我的数据:

  • 在给定关键日期 ID 为 xyz 的对象的状态是什么?
  • 我的哪个对象在特定时间点满足特定 WHERE 子句(例如,关键日期 2024 年大小>10)?

我想到的选项是:

  • A。存储每个对象在每个时间点的状态
  • B。存储对象的一种状态(例如+/-无穷大)AND每个对象的差异补丁及其各自的有效性。

两种选择都有优点和缺点。

如果我存储对象的任何状态(A)

➕我可以在任何时间点轻松查询它们

➖ 在收到带有密钥日期的补丁后,我需要重新计算对象的每个状态

如果我在时间开始或结束时存储对象的完整状态 (B)

➖ 我只能查询数据库中的时间开始/结束属性,并且任何 WHERE 都必须在运行时计算对象的状态(在我的应用程序中,而不是在数据库中!)

➕如果收到补丁,我不需要冗余存储数据并更新多条记录

所以,我会尝试使用选项 A,但这并不简单。 我的直觉是,这种问题和解决方案 A 非常通用,必须有一种通用的软件/库来解决它,我不需要重新发明这个轮子。

但是这个问题的名字是什么? 你知道有什么软件包可以解决这个问题吗? (理想情况下是在带有 EF Core 的 .NET 中,但我不限于此)。

sql database database-design modeling
1个回答
0
投票
为了解决您所描述的问题,通常使用

Event Sourcing + CQRS


有用的资源

© www.soinside.com 2019 - 2024. All rights reserved.