sql - 建模分层数据仓库维度

标签 sql database data-warehouse dimensional-modeling

我正在尝试为一个层次化的维度建模,并且在每个级别上具有不确定数量的特征。下面是有关表格在数据源中的结构的示例

+-------------+              +-------------+                +-------------+     
|Product      +--------------+SubCategory  +----------------+Category     |     
+------+------+              +------+------+                +-------+-----+     
       |                            |                               |           
       |                            |                               |           
+------+----------+         +-------+-------------+         +-------+----------+
|Product Features |         |SubCategory Features |         |Category Features |
+-----------------+         +---------------------+         +------------------+

Product -> SubCategory 和 SubCategory -> Category 之间存在一对多关系。每个产品/子类别/类别还引用它们各自的功能表。然而,特征的数量并不固定,可能为 0。

我正在尝试构建的事实表需要处于其粒度的产品级别,并且如果没有这些功能,我只能将其中的每一个作为列创建一个维度,如下所示:

+-----------------+
|Dim_Product      |
+-----------------+
|Dim_Product_Id   |
|Product          |
|SubCategory      |
|Category         |
|...              |
+-----------------+

但是所有的特征都会丢失。

是否可以将维度保留在产品级别并保留每个层次结构中的所有功能?或者是否有必要制作一个包含层次结构中所有功能的所有组合的桥接表?我是否需要将级别分解为它们自己的维度(即 Dim_Product、Dim_SubCategory、Dim_Category)?每个层次结构级别也有固定的属性,所以如果单个维度是合适的选择,是否可以将这些属性展平并作为列包含在内?

最佳答案

这似乎很棘手,因为您不知道确切的特征数量,这是我的建议,尽管桥接表会很大。

+-----------------+
|Dim_Product      |
+-----------------+
|Dim_Product_Id   |
|Product          |
|SubCategory      |
|Category         |
|...              |
+-----------------+
         |
         | 
+-----------------+
|BridgeTable      |
+-----------------+
|Dim_Product_Id   |
|Feature_Id       |
+-----------------+
         |
         |
+-----------------+
|Features         |
+-----------------+
|Feature_Id       |
|FeatureDescription
|TypeOfFeature    |
+-----------------+

TypeOfFeature 是(ProductFeature、SubCategory、Category)之一。

关于sql - 建模分层数据仓库维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23912046/

相关文章:

sql - 使用 Clustered ColumnStore Index 插入唯一值

c# - 更新用户名时验证用户名是否存在

ios - 如何在我的 iOS 应用程序中使用 SQL 数据库?

azure - 将 Azure Blob 存储文件名保存到 Sql 表 - Azure 数据工厂

database-design - 在数据仓库中存储变化缓慢的属性的最佳方式是什么?

mysql - Talend 数据仓库工具

mysql - 如何在mysql中按特定字段对数据进行分组之前对数据进行排序?

mysql - 没有结果显示 AND 错误以及 where 子句

mysql - 不使用子查询限制结果

java - 使用 ArrayList 存储变量