我通常用 C# 编写代码,但我认为这个问题可能适用于任何编程语言。
考虑一个包含 2 个表的 SQL 数据库:
Employee
表StatusHistory
表跟踪员工状态的每次变化,以及变化的日期和时间。我希望能够在需要时检索员工的信息(其中包括状态),并偶尔更新。我还想保留状态更改的整个历史记录。
我发现了以下方法来管理员工的状态信息:
将当前状态存储在
Employee
表中,同时在 StatusHistory
表中跟踪状态更改。在这种方法中,每次在历史表中添加新条目时,我们都需要更新Employee
表状态列。
不存储员工的当前状态。因此,每次我们需要检索员工的信息时,我们都必须从
StatusHistory
表中计算状态。
1 和 2 之间的混合是在 Employee 表中存储一个外键,指向该员工的最后一个
StateHistory
条目。
我猜
2
计算量更大,特别是如果历史表非常大,但它避免了在两个表中重复状态信息(最大限度地减少不一致的风险)。
如果我读取状态的时间比写入状态的时间多,那么1
可能会更好,但这意味着我们需要在任何修改时更新两个表(在应用程序代码中或通过触发器)。
我仍然想知道
3
是否比2
有任何优势。
你觉得怎么样,除了我找到的这三种方法之外,还有其他方法吗?考虑以下标准哪个更好:
“偶尔”有点难相处。
如果您计划使用历史表(即查找过去一年从状态 3 切换到状态 5 的员工),我会选择选项 2。也许,如果事实证明查询当前状态太麻烦的话价格昂贵,请应用选项 3。
但是,如果一名员工平均而言状态更改很少,并且仅用于显示目的,那么我会考虑选择选项 1 - 但不要使用单独的历史记录表,只需在 a 中使用 json-doc员工表中的 varchar 字段。最坏的情况是,您可以稍后将历史记录移动到单独的表中 - 否则您将在一个表中获得所有数据。