2016-05-13 32 views
0

我目前正在使用SQL Server 2014实施数据仓库,而我正在努力维度表的布局,以及更多的数据提取。我有一个Excel的文件格式如下:在仓库中存储调查问卷

+--------+---------+------------+------------+------------+---+-------------+ 
| Region | Country | Location | Question 1 | Question 2 | … | Question 97 | 
+--------+---------+------------+------------+------------+---+-------------+ 
| Africa | Algeria | Location 1 | Yes  | Yes  | … | No   | 
| Africa | Algeria | Location 2 | No   | Yes  | … | Yes   | 
+--------+---------+------------+------------+------------+---+-------------+ 

有关于谁回答的时候这个问题做了更多的属性。如点所示,有3个以上的问题,实际上有97个问题。 目前我已经将excel文件导入到我的原始表格中,该表格代表了我的准备区域(它具有与第一行作为标题的excel文件完全相同的格式)。现在,当我想把数据放入分期时,我正在为布局挣扎。于是我想到了布局和因为我的老板告诉我,这些问题可能在将来改变,我想出了下面两个表:

+------------+---------------------+ 
| DIM_Questionnaire    | 
+------------+---------------------+ 
| PK   | SUR_QuestionnaireID | 
| FK   | LocationID   | 
| FK   | TimeKey    | 
+------------+---------------------+ 

+--------------+-----------------+ 
| DIM_Question     | 
+--------------+-----------------+ 
| PK   | SUR_QuestionID | 
| FK   | QuestionnaireID | 
|    | Question  | 
|    | Answer   | 
|    | Category  | 
+--------------+-----------------+ 

调查,然后添加到事实表。您如何看待仓库中的这种解决方案?此外,我怎样才能从原始表中获取列名作为问题表中的值?

回答

2

我认为你已经制定了一个很好的解决方案。正如你所提到的那样,第一个布局不太好,因为很多时候每个调查问题的数量可能会改变,如果你有97个问题列,例如,如果你有100个问题的需求,你必须改变表格结构体。如果问题大概是20,那么你就会不必要地浪费很多列。搞清楚结构的好工作。

您的结构对我来说看起来很好。我只想澄清一件事吗? DIM_Question表中的答案是正确的答案吧?用户提供的答案应该转到另一个保存DIM_Question SK的答案表,以便您可以随时将答案与问题维度上的确切问题关联起来。

还有一件事,为什么您将调查表添加为事实表?我认为你的措施是“答案”是正确的?例如,如果有人问“他们中有多少人正确回答了这个问题?”,“人们为这个问题提供了什么类型的答案?”等等等等。我想你应该仔细检查一下。如果你被困住了,只需要提供一些关于实际需求的点击,所以我们可以弄明白。

最后为您的下一个问题“我将如何能够从原始表中获取列名作为问题表中的值?”我认为您可以从下面查询表列名称查询

SELECT * 
FROM <database_name>.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'Dim_Table' 

希望这会有所帮助。

+0

谢谢您的反馈!问题表中的答案不是用户给出的答案。我可以将答案加载到另一个表中,但之后我需要另一个连接。我不是故意将Survey表作为事实表,只是将它与事实表相关联,因为它不仅仅是问卷。 –

+0

如果受访者给出的(许多不同的)答案在问题表中,那么它不应该是维度表。或者,至少它不应该被称为DIM_Questions,而是DIM_QuestionAnswers。如果可能的答案受到高度限制(例如“是”,“否”等等多选值),这将是有意义的。 – SebTHU

+0

我认为最好的方法是将答案放在另一个表中,而不是将其包含在问题表中。尽管它是另一个表连接,但仍然值得做,因为如果有一个问题有很多用户给出的答案,那么你必须重复表中所有与问题相关的字段,以便存储不同的答案。问题是一个坏方法和一个设计。分析将很困难,您将使用不必要的存储。你认为怎么样 –

0

如果您的目标是使用SSIS转换行中的列,那么可以使用“Unpivot”任务。

看到这个article将以简单的方式描述如何使用Pivot和Unpivot转换组件。

0

这并不完全清楚你的术语是什么意思。似乎有多个调查问卷(回收调查问卷的集合,每个调查问卷都有相同的问题)。但是,那么您的调查维度当然应该有一个FK给QuestionnaireID?

您的Dim Question的结构与此不一致。根据QuestionnaireID的FK,问卷似乎是“班级”(发给多人的一组问题)。那么什么是“班级实例”(一组问题的具体副本,由一个人回答)?

我认为你的事实应该是答案,与维度问题,(可能)调查,问卷(可能是维度问题的属性)。但我不能完全确定这一点(除非答案肯定是事实),因为我不确定你是如何使用这些术语的。

+0

对于我从调查问卷转到调查再回来的混淆术语,我感到很遗憾,我已经将前调查表更新为问卷表,它实际上是... –

+0

我还是不太明白。我认为从描述你的事实表开始,然后从那里开始会很有用。 – SebTHU