审计表与类型2缓慢变化的维度

Jus*_*ant 6 sql data-modeling dimensional-modeling sql-server-2008 scd

在SQL Server 2008+中,我们希望启用对运营数据库中"客户"表的历史更改的跟踪.

这是一个新表,我们的应用程序控制所有写入数据库,所以我们不需要像触发器这样的邪恶黑客.相反,我们会将更改跟踪构建到业务对象层,但我们需要找出要使用的正确数据库模式.

行数将低于100,000,每条记录的变化数量平均为每年1.5.

我们至少有两种方法可以对此进行建模:

  1. 作为2型渐变维度称为表CustomersHistory,以列EffectiveStartDate,EffectiveEndDate(设置为NULL为客户的当前版本),以及审计列像ChangeReasonChangedByUsername.然后我们构建一个Customers过滤到该表的视图EffectiveEndDate=NULL.我们的应用程序的大多数部分将使用该视图进行查询,并且只有需要具有历史记录功能的部分才会查询基础表.为了提高性能,我们可以实现视图和/或在EffectiveEndDate = NULL上添加过滤索引.

  2. 使用单独的审计表.对Customer记录的每次更改都会一次写入Customer表并再次写入CustomerHistory审计表.

通过快速回顾StackOverflow问题,#2似乎更受欢迎.但这是因为大多数数据库应用程序必须处理遗留和流氓作家吗?

鉴于我们从一个空白的板岩开始,这两种方法的优点和缺点是什么?你会推荐哪个?

has*_*own 3

一般来说,SCD Type-II 的问题是,如果属性值的平均变化次数非常高,您最终会得到一个非常厚的维度表。这种不断增长的维度表与巨大的事实表相结合会逐渐降低查询性能。这就像缓慢中毒......最初你看不到影响。当你意识到的时候,已经晚了!

现在我知道您将使用EffectiveEndDate = NULL和 创建一个单独的物化视图,它将在您的大多数连接中使用。此外,对于您来说,数据量相对较低(100,000)。由于每年平均变化仅为 1.5,我认为数据量/查询性能等在不久的将来不会成为您的问题。

换句话说,您的表确实是一个缓慢变化的维度(而不是快速变化的维度- 您的选项 #2 更适合)。就你而言,我更喜欢选项#1。