Sql 具有多个属性的维度行

Sql 具有多个属性的维度行,sql,tsql,database-design,data-warehouse,dimensional-modeling,Sql,Tsql,Database Design,Data Warehouse,Dimensional Modeling,这并不完全是我正在做的,但我觉得这是一个很好的例子: 假设我有一个产品维度表,它连接到我的ProductSales事实表。dimProduct中的每一行都包含单个产品的所有相关数据(代码、名称、描述等),大约有一百万个产品 我现在需要将产品类别存储到仓库中。每种产品都有多个类别,平均为5种 我是应该为产品适合的每个类别复制产品维度中的整行,还是应该用dimCategory维度和dimProductCategory链接表将当前的星形模式雪花化 我担心,如果我使用前者,那么我的维度表将变大5倍以上,

这并不完全是我正在做的,但我觉得这是一个很好的例子:

假设我有一个产品维度表,它连接到我的ProductSales事实表。dimProduct中的每一行都包含单个产品的所有相关数据(代码、名称、描述等),大约有一百万个产品

我现在需要将产品类别存储到仓库中。每种产品都有多个类别,平均为5种

我是应该为产品适合的每个类别复制产品维度中的整行,还是应该用dimCategory维度和dimProductCategory链接表将当前的星形模式雪花化


我担心,如果我使用前者,那么我的维度表将变大5倍以上,如果我使用后者,那么模型将变得更加复杂。

好吧,对于新手来说,你的问题相当有见地

如果您的每个产品都可以分为多个类别(并且每个产品类别包含n个产品),则
产品
和产品
类别
之间的基数是多对多。当您具有多对多基数时,直接雪花剥落不是解决方案

但我认为你在这里所说的“雪崩”是指在
类别
产品
之间使用链接表。在我看来,这就是当前的方法。但我更愿意将此表称为无事实的表

(例如,一个类别包含多个产品)。要解决多对多基数问题,您将需要存储两个
类别
产品
表中的键的无事实表


请记住,如果加载到
ProductSales
事实表的事务数据已经包含
Category
Product
详细信息,那么您最好在
ProductSales
事实表中同时包含Category ID和Product ID。当您不需要维护产品和类别之间的任何固定关系,而是由实际业务中发生的事件驱动的关系时,您可以这样做。

。Ralph Kimball的“数据仓库工具包”是一个很好的维度建模资源。他讨论了单一维度和雪花设计之间的权衡。