我自己和我们公司的另一个DBA的任务是审查供应商为我们开发的数据库设计。该供应商表示,他们使用Kimball作为其设计的基础。(注意:我不是在寻找Kimball与Inmon等的论点。)他们设计了一个具有多个事实和维度的集市。
公平地说,我们公司从未设计过一个集市。我们一直都有顾问来做。而且我们从未上过课。因此,我们对仓储/超市/维度建模等的了解是基于我们的经验不足,可以在互联网上找到的内容以及自我阅读(我们拥有Inmon和Kimball的书,并正在努力通过它们进行学习) 。
现在已经为我的知识水平奠定了基础,现在我们来应对设计挑战。
有一个称为“索赔损失统计”的事实表(用于保险)。他们正在尝试同时获取索赔的付款(累计到每月水平),然后是准备金中的钱(类似于用于索赔的银行帐户)。他们希望看到每月的付款金额(没什么大不了的)。但是他们希望看到该帐户当前的准备金余额。
我将给出一个图片示例。
假设我们为索赔设置了1000美元的储备金。这被搁置了(因此在某些方面它的功能有点像银行帐户)。
在2014年10月,我们尚未支付任何款项。因此,该公司希望在10月底看到付款和储备金余额。
-----------------------------------------------
- MONTH_YEAR - PAYMENTS - RESERVE_BALANCE -
-----------------------------------------------
- 102014 - 0.00 - 1000.00 -
-----------------------------------------------
然后十一月来了。我们会分别支付$ 100,$ 150和$ 75美元。他们希望看到这些总额,余额中的准备金如下:
-----------------------------------------------
- MONTH_YEAR - PAYMENTS - RESERVE_BALANCE -
-----------------------------------------------
- 102014 - 0.00 - 1000.00 -
-----------------------------------------------
- 112014 - 325.00 - 675.00 -
-----------------------------------------------
然后说我们在12月的付款为零,然后在明年1月又增加了200美元。
-----------------------------------------------
- MONTH_YEAR - PAYMENTS - RESERVE_BALANCE -
-----------------------------------------------
- 102014 - 0.00 - 1000.00 -
-----------------------------------------------
- 112014 - 325.00 - 675.00 -
-----------------------------------------------
- 122014 - 0.00 - 675.00 -
-----------------------------------------------
- 12015 - 200.00 - 475.00 -
-----------------------------------------------
这是我奋斗的地方。我的理解是付款部分是正确的。它们均在每个记录中按月汇总。因此,如果需要年份,季度等,则可以进一步汇总。
但是储备金额不同。这是一个平衡。并且企业希望查看每个月的余额。但是您不能在此字段上进行汇总。如果这样做,您将获得一些奇怪的结果。
不知何故,这让我感到不对。但是我不能如实地说我已经足够建模或足够了解。我只能说的是我所知道的。据我所知,事实中的所有值都应具有相同的粒度。
这两个数字具有“月”的相同粒度,但是它们并不是从它们所代表的角度出发。一个是一个月内的总计美元。另一个只是平衡。
它是否正确?我一直在回推这种设计。我这样做有错吗?可以这样做吗?还是我对不良设计的“代码异味”感觉是准确的?
任何帮助,将不胜感激。注意:请不要只说“应该是X方式”,请解释为什么要这样,以便我可以从中学习。
编辑:恩,我了解到我对事实的最初理解是错误的。粒度不是每月一次。粒度是事务级别。因此,这意味着在MONTH_YEAR(即实际上是财务报告期)内,将有多个付款和回收交易。这些将按日期或交易日期发布。但是由于业务可以查看先前的报告,并且还因为数据是如何存储在旧系统中的,所以他们希望同时放置交易数据(每行一行)和每月储备金(每月一行) )。
得知这一点后,我意识到问题并不仅仅是谷物,而是添加剂,而非添加剂,甚至是半添加剂,这是我从一开始就怀疑的问题。我们的DBA小组与项目小组讨论了此事,并报告说他们正试图在同一事实中放入两种不同的谷物,这是不正确的。他们应该要么将交易发挥作用到每月的水平,然后让他们就可以拥有付款,回收和每月的准备金余额(即半累加事实),因为一切都会按月进行。或者他们需要找到一种将准备金余额分解为交易的方法,以保留交易级别的粮食。或者他们需要将事实分解为两个事实。一个可以是准备金余额的每月水平。另一个可以在付款和回收的交易级别。(他们也没有理由也不能将付款和回收额也放在每月级别的事实中。这仅取决于业务需求。)
根据我所学的知识,我将把托马斯的答案标记为正确的答案。但是,我觉得从原始问题开始的讨论仍然是其他人可以借鉴的好方法,因此,我会将问题的原始部分保留下来。我还打算悬赏尼卡丹的答案,因为它教会了我很多有关加性,非加性和半加性事实的知识,并且纠正了 我对尺寸建模的许多误解。