0

第一个使用星型模式的项目,仍处于规划阶段。我们将不胜感激对以下问题的任何想法和建议。

我们有一个“使用的产品特性”的维度表,并且特性集会随着时间的推移而增长和变化。由于特征的动态集,我们认为特征不能是列,而必须是行。

我们有一个“用户事件”的事实表,我们需要知道每个事件中使用了哪些产品功能。

所以看起来我们需要在事实表上有一个主键,它被用作维度表中的外键(与传统的星型模式正好相反)。我们有几个不同的维度表,它们具有相似的动态,因此对事实表的外键也有类似的需求。

另一方面,我们的大多数维度表都比较常规,事实表可以只在这些常规维度表中存储一个外键。我们不喜欢这意味着某些连接(多对一)将使用维度表的主键,但其他连接(一对多)将使用事实表的主键。我们已经考虑在所有维度表中使用事实表键作为外键,只是为了保持一致性,尽管存储需求会增加。

有没有更好的方法来实现“动态”维度表的键?

这是一个不完全是我们正在做但类似的示例:

  • 假设我们的应用搜索餐馆。

  • 用户可以指定的可选功能包括价格范围、最低星级或美食。可选功能集随时间而变化(例如,我们可能会去掉指定美食的选项,并添加一个最受欢迎的选项)。对于记录在数据库中的每个搜索,使用的特征集是固定的。

  • 每个搜索将是事实表中的一行。
  • 我们目前在想,事实表中应该有一个主键,在“特征”维表中应该作为外键。所以我们有:

    fact_table(search_id,user_id,metric1,metric2)
    feature_dimension_table(feature_id,search_id,feature_attribute1,feature_attribute2)
    user_dimension_table(user_id,user_attribute1,user_attribute2)

  • 或者,为了一致的连接和为了论证而忽略存储要求,我们可以在所有维度表中使用事实表的主键作为外键:

    fact_table( search_id , metric1, metric2) /* 不再有 user_id */
    feature_dimension_table(feature_id, search_id, feature_attribute1, feature_attribute2)
    user_dimension_table(user_id, search_id , user_attribute1, user_attribute2)

  • 这些关键模式的缺陷是什么?有什么更好的方法来做到这一点?

4

1 回答 1

1

您需要一个 Bridge 表,它是事实和维度之间多对多关系的推荐解决方案。

http://www.kimballgroup.com/data-warehouse-business-intelligence-resources/kimball-techniques/Dimension-modeling-techniques/multivalued-dimension-bridge-table/

将示例添加到问题后进行编辑:

好吧,也许它不是一座桥梁,这个例子改变了我的看法。

维度建模的一个基本要求是正确识别事实表的粒度。一个常见的例子是发票和行项目,其中谷物通常是行项目。

假设的示例通常很困难,因为您永远无法确定示例反映了真实的用例,但我认为您的场景可能是搜索和标准,并且您的粒度应该处于标准级别。

例如,您的事实表可能如下所示:

fact_search (date_id,time_id,search_id,criteria_id,criteria_value)

考虑到我可能想要针对搜索数据执行的查询类型,这种设计是我的最佳选择。我看到的唯一问题是criteria_value的数据类型,它必须是一个选择/文本值,并且肯定是非附加的。

于 2016-02-12T11:36:36.030 回答