0

我有一个按订单/行粒度定义的事实表。每个订单都属于某个垂直行业,每个垂直行业都有用于描述其数据的自定义属性。我希望能够允许用户查询所有订单,而不管垂直,但是在查询特定于垂直的数据时,能够按垂直特定属性进行过滤。

以下是我计划如何构建它,但如果这看起来像一个好的设计,或者如果这不好,请推荐另一种方法。

事实表将包含 VerticalKey FK。这些是我计划制作的 Dims:

  1. DimVertical(超类型/核心)

    • VerticalKey(自动增量)
    • OrderId(备用键)
  2. DimVertical-Car(子类型/自定义)

    • VerticalKey(来自 DimVertical.VerticalKey 的密钥 ID)
    • 自定义属性ABC
    • 自定义属性DEF
    • 自定义属性 GHI
  3. DimVertical-Motorcyle(子类型/自定义)

    • VerticalKey(来自 DimVertical.VerticalKey 的键)
    • 自定义属性123
    • 自定义属性456

为了查询所有订单,只需对超类型 DimVertical 进行连接。但是,当我想通过垂直特定属性查询特定垂直时,我只会包含可选的子类型 Dimension。

这看起来是个好方法吗?其次,如果这是一个很好的方法,假设“OrderType”是一个超类型属性,所以它可以进入 DimVertical 维度,这很糟糕吗?我质疑这一点,因为我知道你不应该有一个标题维度,这就是这种情况,但我不知道如何支持“自定义”订单标题搜索能力。

提前致谢!

4

1 回答 1

0

理论上,类层次结构到关系模式的三种可能映射:

  • 每个类层次结构表

  • 每个子类的表

  • 每个具体类的表

如果我猜对了,您会按照每个子类策略的表格进行操作。这可能很好,但在不了解您的数据的情况下无法发表评论。

最好的方法是简单地设置一个包含非平凡数据的示例模式;您将很快看到访问查询是否执行并且易于创建。

根据我的经验,在数据仓库设计中使用的一种常用方法是按类层次结构表(即所有子类都在一个表中实现),因为

  • 访问是有效的(没有连接)
  • 可能不一致的缺点(即您可以将汽车属性存储在摩托车记录中)在数据仓库中并不重要,因为一致性通常是通过清理 ETL 作业而不是由数据库完成的。
于 2017-01-14T18:58:06.047 回答