你应该复制数据吗?

时间:2017-04-01 05:30:36

标签: database-design database-schema

这是关于具有多个可能共享数据集的正在运行的广告系列的产品的数据库设计的一般性问题。我试图理解为什么我应该做的事情,不应该做这样的事情。

我在考虑拥有一组原始数据,然后将该部分内容复制到广告系列中,以便广告系列始终拥有历史数据。例如,即使原始数据更新,广告系列的数据也不会更改。然而,问题是存在如此多的重复,我不确定这是否是一个非常好的设计。任何洞察力都赞赏。

3 个答案:

答案 0 :(得分:5)

实际上,这是一个很好的问题。事务或OLTP系统的数据库设计确实试图消除在多个地方存储相同的信息。

也就是说,存储历史值不会违反数据冗余。实际上,您存储的值与正常的事务数据不同。

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

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

答案 1 :(得分:1)

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

如果能够查看历史数据是必不可少的要求,则需要进行此类复制。将有一个表的子集需要"版本化#34;。例如,您可能有一个product_version表,其中date_fromdate_to列指定何时有效。或者您可以更进一步,将版本详细信息放在abstract_version表中,该表保存版本详细信息(例如,期间和状态),所有版本化表通过外键引用。无论何时创建新版本,它最初都需要获取旧数据的副本,然后允许对其进行修改。

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

答案 2 :(得分:1)

当您看到数据重复时,您会引用同一行中具有其他行的行中的数据。如果在实际情况下我们可以有两行具有相同的值,则不能将其视为数据重复。该行的至少时间戳将是不同的。在最坏的情况下,如果我们认为在一个mSec中输入两行并且时间戳可以相同,那么输入的人必须是不同的。简而言之,如果有两行具有相同的值,则实际上可能并且在功能上它必须是正确的,因为会有一些隐藏的值可以使它们不同,如​​广告系列号,参与者,时间戳等。

必须评估数据存档策略和持久数据的价值(如果存在业务价值/治理需求)。如果没有像DWH,Mining等那样使用它的业务价值,建议使用归档数据库,以便OLTP有效地使用DB。

对于您来说,如果历史广告系列数据为最终用户增加价值(如在图表中显示)或管理(显示任何响应趋势/解释广告系列中的重复行为),那么它很有用。否则,我没有找到存储在同一个表中的理由。