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