建模数据仓库中的多对多关系

Posted

技术标签:

【中文标题】建模数据仓库中的多对多关系【英文标题】:Modeling many-to-many relationship in data warehouse 【发布时间】:2016-12-15 14:39:48 【问题描述】:

我必须为我大学的班级设计数据仓库模型和 ETL 流程。我的数据仓库必须存储关于产品的意见/cmets,每条记录应包括:

评论文本(字符串) 产品评分(0, 0.5, ... , 4.5, 5) 评论作者(字符串) 评论日期(Date) 产品推荐(Yes, No) 评论投票(国际) 评论否决票 (Int) 产品专业人士(许多字符串,例如价格、设计、耐用性……)及其数量 产品缺点(许多字符串,例如 太大声、太重、价格……)和 它的计数

另外数据仓库应该存储有关产品的信息:

产品类别 产品品牌 产品型号

我想先创建数据仓库模型,但由于是多对多关系,我无法存储产品的优缺点。在普通的关系数据库中,我会简单地创建关联表,但在这里我不确定如何进行,毕竟我不想规范化事实表。

我正在考虑 3 种方法,第一种方法如下图所示。我使用桥接表方法(虽然,我不知道是否正确)来摆脱多对多关系。我不知道它会如何影响查询性能。

我可能使用的第二种方法是布尔列方法。在 PROS 和 CONS 表中,我可以为每个可能的值创建一个列,但最多可以有 100 个不同的优点或缺点。此外,可能的优点或缺点的数量在时间上也不是恒定的。他们的 cmets 中的作者可以列出新的优缺点(这就是它在数据源中的工作方式),但我不能添加新列(我不应该更改数据仓库中的数据)。

我正在考虑的第三种方法是将专业人士保留在 PROS 表中,但在 1 列中,其中值将使用逗号或其他一些分隔符分隔,例如“价格、设计、颜色”。它使事情变得简单,但难以分析或切分。

在这种情况下我应该使用哪种方法?哪个更适合将数据加载到数据仓库中,因为表单数据源我将获取所有 cmets,并且我只想加载自上次加载以来新的 cmets?

【问题讨论】:

【参考方案1】:

我的想法是,如果我们可以将您的第一个选项稍微修改为比您在此处所说的内容,那将是我理解的最好的选择。

在您提供的图像中,拥有 Pros_Bridge_Detail 表就可以了。其余的都需要改变。

您可以删除仅包含计数的 pros_Bridge 表。您实际上可以将该列添加到您在那里的 COMMENT 事实表中。当涉及到查询而不是在许多表中查询时,这将更高效、更容易。 您说您有很多方面可以提供给专业人士,例如价格、设计、耐用性等。让我们把这些东西放到一个单独的维度中。 在您的 Pros_Bridge_Detail 表中添加一个新列,以保存新创建的包含产品专业类型(设计、耐用性等)的维度的 ID。 现在,一旦您添加了产品 Pro,Pros_Bridge_Detail 表将包含用户提供的 pro,并且还会保存通过新维度的 ID 为 pro 提供的值。 另外,不要忘记将评论 ID 也存储在 Pros_Bridge_Detail 表中,因为这将是您拥有的评论事实表的链接 (FK)。

Cons 也可以这样做。

希望您理解我刚才解释的内容,并希望对您有所帮助。如果您有任何问题,请告知。

【讨论】:

以上是关于建模数据仓库中的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

预言机分析中的多对多关系

《Entity Framework 6 Recipes》翻译系列 -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模 (转)

SQL Server Analysis Services 中的多对多关系;第二个多对多关系不起作用

实体框架中的多对多关系导致无限循环

核心数据:与状态的多对多关系

多维数据集设计 - 带有附加列的多对多映射的桥接表