【问题标题】: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?

【问题讨论】:

    标签: etl data-warehouse


    【解决方案1】:

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

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

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

    Cons 也可以这样做。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-09
      • 2012-06-16
      • 2023-03-23
      • 2019-07-16
      • 2019-04-14
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多