请联系我们

Project REAL分析服务技术探讨

来源: 数据库 SQL Server |  作者: landluo |  发布: 2009-7-08 10:09


键的唯一性

在维度中,SQL Serveer 2005需要将一个属性标识为键属性。这个键必须是唯一的。当系统处理维度的时候,它会要求你确保这种唯一性。这对于熟悉SQL Server 2000分析服务的管理员而言,是一个巨大的挑战。

SQL Sever 2000分析服务基于层次的特性允许DBA以多种方法表示键的唯一性。整个维度中的成员键都是成唯一的。例如,在一个维度的所有成员中,只有一个成员的键值为#42。或者,唯一性也能设置到一个级别。例如,Subject级别可能带有一个键值为#42的成员,但Item级别可能也有一个键值为#42的成员。或者唯一性也能够被关闭。在这种情况下,可能会有键值为#42的多个成员。仅有的约束是键值相同的两个成员不会是相同的父亲。系统内部实际发生的是,对于一个仅有一个层次的维度,即使你没有指定唯一的键,它也会创建一个唯一的键。

在SQL Server 2005分析服务中,一个维度可以包含多个层次。或者它可以不包含用户定义层次而只包含属性层次。这对于键的唯一性意味着什么呢?由于一个属性在没有其它结构化层次情况下,必须能够标识自己,例如一个平直的属性层次,键值#42意味着什么?最终,它表示这个键值是一个真实的键值。更确切的说,它必须唯一的表示一个属性。

除了键属性的唯一性,系统也考虑了其它属性的唯一性。当然这不是强制性的。如果我们不设置维度,确保属性键的唯一性,会带来预想不到的结果。

最佳实践(必须的):你必须总是确保属性键的唯一性。

首先,我们将想你解释如何为一个属性指定一个唯一的键,然后我们将想你阐述如果你指定错误,将发生什么事情?

假定你正在为你的项目(跟我们的Project REAL类似)创建一个标准的时间维度。作为维度中的一个属性,考虑以下Month列。它包含了从1到12的整数。一般你会设置如下:1 = 一月;

2 = 二月;……12 = 十二月。表面上,这看上去已经满足了唯一性的要求。但是拿2003年1月和2005年的一月比会怎么样呢?实际上,1…12不能作为键。键应该是年份和月份的一个绑定。对于一个关系型专家来讲,这不是一个新的概念。这只是一个主键和链接键。然而,对于一些熟悉SQL Server 2000分析服务的人来数,这是一个新的想法。在SQL Server 2000中,你能够在一个级别上设置唯一性,然后就不在关注它。在SQL Server 2005中,我们需要改掉这种老习惯。

幸好,指定一个唯一键是很容易的。简单的考虑以下属性的键属性。你将发现除了指定一个列,你也能够指定一个列的集合。集合中的每个列都提供了其唯一性(就像你指定链接键一样)。对于Month键,我们需要创建一个Month和Year列组成的集合。如图3所示。

图3:为Month列和Year列指定一个键集合

让我们看看在这些变化前后发生了什么变化。

图4表示表示了当你使用的是没有唯一性约束的Quarter、Month和Week时,Project REAL的Time.Calendar的层次是什么样的。在下面的RDBMS中,键的范围分别是(1…4)、(1…12)、(1…52)。问题在于,在整个维度中,这些键值不是唯一的。例如,你如何区别2001年1月和2002年1月;或者如何区别2003年Q2季度和2004年Q2季度?为了使得键是唯一的,你需要用Year创建一个链接键。因此,Quarter的键应该是(Year,Quarter);Month的键应该是(Year, Month);Week的键应该是(Year, Week)。在这种情况下,我们没有创建链接键。你可以看到如图4所示的结果:年没有季节;在年中错误的季节;以及其它不准确的结果。

图4:设置唯一性之前的时间维度

图5展示了当我们给Quarter、Month和Week键分别加上Calendar_Year_ID链接键后成为键集合的情况。现在的结果是正确的。

图5:设置键唯一性之后的时间维度(通过创建键集合)

共20页: 7 下一页

【内容导航】

原文:Project REAL分析服务技术探讨(7)


* 部分内容来源于网络,版权属原作者所有,转载请注明来源。
打印 | 收藏此页 |  推荐给好友 | 举报