在仓库中存储问卷
Storing a questionnaire in a Warehouse
我目前正在使用 SQL Server 2014 实施数据仓库,我正在努力处理维度 table 的布局,好吧,更多的是数据提取。我有一个 Excel-File 格式如下:
+--------+---------+------------+------------+------------+---+-------------+
| 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 文件导入到我的原始 table 中,它代表我的准备区域(它与 excel 文件的格式完全相同,第一行为 headers) .现在,当我想将数据放入暂存区时,我在布局方面遇到了一些困难。所以我考虑了布局,因为我的老板告诉我未来的问题可能会改变,我想出了以下两个 tables:
+------------+---------------------+
| DIM_Questionnaire |
+------------+---------------------+
| PK | SUR_QuestionnaireID |
| FK | LocationID |
| FK | TimeKey |
+------------+---------------------+
+--------------+-----------------+
| DIM_Question |
+--------------+-----------------+
| PK | SUR_QuestionID |
| FK | QuestionnaireID |
| | Question |
| | Answer |
| | Category |
+--------------+-----------------+
然后将调查添加到事实 table。您如何看待仓库中的这个解决方案?此外,我如何才能从 raw-table 中获取列名作为问题 table 中的值?
如果您的目标是使用 SSIS 将列转换为行,则 "Unpivot" 任务可能会有用。
看到这个 article 将以简单的方式描述如何使用 Pivot 和 Unpivot 转换组件。
我认为你已经找到了一个很好的解决方案。正如您所提到的,第一个布局不太好,因为每次调查的问题数量可能会多次变化,例如,如果您有 97 个问题列,如果您需要保留 100 个问题,则必须更改 table结构。如果问题是大约 20 个,你会不必要地浪费很多列。在弄清楚结构方面做得很好。
我觉得你的结构很好。我只想向你澄清一件事? DIM_Question table中的答案是正确答案吗?用户提供的答案应该转到另一个持有 DIM_Question SK 的答案 table,以便您随时可以 link 在问题维度上使用确切问题的答案。
还有一件事,您为什么将调查 table 添加为事实 table?我认为您的措施 "answers" 对吗?例如,如果有人问 "How many of them answered correctly to this question?"、"what type of answers that people have provided for this question?" 等等。我认为您应该仔细检查一下。如果您遇到困难,只需提供一些对实际需求的匹配,以便我们解决。
最后是你的下一个问题 "how would i be able to get the column name from the raw-table as a value in in the Question table? " 我想你可以从下面的查询
中得到 table 列名
SELECT *
FROM <database_name>.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Dim_Table'
希望对您有所帮助。
您的术语的含义并不完全清楚。似乎有多个调查(返回问卷的集合,每个问卷都有相同的问题集)。但是,您的 Survey 维度肯定应该有一个 FK 到 QuestionnaireID 吗?
你的 Dim Question 的结构与此不一致。根据 FK 到 QuestionnaireID,问卷似乎是 "class"(发送给多人的一组问题)。那么"instance of the class"(一组问题的特定副本,由一个人返回并提供答案)是什么?
我认为您的事实应该是 答案,维度为问题、(可能)调查、问卷(可能是维度问题的属性)。但我不能完全确定这一点(除了答案绝对是事实)因为我不确定你是如何使用这些术语的。
我目前正在使用 SQL Server 2014 实施数据仓库,我正在努力处理维度 table 的布局,好吧,更多的是数据提取。我有一个 Excel-File 格式如下:
+--------+---------+------------+------------+------------+---+-------------+
| 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 文件导入到我的原始 table 中,它代表我的准备区域(它与 excel 文件的格式完全相同,第一行为 headers) .现在,当我想将数据放入暂存区时,我在布局方面遇到了一些困难。所以我考虑了布局,因为我的老板告诉我未来的问题可能会改变,我想出了以下两个 tables:
+------------+---------------------+
| DIM_Questionnaire |
+------------+---------------------+
| PK | SUR_QuestionnaireID |
| FK | LocationID |
| FK | TimeKey |
+------------+---------------------+
+--------------+-----------------+
| DIM_Question |
+--------------+-----------------+
| PK | SUR_QuestionID |
| FK | QuestionnaireID |
| | Question |
| | Answer |
| | Category |
+--------------+-----------------+
然后将调查添加到事实 table。您如何看待仓库中的这个解决方案?此外,我如何才能从 raw-table 中获取列名作为问题 table 中的值?
如果您的目标是使用 SSIS 将列转换为行,则 "Unpivot" 任务可能会有用。
看到这个 article 将以简单的方式描述如何使用 Pivot 和 Unpivot 转换组件。
我认为你已经找到了一个很好的解决方案。正如您所提到的,第一个布局不太好,因为每次调查的问题数量可能会多次变化,例如,如果您有 97 个问题列,如果您需要保留 100 个问题,则必须更改 table结构。如果问题是大约 20 个,你会不必要地浪费很多列。在弄清楚结构方面做得很好。
我觉得你的结构很好。我只想向你澄清一件事? DIM_Question table中的答案是正确答案吗?用户提供的答案应该转到另一个持有 DIM_Question SK 的答案 table,以便您随时可以 link 在问题维度上使用确切问题的答案。
还有一件事,您为什么将调查 table 添加为事实 table?我认为您的措施 "answers" 对吗?例如,如果有人问 "How many of them answered correctly to this question?"、"what type of answers that people have provided for this question?" 等等。我认为您应该仔细检查一下。如果您遇到困难,只需提供一些对实际需求的匹配,以便我们解决。
最后是你的下一个问题 "how would i be able to get the column name from the raw-table as a value in in the Question table? " 我想你可以从下面的查询
中得到 table 列名SELECT *
FROM <database_name>.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Dim_Table'
希望对您有所帮助。
您的术语的含义并不完全清楚。似乎有多个调查(返回问卷的集合,每个问卷都有相同的问题集)。但是,您的 Survey 维度肯定应该有一个 FK 到 QuestionnaireID 吗?
你的 Dim Question 的结构与此不一致。根据 FK 到 QuestionnaireID,问卷似乎是 "class"(发送给多人的一组问题)。那么"instance of the class"(一组问题的特定副本,由一个人返回并提供答案)是什么?
我认为您的事实应该是 答案,维度为问题、(可能)调查、问卷(可能是维度问题的属性)。但我不能完全确定这一点(除了答案绝对是事实)因为我不确定你是如何使用这些术语的。