什么是昏暗,什么是事实?

时间:2010-07-06 19:25:03

标签: data-warehouse dimensions

我有一个应用程序,我知道它会成为一个很棒的多维数据集,并且比标准的平面Reporting Services报告更有用。我们准备和顾问一起跳进商务智能的东西,但是我想在我们做之前试一试,主要是因为我知道我们要做的事情。

该应用程序跟踪全国养老院的调查。它们可以是年度,投诉或其他几种类型的调查,它们会对所提供的标签进行处罚,并提供与之相关的文档。

我想做的是提出一种方法,让我们能够利用我们拥有的数据 - 六月份佛罗里达州的标签数量是多少?有多少设施按时交付文件?与去年相比,今年第一季度发生了多少次年度(意外)调查?

我包含了这些模式,希望有人能够告诉我不仅是什么是暗淡的,什么是事实,而是什么数据在哪里。我认为这将是一个很好的开始。

任何事都会有所帮助。我正在尝试通过Kimball的数据仓库生命周期工具包来设置一个小型数据集市。

谢谢! 米@

实体表 - 我们所有设施的清单:主键是表示建筑物的五个字母代码

CREATE TABLE [dbo].[Entity](
 [entID] [varchar](10) NOT NULL,
 [entShortName] [varchar](150) NULL,
 [entNumericID] [int] NOT NULL,
 [orgID] [int] NOT NULL,
 [regionID] [int] NOT NULL,
 [portID] [int] NOT NULL,
 [busTypeID] [int] NOT NULL,
 [adpID] [varchar](50) NULL,
 [eHealthDataID] [varchar](50) NULL,
 [updateDate] [datetime] NULL CONSTRAINT [DF_Entity_updateDate]  DEFAULT (getdate()),
 [powProID] [int] NULL,
 [regionReportingID] [int] NULL,
 [regionPresEmail] [varchar](300) NULL,
 [regionClinDirEmail] [varchar](300) NULL,
 CONSTRAINT [PK_EntityNEW] PRIMARY KEY CLUSTERED 
(
 [entID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 75) ON [PRIMARY]
) ON [PRIMARY]

调查主要

CREATE TABLE [dbo].[surveyMain](
 [surveyID] [int] IDENTITY(1,1) NOT NULL,
 [surveyDateFac]  AS (([facility]+'-')+CONVERT([varchar],[surveyDate],(101))),
 [surveyDate] [datetime] NOT NULL,
 [surveyType] [int] NOT NULL,
 [surveyBy] [int] NULL,
 [facility] [varchar](10) NOT NULL,
 [originalSurvey] [int] NULL,
 [exitDate] [datetime] NULL,
 [dpnaDate]  AS (dateadd(month,(3),[exitDate])),
 [clearedTags] [varchar](1) NULL,
 [substantiated] [varchar](1) NULL,
 [firstRevisit] [int] NULL,
 [secondRevisit] [int] NULL,
 [thirdRevisit] [int] NULL,
 [fourthRevisit] [int] NULL,
 [updated] [datetime] NULL CONSTRAINT [DF_surveyMain_updated]  DEFAULT (getdate()),
 CONSTRAINT [PK_tagSurvey] PRIMARY KEY CLUSTERED 
(
 [surveyID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

调查类型:

CREATE TABLE [dbo].[surveyTypes](
 [surveyTypeID] [int] IDENTITY(1,1) NOT NULL,
 [surveyTypeDesc] [varchar](100) NOT NULL,
 CONSTRAINT [PK_surveyTypes] PRIMARY KEY CLUSTERED 
(
 [surveyTypeID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

调查档案

CREATE TABLE [dbo].[surveyFiles](
 [surveyFileID] [int] IDENTITY(1,1) NOT NULL,
 [surveyID] [int] NOT NULL,
 [surveyFilesTypeID] [int] NOT NULL,
 [documentDate] [datetime] NOT NULL,
 [responseDate] [datetime] NULL,
 [receiptDate] [datetime] NULL,
 [dateCertain] [datetime] NULL,
 [fileName] [varchar](250) NULL,
 [fileUpload] [image] NULL,
 [fileDesc] [varchar](100) NULL,
 [updated] [datetime] NOT NULL CONSTRAINT [DF_surveyFiles_updated]  DEFAULT (getdate()),
 CONSTRAINT [PK_surveyFiles] PRIMARY KEY CLUSTERED 
(
 [surveyFileID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 75) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

调查罚款

CREATE TABLE [dbo].[surveyFines](
 [surveyFinesID] [int] IDENTITY(1,1) NOT NULL,
 [surveyID] [int] NULL,
 [surveyFinesTypeID] [int] NULL,
 [dateRecommended] [datetime] NULL,
 [dateImposed] [datetime] NULL,
 [totalFineAmt] [varchar](100) NULL,
 [wasImposed] [varchar](3) NULL,
 [dateCleared] [datetime] NULL,
 [comments] [varchar](500) NULL,
 [updated] [datetime] NOT NULL CONSTRAINT [DF_surveyFines_updated]  DEFAULT (getdate()),
 CONSTRAINT [PK_surveyFines] PRIMARY KEY CLUSTERED 
(
 [surveyFinesID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 75) ON [PRIMARY]
) ON [PRIMARY]

调查标签

CREATE TABLE [dbo].[surveyTags](
 [seq] [int] IDENTITY(1,1) NOT NULL,
 [surveyID] [int] NOT NULL,
 [tagDescID] [int] NOT NULL,
 [tagStatus] [int] NULL,
 [scopesev] [varchar](5) NOT NULL,
 [comments] [varchar](1000) NULL,
 [clearedDate] [datetime] NULL,
 [updated] [datetime] NULL CONSTRAINT [DF_surveyTags_updated]  DEFAULT (getdate()),
 CONSTRAINT [PK_tagMain] PRIMARY KEY CLUSTERED 
(
 [seq] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

4 个答案:

答案 0 :(得分:6)

  

我想做的是提出一种方法,让我们可以利用我们拥有的数据 - 佛罗里达州6月份的标签数量是多少?有多少设施按时交付文件?与去年相比,今年第一季度发生了多少次年度(意外)调查?

尺寸是测量范围。测量范围可以是连续的,如日期,也可以是离散的,如设施。在您的问题中,维度分别是设施和日期,日期/时间和日期。

唯一可以回答“佛罗里达州六月份有多少标签?”的问题。是将标签与设施和标签与日期相关联。

唯一可以回答“有多少设施准时交付文件?”的方法。是将文件交付与设施到期的设施和日期相关联。

您应该使用您期望数据仓库回答的其他问题或查询来执行相同的分析过程。

事实是一个实体或一个对象。标签是一个事实。文档传递是一个事实。一旦数据仓库加载,事实几乎总是不可变的。

至于您的架构,我必须更多地研究它以提供具体的建议,但一般来说,您希望使用 star schema 。恒星的中心是你的事实,实体和物体。构成星形点的表格是维度表。

您需要做的第一件事就是将事实和维度分开。您的实体表都不应包含日期,位置代码或您确定的任何其他维度。但是,事实表将包含日期表,位置表或其他维表的外键。

您可能还需要汇总表。汇总表包含与事实表相同的列,并在不同维度上添加一个或多个总和。例如,问题是“佛罗里达州六月份的标签数量是多少?”如果您已经拥有佛罗里达州(或者更确切地说,佛罗里达州的每个设施)2010年6月(或每天)的标签总和,可以更快地回答。

您总结的时间取决于您期望的混合查询。在您的数据仓库中,日期可能太短。换句话说,在SQL中进行摘要和选择摘要行一样快。

您还需要 calendar table 。日历表提出的问题是,“今年第一季度与去年(第一季度)相比发生了多少年(惊喜)调查?”更容易查询。

答案 1 :(得分:1)

看起来每个调查都有多个罚款,文件和标签。

我希望有4个事实表 - 每个事实看起来都像是日期时间数据(虽然这些数据通常被建模为日期和/或时间维度的角色 - 我在这里做了几个笔记,但是标记通常会在尺寸上):

SurveyMain

SurveyFine(wasImposed是与此事实相关的维度,totalFineAmt是此表中的事实)

SurveyFile

SurveyTag

他们都会分享一个调查维度,我会继续分享每个维度中的实体/设施维度。你可以在Survey维度上雪花,但这会击败星型模型的最有利点,允许你直接获取所有数据而不是通过桥接表。

您可以选择将调查类型放入其自己的维度(或者可能是垃圾维度),或者通过调查维度(而不是通过雪花)访问调查类型。这是典型的维度建模 - 你不需要跟随你的实体 - 你只需要避免太多的维度和太少的维度陷阱并观察你的维度的基数 - 特别是如果你不小心包括一些退化的维度,如发票编号随着每个事实而变化,因此需要存储在事实表中。

实际上,通过在3NF中进行典型连接来创建典型的平面报告视图,然后简单地将这些平面行转换为星形,有时可以更轻松地创建星形模型。 (这就是实体关系模型与维度模型的真实关系)。因此,您可以将SurveyMain与SurveyTypes和SurveyFine一起加入当前的规范化密钥,并查看所有列。这将是SurveyFine事实表的基础。我确定的其他事实表同样如此。共享内容将成为共享维度的候选者。实体是一个适合维度的良好候选者(即它将在​​这些调查模型和与您的企业相关的其他模型之间共享 - 如HR模型或会计模型)。

答案 2 :(得分:1)

我会设置SurveyFines,SurveyTag和SurveyFiles事实表,它们都是不同的事实,它们都代表了最低的颗粒。

他们都会有日期,实体和调查维度。

然后,我会为那些可能需要合并所有三个事实的指标设置预先聚合的指标表。

如果您希望我详细说明,请随时提出。我今天有点匆忙。

(继续...) 在我看来,您的用户想要转动可测量数据(文件数量,发送日期文件,罚款总和)。他们希望通过调查的属性来查看这些指标。这就是为什么我建议调查维度。

考虑下面的评论,我可能会构建一个预聚合指标表

日期(我加载指标表的日期) SurveyDimID EntityDimID NumTagsAssigned NumFilesRequested NumFilesReceived NumFines TotalFines 等...

我会每天使用事实表中的全套活动调查数据加载此表。这允许用户在历史记录中来回查看调查的进展情况。

我认为在某些时候整个调查过程已经完成,此时这些记录不会包含在度量标准负载中。 (他们会留在事实中)。

答案 3 :(得分:1)

这对于支持论坛来说是一项相当重要的任务,因此我将只关注问题的一部分。 似乎一次调查可以包含几次访问,因此我建议 factSurveyVisit 进行一次访问活动。 SurveyID 列在此模型中充当退化维度,对于同一调查的所有访问都是通用的。 SurveyVisitSequenceID 是一个唯一的自动增量(整数),用于简化文档和标记的两个桥表与事实表的链接。

您还可以将调查推广到完整维度 dimSurvey 以添加一些注释等;使用 SurveyID 获取链接。

我没有在这里处理罚款,为此我会建议 factFine 表,它有自己的链接到 dimDate dimTime ,< strong> dimFacility 等,以便可以快速完成有关罚款($$)的报告,而无需加入大多数访问相关表。还应该有一个桥接表,将 factFine 加入 factSurveyVisit ,提供罚款与每次访问相关,而不是与已完成的调查相关。

survey_model_6

修改

注意到您的标记表格有date_cleared,所以我无法理解此商家中的标记。在模型中, dimTag 只是可用标记的列表。可能还有一个 factFacilityStatus 表连接 dimFacility dimTag ,跟踪每个设施的标记状态。