你应该复制数据吗?

Should you ever duplicate data?

这是一个关于数据库设计的非常普遍的问题,涉及具有可能共享数据集的多个 运行 活动的产品。我试图理解为什么我应该和不应该做这样的事情的概念。

我想拥有一组原始数据,然后将其中的一部分复制到活动中,以便活动始终具有历史数据。例如,即使原始数据更新,活动的数据也不会改变。但是,问题是重复太多,我不确定这是否是一个很好的设计。任何见解表示赞赏。

其实,这是一个很好的问题。事务或 OLTP 系统的数据库设计确实寻求消除在多个位置存储相同信息的情况。

也就是说,存储历史值并不违反数据冗余。您实际存储的值与您的正常交易数据不同。

例如,假设您有一个与客户 table 上的特定客户关联的销售区域。当您捕获销售时,您可能希望将区域存储在销售订单 Header table 中。这不一定是数据重复,而是在 Sales Regions 可能发生变化的情况下的良好设计。在这种情况下,您可能希望捕获在下订单时应用于订单的区域。

明天,客户的地区可能会改变。您将能够根据历史上正确的区域创建报告。

这个问题的答案取决于项目的优先级。

如果能够查看历史数据是基本要求,那么就需要这样的复制。将有 table 的子集需要“版本控制”。例如,您可能有一个 product_version table,其中 date_fromdate_to 列指定它何时 is/was 有效。或者您可以更进一步,将版本详细信息放在 abstract_version table 中,其中包含版本详细信息(例如期间和状态)并由所有版本化的 table 通过外键引用。每当创建新版本时,它最初都需要复制旧数据,然后允许对其进行修改。

但这种方法将不可避免地以增加复杂性为代价。对于一些轶事证据,我现在正在从事的项目是一个大大超出原始预算的大型项目 - 尤其是因为维护历史数据所涉及的复杂性。

当您看到数据重复时,您指的是同一行中的数据以及同一行中的其他行 table。如果有实际情况,我们可以有两行具有相同的值,则不能认为是数据重复。至少该行的时间戳会有所不同。在最坏的情况下,如果我们认为在 1 毫秒内,输入了两行并且时间戳可以相同,那么输入的人一定是不同的。简而言之,如果有两行具有相同的值,这实际上是可能的,并且在功能上它必须是正确的,因为会有一些隐藏的值可以使它们不同,如​​活动编号、参与者、时间戳等。

考虑到数据归档策略和持久数据的价值(如果有业务价值/治理需要),必须进行评估。如果没有商业价值,比如用于 DWH、采矿等,建议拥有归档数据库,以便 OLTP 有效地使用数据库。

对您而言,如果历史活动数据为最终用户(如在图表中显示)或管理(以显示任何响应趋势/解释活动中的重复行为)增加价值,它是有用的。否则,我找不到存储在同一个 table 中的理由。