具有外键的快照表与具有实际值的快照表
Snapshot Tables with Foreign Keys vs. Snapshot Tables with Real Values
在我们客户的一个数据库中,有一些快照表汇总了许多其他表中的有用信息(例如,每个客户在每个时期的状态等)。
然而,快照表主要包含原始表的外键。因此,为了获得有关快照的有用信息,我们必须多次将它们连接到它们对应的表中。这些连接通常需要很长时间。另一方面,将索引添加到数据库中的所有 FL
列(或至少在我们查询的 WHERE
子句中的列)会显着降低数据库速度。
所以我的问题是,使用真实值而不是外键的快照表不是更好吗?如果答案是否定的,如果原始表被更新(例如,如果 an 被称为 'Candle' 而现在 'Lamp' 当然快照保持一致但它是否会破坏快照表的目的在这种情况下真的是快照吗?)
出于您提到的原因,我倾向于存储实际数据而不是 FK 值。也就是说,更好的解决方案可能是重新定位此历史数据以及相关属性(IE 维度)并重组它以供分析。 Data warehousing 当然是一个解决方案,尽管这些项目可能是非常大规模的项目,因此您需要了解其价值并适当地确定其范围。然而,即使是针对他们试图捕获的特定事件的轻量级星型模式也可能是比与基于事务的 table 有关系的大型历史 table 更好的解决方案(尤其是如果针对相关 table 的查询逻辑很复杂)。
在我们客户的一个数据库中,有一些快照表汇总了许多其他表中的有用信息(例如,每个客户在每个时期的状态等)。
然而,快照表主要包含原始表的外键。因此,为了获得有关快照的有用信息,我们必须多次将它们连接到它们对应的表中。这些连接通常需要很长时间。另一方面,将索引添加到数据库中的所有 FL
列(或至少在我们查询的 WHERE
子句中的列)会显着降低数据库速度。
所以我的问题是,使用真实值而不是外键的快照表不是更好吗?如果答案是否定的,如果原始表被更新(例如,如果 an 被称为 'Candle' 而现在 'Lamp' 当然快照保持一致但它是否会破坏快照表的目的在这种情况下真的是快照吗?)
出于您提到的原因,我倾向于存储实际数据而不是 FK 值。也就是说,更好的解决方案可能是重新定位此历史数据以及相关属性(IE 维度)并重组它以供分析。 Data warehousing 当然是一个解决方案,尽管这些项目可能是非常大规模的项目,因此您需要了解其价值并适当地确定其范围。然而,即使是针对他们试图捕获的特定事件的轻量级星型模式也可能是比与基于事务的 table 有关系的大型历史 table 更好的解决方案(尤其是如果针对相关 table 的查询逻辑很复杂)。