1

这是对我昨天询问的关于存储历史数据的问题(将数据存储在可能会在其主表中更改的侧表中)的更深入的后续,我正在尝试缩小我的问题范围。

如果您有一个表示应用程序级别的数据对象的表,并且出于历史目的需要该表,那么将其设置到无法删除信息的位置被认为是一种不好的做法。基本上我有一个代表工人安全要求的表格,我想制作它,以便永远不会删除或更改这些要求。因此,如果需要进行更改,则会创建新记录。

这不是一个好主意吗?处理此类数据的最佳做法是什么?我有一个包含历史安全培训数据的表,它指向包含需求数据的表(以及其他一些关键表),因此我不能让需求更改,否则历史表将指向错误的信息。

4

2 回答 2

2

这不是一个好主意吗?

你的场景对我来说听起来完全正确。如果您有需要保留的历史数据,则有多种方法可以满足该要求。

选项 1

将所有历史数据和当前数据存储在一个表中(确保存储创建日期,以便了解旧数据和新数据)。当您需要检索某人的最近记录时,只需基于表中存在的最近日期即可。

选项 2

将所有历史数据存储在一个单独的表中,并将当前数据保存在另一个表中。如果您正在处理数百万条记录,这可能是有益的,这样您就不会降低任何基于它构建的应用程序的性能。无论是在创建新记录时,还是通过一些夜间作业,您都可以将旧数据移动到另一个表中,以保持当前表的轻量级。

于 2013-09-13T19:30:16.433 回答
1

这是另一种选择,不一定“更好”,但要牢记...

您可以有单独的“活动”表和“历史”表,然后创建一个触发器,以便每当修改或删除活动表中的行时,旧行值连同时间戳一起复制到历史表中。

这样,应用程序可以自然地使用活动表,同时在历史表中自动生成准确的更改历史记录。而且由于这在 DBMS 级别有效,因此您将更能抵抗应用程序错误。


当然,如果您需要维护整个对象图的历史记录(即通过外键链接的几个表),事情会变得更加混乱。可能最简单的选择是简单地放弃历史表的引用完整性,只保留活动表。

如果这还不足以满足您的项目需求,您将不得不以某种方式表示整个图表在更改时的“快照”。一种方法是将连接也视为版本化对象。或者,您可以只复制每个版本的端点对象的所有连接。任何一种情况都会使您的逻辑大大复杂化。

于 2013-09-13T20:20:03.997 回答