2014-12-29 30 views
0

我有一个星型架构仓库(MS SQL Server,通过带有OLAP的MS Report Builder访问),它有很多小维度 - 我的意思是维度是从两列构建的(Id和说明),其中有几百个从事实表中链接起来。星型架构结构 - 对于许多维度

即使没有实际的计数值反对这个返回值(显示nulls),这也提供了将事实中的所有项目都显示出来的选项,但是我不相信这代表了数据以最好的方式 - 我宁愿查看少量的非规格化表,其中描述是事实的一部分,因为这将提供更好的通过SQL与OLAP方法一起查询数据的能力。

这是一个很多的一级维度正常和良好的做法的结构?说实话,我期望显示空白的唯一时间是反对诸如时间或日期维度之类的东西,但是因为这些可以从数据强制转换为图表和表格中的空白,所以它似乎并不重要。

关于这个结构是好还是坏的任何观点 - 我想试着让这个改变,但如果我与最佳实践不协调,我会高兴地改变我的观念。

结构的例子(这只是一个事实表的一部分)

事实表 - (物业)

F_PROPERTY.PROPERTY_ID (Key for table) 
F_PROPERTY.CYCLE_FRAME_TYPE_ID 
F_PROPERTY.CYCLE_GEARS_NUMBER_ID 
F_PROPERTY.CYCLE_GEARS_TYPE_ID 
F_PROPERTY.CYCLE_GENDER_ID 
F_PROPERTY.CYCLE_MUD_GUARDS_ID 
F_PROPERTY.CYCLE_MUD_GUARDS_COLOUR_ID 

维度表 -

D_CYCLE_FRAME_TYPES.CYCLE_FRAME_TYPE_ID 
D_CYCLE_FRAME_TYPES.CYCLE_FRAME_TYPE_DESC 

D_CYCLE_GEAR_TYPES.CYCLE_GEAR_TYPE_ID 
D_CYCLE_GEAR_TYPES.CYCLE_GEAR_TYPE_DESC 

D_CYCLE_GEAR_TYPES.CYCLE_GEARS_NUMBER_ID 
D_CYCLE_GEAR_TYPES.CYCLE_GEARS_NUMBER_DESC 

D_CYCLE_GEAR_TYPES.CYCLE_GENDERS_ID 
D_CYCLE_GEAR_TYPES.CYCLE_GENDERS_DESC 

D_CYCLE_GEAR_TYPES.CYCLE_MUD_GUARDS_ID 
D_CYCLE_GEAR_TYPES.CYCLE_MUD_GUARDS_DESC 

因此改写本 - 应这些维度真的是事实的单独表格,或者它们会更好地描述事实的一部分?我希望报告快速而简单,并且在字段中没有值的情况下最少丢失记录。

+0

你描述的结构根本不清楚。你能否更好地描述你的模型和你面临的问题? – jazzytomato

+0

如果星型模式带回了太多的空值,那么您应该查看雪花模式,将事实表分为更多事实表格,并将其中的一些维度移至细分事实表格。它会给你1)事实表的维数更少。2)也是尺寸表,它真的很重要:) –

+1

几百个维度听起来像是我的维修噩梦。我会寻找合并它们的合理方法。 –

回答

0

不要将说明放在事实表中。事实的目的是衡量事件。维度显示事件的可能属性,即使事件尚未发生。餐厅的菜单是一个维度,客户订购的食品是事实。

看起来您可能需要将尺寸标准化。例如,如果您的自行车齿轮具有类型,编号为&的制造商,则将其设置为具有一个ID和三个描述属性的单循环齿轮尺寸。

您还应该考虑垃圾尺寸。这些由多个不相关的单一属性维度组合而成,实际上使用一个ID。记录的数量是所有可能的列属性的笛卡尔积,但您可以通过消除不切实际的组合来减少某些记录的数量。例如,性别,种族和教育将成为单一垃圾维度的良好候选人。它们是无关的,但几乎没有价值,所以笛卡尔积是合理的。

Star Schema通过过滤较小的唯一维度属性,然后加入事实事件,实现非常高性能的报告查询。混淆你的事实表将会降低整体性能。