- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们正在扩展我们的数据仓库,但我们遇到了团队中没有人能够解决的难题。我尝试在 Google 上搜索答案,但很难找到正确的术语。
本质上,问题是这样的。我们有一个跟踪项目的数据仓库。我们必须从这个数据仓库中做很多报告。许多报告都是通过对这些项目进行分类然后根据分类汇总数据来驱动的。有些报告共享分类,有些可能有自己的特定于报告的分类。即使在那种情况下,后续报告或分析(临时)也可能需要重用这些分类。并且可能会有很多这样的分类方案。此外,这些方案可能依赖于来自多个事实表的数据来对项目进行分类(并且由于粒度不同,项目信息跨越多个事实表)。
我们最初的计划是为这些设置维度,每个分类一个,或者可能是一个垃圾维度,每个类别都有一个列。如果分类的数量可能保持不变,那就没问题了。但是,总会有新的报告和分析需求。我们不希望每次要添加新的分类方案时都必须更改架构和 ETL 过程。我们可能还想更改分类逻辑,而不必重新导入数据或重新运行部分 ETL 以重新计算。
所以我们的选择似乎如下:
我们希望这个系统易于访问,这样用户就不需要像访问常规事实和维度字段那样做太多(如果有的话)来访问这些分类字段。我们还希望避免每次将新的分类模式添加到数据库时都必须对模式和 ETL 过程进行大量更改。
所以我的问题是,从本质上讲,有没有比我列出的五种方法更好的方法来解决这个问题?这五个有没有更有效地解决问题的变体?或者这只是一个需要一定程度痛苦的难题?也许我的做法全错了,所以在这方面的任何反馈也会有所帮助。
tl;dr:我们需要在数据仓库中对项目进行大量不同分类的方法,但不确定最有效、易于管理或易于使用的系统。
编辑:附加信息:我们使用 SQL Server,将 SSRS 作为主要报告前端,将 SSAS 作为用于分析或临时查询的辅助前端。
最佳答案
根据以上评论中的讨论,您最好的选择可能是构建一个小型 .NET 应用程序或 Web 应用程序,允许用户根据维度属性自行定义分类。
您可以在“类别表”中定义类别
CategoryID
Category Name
然后您将构建一组“映射”表,这些表必须从每个维度创建一个类别的雪花:
类别 - Dim1 映射 (CATEGORY_D1)
CategoryID
Dim1ID
类别 - DimX 映射
CategoryID
DimXID
您的小应用程序将在定义类别时维护和构建这些映射表。
然后,当您构建报告时,您定义了事实表、维度表和类别表之间的连接。
如果我想找到类别 3 中的所有项目,那么我会写:
SELECT *
FROM ITEMS_FACT F
JOIN DIM1 D1 ON (F.DIM1_ID = D1.DIM1_ID)
JOIN CATEGORY_D1 CD2 ON (CD2.DIM1_ID = D1.DIM1_ID
AND CD1.CATEGORY_ID = 3)
JOIN DIM2 D2 ON (F.DIM2_ID = D1.DIM2_ID)
JOIN CATEGORY_D2 CD2 ON (CD2.DIM2_ID = D1.DIM2_ID
AND CD2.CATEGORY_ID = 3)
这将允许用户定义他们想要的任何类别,并且根本没有 ETL 更改(除非您有 SCD 类型 2s - 您可能需要在更新行时应用类别)。
如果有类别管理“异常(exception)”,你可能需要建立一个类别映射表,其中包含所有的dim组合:
CategoryID
Dim1ID
Dim2ID
Dim3ID
然后,您可以让用户在他们的工具中定义逻辑(如果 Item 具有 Dim1 Attr2 = 'A' 和 Dim2 Attr3 = 'B',则类别 1),然后基于此构建映射表。
那么您的连接会更简单一些 - 只需将 dims 和 fact 连接到维度键上的类别映射。
SELECT *
FROM ITEMS_FACT F
JOIN DIM1 D1 ON (F.DIM1_ID = D1.DIM1_ID)
JOIN DIM2 D2 ON (F.DIM2_ID = D2.DIM2_ID)
JOIN CATEGORY_MAP CM ON (D1.DIM1_ID = CM.DIM1_ID
AND D2.DIM2_ID = CM.DIM2_ID
AND CD1.CATEGORY_ID = 3)
关于sql-server - 数据仓库中的自定义/动态分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14612127/
好的,所以我编辑了以下... 只需将以下内容放入我的 custom.css #rt-utility .rt-block {CODE HERE} 但是当我尝试改变... 与 #rt-sideslid
在表格 View 中,我有一个自定义单元格(在界面生成器中高度为 500)。在该单元格中,我有一个 Collection View ,我按 (10,10,10,10) 固定到边缘。但是在 tablev
对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满
我正在使用 meta-tegra 为我的 NVIDIA Jetson Nano 构建自定义图像。我需要 PyTorch,但没有它的配方。我在设备上构建了 PyTorch,并将其打包到设备上的轮子中。现
在 jquery 中使用 $.POST 和 $.GET 时,有没有办法将自定义变量添加到 URL 并发送它们?我尝试了以下方法: $.ajax({type:"POST", url:"file.php?
Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,为解决这个问题,官方推出了一个 Traefik Pilot[1] 的功
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
我在 ~/.emacs 中有以下自定义函数: (defun xi-rgrep (term) (grep-compute-defaults) (interactive "sSearch Te
我有下表: 考虑到每个月的权重,我的目标是在 5 个月内分散 10,000 个单位。与 10,000 相邻的行是我最好的尝试(我在这上面花了几个小时)。黄色是我所追求的。 我试图用来计算的逻辑如下:计
我的表单中有一个字段,它是文件类型。当用户点击保存图标时,我想自然地将文件上传到服务器并将文件名保存在数据库中。我尝试通过回显文件名来测试它,但它似乎不起作用。另外,如何将文件名添加到数据库中?是在模
我有一个 python 脚本来发送电子邮件,它工作得很好,但问题是当我检查我的电子邮件收件箱时。 我希望该用户名是自定义用户名,而不是整个电子邮件地址。 最佳答案 发件人地址应该使用的格式是: You
我想减小 ggcorrplot 中标记的大小,并减少文本和绘图之间的空间。 library(ggcorrplot) data(mtcars) corr <- round(cor(mtcars), 1)
GTK+ noob 问题在这里: 是否可以自定义 GtkFileChooserButton 或 GtkFileChooserDialog 以删除“位置”部分(左侧)和顶部的“位置”输入框? 我实际上要
我正在尝试在主页上使用 ajax 在 magento 中使用 ajax 显示流行的产品列表,我可以为 5 或“N”个产品执行此操作,但我想要的是将分页工具栏与结果集一起添加. 这是我添加的以显示流行产
我正在尝试使用 PasswordResetForm 内置函数。 由于我想要自定义表单字段,因此我编写了自己的表单: class FpasswordForm(PasswordResetForm):
据我了解,新的 Angular 7 提供了拖放功能。我搜索了有关 DnD 的 Tree 组件,但没有找到与树相关的内容。 我在 Stackblitz 上找到的一个工作示例.对比drag'ndrop功能
我必须开发一个自定义选项卡控件并决定使用 WPF/XAML 创建它,因为我无论如何都打算学习它。完成后应该是这样的: 到目前为止,我取得了很好的进展,但还有两个问题: 只有第一个/最后一个标签项应该有
我要定制xtable用于导出到 LaTeX。我知道有些问题是关于 xtable在这里,但我找不到我要找的具体东西。 以下是我的表的外观示例: my.table <- data.frame(Specif
用ejs在这里显示日期 它给我结果 Tue Feb 02 2016 16:02:24 GMT+0530 (IST) 但是我需要表现为 19th January, 2016 如何在ejs中执行此操作?
我想问在 JavaFX 中使用自定义对象制作 ListView 的最佳方法,我想要一个每个项目如下所示的列表: 我搜了一下,发现大部分人都是用细胞工厂的方法来做的。有没有其他办法?例如使用客户 fxm
我是一名优秀的程序员,十分优秀!