建模数据仓库中的多对多关系
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》翻译系列 -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模 (转)