3

我有一个应用程序,我知道它可以制作一个很棒的多维数据集,并且比标准的平面 Reporting Services 报表更有用。我们即将与一位顾问一起进入 BI 领域,但我想在我们这样做之前先试一试,主要是因为我知道我们将要做什么。

该应用程序跟踪全国疗养院的调查。它们可以是年度、投诉或其他几种类型的调查,它们具有与给定标签相关的处罚,并具有与之相关的文档。

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

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

任何事情都会很有帮助。我正在尝试建立一个小型数据集市,同时我正在翻阅 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

4 回答 4

6

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

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

您可以回答“佛罗里达州 6 月份有多少标签?”这个问题的唯一方法。是将标签与设施相关联,将标签与日期相关联。

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

对于您希望数据仓库回答的其他问题或查询,您应该遵循相同的分析过程。

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

至于您的架构,我必须对其进行更多研究才能给出具体建议,但总的来说,您想使用星型架构。星星的中心是你的事实、实体和对象。构成星形点的表是您的维度表。

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

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

您求和的时间段取决于您期望的查询组合。在您的数据仓库中,一天可能太短了。换句话说,在 SQL 中进行汇总与选择汇总行一样快。

您还需要一个日历表。日历表会提出诸如“与去年(第一季度)相比,今年第一季度发生了多少年度(意外)调查?”之类的问题。更容易查询。

于 2010-07-09T15:50:36.287 回答
1

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

我希望有 4 个事实表——每个事实表中的事实看起来主要是日期时间数据(尽管这些通常被建模为日期和/或时间维度的角色——我在这里做了一些注释,但标志通常会去尺寸):

调查主要

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

调查文件

调查标签

他们都将共享一个调查维度,我将继续并在每个维度中共享一个实体/设施维度。您可以通过调查维度雪花,但这破坏了星型模型最有益的一点,它允许您直接获取所有数据,而不是通过桥接表。

您可以选择将调查类型放在它自己的维度(或者可能是垃圾维度)中,或者通过调查维度(而不是通过雪花)访问它。这在维度建模中很典型——你不需要遵循你的实体——你只需要避免太多维度和太少维度的陷阱,并注意维度的基数——尤其是如果你不小心包含了一些退化维度,比如发票号码随每个事实而变化,因此需要存储在事实表中。

实际上,通过在您的 3NF 中执行典型的连接创建典型的平面报告视图,然后简单地将这些平面行变成星形,有时会更容易创建您的星形模型。(这就是实体关系模型与维度模型的真正相关性)。因此,您可以在当前标准化键上将 SurveyMain 加入 SurveyTypes 和 SurveyFine 并查看所有列。这将是 SurveyFine 事实表的基础。我确定的其他事实表也是如此。共享的东西将成为共享维度的候选者。实体是一致性维度的良好候选者(即,它将在这些调查模型和与您的企业相关的其他模型(如人力资源模型或会计模型)之间共享)。

于 2010-07-13T18:26:02.337 回答
1

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

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

然后,我将为那些可能需要结合所有三个事实的指标设置预先汇总的指标表。

如果您希望我详细说明,请随时询问。我今天有点着急。

(继续...)在我看来,您的用户想要调整可衡量的数据(文件数、文件发送日期、罚款总额)。他们希望通过调查的属性来查看这些指标。这就是我建议调查维度的原因。

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

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

我每天都会使用我的事实表中的全套活动调查数据加载此表。这允许用户来回浏览历史以查看调查是如何进入的。

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

于 2010-07-13T20:30:32.267 回答
1

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

您还可以将调查推广为全维度的dimSurvey以添加一些注释等;使用SurveyID作为链接。

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

调查模型_6

编辑

刚刚注意到您的标签表有 date_cleared,所以不可否认,我不了解该业务中的标签。在模型中,dimTag只是可用标签的列表。可能还有一个factFacilityStatus表链接dimFacilitydimTag,跟踪每个设施的标签状态。

于 2010-07-17T16:05:30.390 回答