保留当前状态还是从 SQL 数据库的历史记录中检索它?

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

我通常用 C# 编写代码,但我认为这个问题可能适用于任何编程语言。

考虑一个包含 2 个表的 SQL 数据库:

  • 包含员工数据(姓名、出生日期等)的
    Employee
  • StatusHistory
    表跟踪员工状态的每次变化,以及变化的日期和时间。

我希望能够在需要时检索员工的信息(其中包括状态),并偶尔更新。我还想保留状态更改的整个历史记录。

我发现了以下方法来管理员工的状态信息:

  1. 将当前状态存储在

    Employee
    表中,同时在
    StatusHistory
    表中跟踪状态更改。在这种方法中,每次在历史表中添加新条目时,我们都需要更新
    Employee
    表状态列。

  2. 不存储员工的当前状态。因此,每次我们需要检索员工的信息时,我们都必须从

    StatusHistory
    表中计算状态。

  3. 1 和 2 之间的混合是在 Employee 表中存储一个外键,指向该员工的最后一个

    StateHistory
    条目。

我猜

2
计算量更大,特别是如果历史表非常大,但它避免了在两个表中重复状态信息(最大限度地减少不一致的风险)。

如果我读取状态的时间比写入状态的时间多,那么

1
可能会更好,但这意味着我们需要在任何修改时更新两个表(在应用程序代码中或通过触发器)。

我仍然想知道

3
是否比
2
有任何优势。

你觉得怎么样,除了我找到的这三种方法之外,还有其他方法吗?考虑以下标准哪个更好:

  • 易于使用,简单
  • 稳健性、容错性(在应用程序崩溃或数据库故障的情况下)
  • 性能
sql-server database-design event-sourcing
1个回答
0
投票

“偶尔”有点难相处。

如果您计划使用历史表(即查找过去一年从状态 3 切换到状态 5 的员工),我会选择选项 2。也许,如果事实证明查询当前状态太麻烦的话价格昂贵,请应用选项 3。

但是,如果一名员工平均而言状态更改很少,并且仅用于显示目的,那么我会考虑选择选项 1 - 但不要使用单独的历史记录表,只需在 a 中使用 json-doc员工表中的 varchar 字段。最坏的情况是,您可以稍后将历史记录移动到单独的表中 - 否则您将在一个表中获得所有数据。

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