读书人

数据仓库缓慢变更维度

发布时间: 2013-01-02 13:08:45 作者: rapoo

数据仓库缓慢变化维度
在网上看到,有些内容:
历史数据保留,新增数据也要保留。这时,要将原数据更新,将新数据插入,我们使用UPDATE / INSERT。比如:某一员工2005年在A部门,2006年时他调到了B部门。那么在统计2005年的数据时就应该将该员工定位到A部门;而在统计2006年数据时就应该定位到B部门,然后再有新的数据插入时,将按照新部门(B部门)进行处理,这样我们的做法是将该维度成员列表加入标识列,将历史的数据标识为“过期”,将目前的数据标识为“当前的”。另一种方法是将该维度打上时间戳,即将历史数据生效的时间段作为它的一个属性,在与原始表匹配生成事实表时将按照时间段进行关联,这种方法的好处是该维度成员生效时间明确。

小弟因第一次接触这些信息,请问上面的表,如何设计啊.哪位高人能给个表的例子啊?
[解决办法]

不懂,帮顶,学习,蹭分.

[解决办法]
该回复于2010-12-06 10:24:08被版主删除
[解决办法]
引用:
不知道是不是这样:
如,我有张订单的事实表,其中有:order_number,order_status等等,在从OLTP中拿数据时,假设,我是原表复制过来的,那我在数据仓库中再增加一列为:insert_time ,它的值就设为当时的:getdate()这样吗?
如果是这样的话,那我的表,会不会增长得过快了?


For the Order fact table, usually in business perspective you don't have to keep the Record update time, since the Order doesn't have the expired or not.

The Slowly changing dimension (SCD) is about Dimension table, not fact. Usually(SCD2) will include: StartDate(or EffectiveDate), EndDate (or ExpiredDate) and ActiveFlag.

[解决办法]
1、对于人员部门变更,我的做法是给人员另外加一个字段,比如version,然后组成联合键进行关联
2、对于订单产品的变化,可以采用作差增补的方法,有的由于时间的原因数据没有补上的话直接update,因为update之前的数据没有任何意义


[解决办法]
缓慢变化的维表:
代理键 生效日期 失效日期 员工ID 员工姓名 所属部门
------------------------------------------------------
1 20010101 20091231 A 张三 营业部
2 20100101 20991231 A 张三 市场部

事实表:
员工代理键 数据所属日期 事实数据
---------------------------------
1 20050101 100.00
2 20100501 220.00

归纳:
1、缓慢变化维可以认为是维度的关键属性发生变化时,根据变化时间将数据进行拆分并独立ID(代理键)化(个人观点描述,大体是这样)
2、维度中必须包含生命周期(有效时间段)和虚拟的ID(代理键),这样才能有效区分数据的变化
3、事实表中用维表ID(代理键)进行外键匹配,保证按照时间统计可区分维度属性的变化
4、事实表尽量包含一个数据所属日期,以保证数据是可逆的,也就是说当事实表损坏的时候可利用数据所属日期重新匹配维表(数据所属日期 between 所属日期)
[解决办法]
引用:
附上订单内容:
order:
ordersn order_status order_add_time order_updateime
102015545 1 2010-9-12 12:30:10

orderdetail
ordersn barcode amount price
102015545 6325141 2 35
假设我今天更新了一订单,并将 am……


不明白你意思,为什么要分成两张表呢?放一起就好啦,作为事实表
ordersn order_status order_add_time order_updateime barcode amount price ……
102015545 1 2010-9-12 12:30:10 6325141 2 35



这样不就行了?上面这个事实表应该还有人员编号如saler_id
在上面的表里面再增加一个字段如saler_version,组成联合键

然后人员维度表这样设计
saler_id saler_version saler_name start_time end_time
1 0 a 2009-9-12 00:00:00 2010-9-12 00:00:00
1 1 a 2010-9-12 00:00:00 2099-12-31 00:00:00
每次变化,新增一条记录,并修改上一条的结束时间
事实表里面的saler_version直接根据add_time between start_time and end_time对应的saler_version,然后可以关联了吧……

至于更新的问题,要看你对于原数据的看法,如果觉得原来的数据没有用了,可以直接替换,修改order_updateime
如果觉得原数据还有参考价值,作增补
原来数据:
102015545 1 2010-9-12 6325141 2 35
增补数据
102015545 1 更新时间 6325141 -1 35
[解决办法]
Slowly changing dimension,渐变维,
参考
http://en.wikipedia.org/wiki/Slowly_changing_dimension

读书人网 >SQL Server

热点推荐