【发布时间】:2018-09-01 01:51:50
【问题描述】:
我正在研究将数据从 OLTP 移动到 OLAP 以帮助加快分析速度。我已经研究了我当前的问题 2 天了,但在任何地方都没有找到明确的答案。目前,我有一个高度规范化的关系模式,并且在将其转换为星型模式的事实表和维度表时,我无法弄清楚如何保留分层数据。有没有办法使事实表完全细化和规范化,同时保持从关系模式中获取的父表和子表的值?我不确定我问的是否正确,所以这里有一个例子:我正在记录钓鱼旅行的数据。我必须记录旅行和捕获的数据,因此我将这些数据存储到两个主表中(以下为简化版本):
旅行(tripid、日期、装备数量、捕鱼时间、参与者)
捕获量(三倍体、物种、性状、计数)
我将如何使用它创建一个事实表,并在保持事实表标准化的同时保留渔具数量、捕鱼时间、参与者和物种计数?我能想到制作事实表的唯一方法是:
事实(日期、物种、配置、渔具数量、捕捞时间、参与者、计数)
日期、物种和处置是维度表的 FK,其余列是可量化的值。但是,这将被完全非规范化。这是执行此操作的适当方式,还是有另一种方式来保持父表和子表之间的关系具有可量化的值并将其置于星型模式中?
【问题讨论】:
-
你有多少种?您的分析真的需要维护 Trip 和 Catch 之间的关系吗?您能否举例说明您打算如何在报告中显示这些数据?通常,最终报告布局是推动有关如何为 OLAP 非规范化数据的决策的最佳方式。
-
它不是非规范化的。它进行了重组。您的建议是正确的方法
-
你的 Catch 将是一个退化的维度,拥有一个是可以的。请记住,您的数据库模式受非功能性需求(性能、可用性等)的影响很大。所以@TabAlleman 的评论非常重要。 en.wikipedia.org/wiki/Degenerate_dimension
-
起初我会说你的 Fact 表可能只是一个在你的 2 个表之间有左连接的视图。为什么需要在单独的表中使用它?如果您发布一些示例数据和预期结果可能会有所帮助
-
@TabAlleman 每次旅行的物种数量都不同。我在一次旅行中看到了多达 30 个物种,但平均每次旅行大约有 5 个不同的物种,物种是一个常见的集合。最终的报告布局变化很大。每天的请求都以任何可以想象的方式变化。使用这种格式的一个例子是年份、物种、总和(捕捞小时数)、总和(计数)。
标签: sql sql-server denormalization star-schema fact-table