database - 如何处理星型模式中的桥接表

标签 database data-warehouse dimensional-modeling

我正在尝试从似乎包含桥接表的 E/R 图(OLTP 系统)构建星型模式。 Order 是一个明显的事实表,而 product 是一个维度表。如果模型需要是星型模式,我看不出如何保留桥接表。如果我需要在模型中保留有关 Channel 的信息,您将如何处理这种关系?

enter image description here

最佳答案

这取决于您打算如何使用该模型。

如果您只需要回答有关现有订单的产品和 channel 问题,那么您可以完全避免使用桥接表,因为可以通过事实表(“订单”)解决 channel 和产品之间的 M2M 关系:

enter image description here

这种设计的(巨大)优势在于它的简单性和易用性 - 它对最终用户来说非常直观。它也很快。

该模型的缺点是它对订单的依赖。如果订单不存在(即事实表中没有订单),那么您将无法回答有关产品和 channel 关系的问题(例如,“按指定 channel 显示所有产品”)。如果此类问题不重要,您只需分析现有订单,请保持简单。

如果您确实需要在没有现有订单的情况下分析产品与 channel 的关系,那么事情就更复杂了。一种方法是添加桥接表,如下所示:

enter image description here

这种设计的优点是无论订单如何, channel -产品关系始终可用。按产品分析订单也(仍然)很简单。缺点是现在很难按 channel 分析订单,因为您现在必须通过桥接表。例如,在 Power BI 等最终用户工具中,您需要使“红色”连接成为双向连接,以启用从 channel 维度通过桥接到产品维度的过滤器传播。当然,这是可行的,但最终用户现在必须知道他们在做什么——这不再简单了。

另一种设计使用“无事实”事实表:

enter image description here

在这里,您可以轻松查询没有订单的 channel -产品关系(通过事实表产品- channel ,本质上显示关系状态),也可以轻松地按产品和 channel 查询订单。您还可以“钻取”这种结构来回答有关没有现有订单的产品的各种复杂问题。尽管如此,这样的设计还是不如第一个设计直观。

关于database - 如何处理星型模式中的桥接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54392376/

相关文章:

mysql - 如何计算具有左连接和最大操作的查询产生的行数?

database - 如何使网站变废为宝

mysql - 如何找到最流行的音乐流派?

mysql - MySQL如何检查列中的多个值

database - 维度建模 : need help doing this star for a university

postgresql - 来自多个模式的 DWH

amazon-web-services - 备份 hive 内表的最佳存储格式

sql - 日期维度应该雪花化吗?

time - 如何在时间维度指定无效时间?

data-warehouse - 如何将数据存储在数据仓库中一个订单中包含多个产品的事实表中