代码改变世界

急! 一个数据仓库设计问题:地区维度

2010-10-30 19:04  崔浩  阅读(1589)  评论(1)    收藏  举报

最近做一个数据仓库项目,遇到地区级别不确定这个问题(是否可以说是 维度层次不确定?),问题详细描述:

                事实表-->案件

                维度表-->地区

        最初设计:

              

        维度表“DIM-地区”数据(数据层次整齐):

                --表1

                说明:街道办事处为镇级

        然而,ETL后发现事实表“FACT-案件”的数据量只有数据源(一个MIS系统的数据库)数据量的一半。这是因为事实表“FACT-案件”中的[事发地代码]只能对应维度表“DIM-地区”中的[乡镇代码],而数据源中的有大量的[事发地代码]存储的是[县/市代码]、[地市代码](那个MIS系统不要求地区必须选择到乡镇一级,可以选择市级、县级。有些案件的确是全市或全县范围的,数据源有这样的数据没有问题)。

        这样,又有了如下设计:

              

        维度表“DIM-地区”数据(数据层次不整齐):

                --表2

                说明:地区代码是维度表的主键,可以是市、县、镇三级的任意一级的代码

        在维度表“DIM-地区”中加入[地区代码]作为主键,这时候[地区代码]可以是乡镇级、县级、市级的对应代码,只是[地区代码]是县级代码时,乡镇级对应字段就为空了,[地区代码]是市级代码时,县级、乡镇级对应字段为空。

        经过以上步骤,ETL后的数据就基本满意了,接下来是多维分析。

        多维分析之后问题又来了:如表2的数据,假设以上数据为全部地区数据,多维分析的描述如下:

                      财产损失

                江苏省                                                 【江苏省总的数据统计正确】

                        南京市                               1495   【看似对了(1080+415),但没有加南京市对应的损失530,实际财产损失应为1495+530】

                                鼓楼区                       329     【鼓楼区对应的损失为86,实际财产损失应为329+86=415】

                                        琵琶街道办事处    329

                                溧水县                        957    【溧水县对应的损失为123,实际财产损失应为957+123=1080】

                                        永阳镇                458

                                        白马镇                499

        有人可能会说这样重复统计了,但需求的情况是:的确有一些案件是以市、县作为地区记录的,这些案件县、镇级地区不记录。

        这就如同一个销售经理A,手下有3个人(B、C、D),同时A自己也做销售,这样每个人都有自己的销售额(a、b、c、d),但是最后总的统计销售经理A的销售额时应该是(a+b+c+d)而不是(b+c+d)。

 

        这样的问题该如何解决呢?

        是重新设计地区维(如何设计)?

        在现在的基础上修改(怎么修改)?