数据保险库:登台表中的哈希密钥 - 高级

时间:2018-02-13 19:39:21

标签: data-warehouse parallel-data-warehouse data-vault

我正在研究使用datavault 2.0方法。我理解哈希的原因并尝试应用它。我想在" staging"中应用它。 datavault的阶段而不是将其加载到DV中。

如果表中包含业务键,则可以轻松地将其应用于该表(可能成为集线器)。但是有像" orderdetail" (可能成为链接)通过代理键对其他元素进行多次引用。

登台表是否应包含每个外键的代理序列以及引用的实体BK的哈希值?

示例:如果我有一个带有customerId代理序列的订单表,但是客户表有一个用作BK的CUST-000xxx引用,那么我应该执行一个' join'在订单和客户之间解决" CUST-000xxx"所以我可以将它哈希并将其包含在暂存表中?

我认为在从暂存区域加载DV中的数据时可能会解决这个问题,但是在特定时刻,暂存区域中可能不存在客户参考,因为订单可能只是一个新的订购现有客户并未发生变化。

DV 2.0指定所有这些带有哈希的业务都是为了提高性能并简单地并行加载数据而无需在DV本身进行昂贵的查找。因此,问题通常如何解决。

此处添加了示例:

顺序    - orderid   - 顾客ID    - order_ref    - salespersonid

客户   - 顾客ID    - customer_ref

人    - personid   - 全名    - 登录

为了填充订单,我应该像这样在源数据库中进行连接:

SELECT
   hash_func(o.order_ref) as hash_key_order,
   hash_func(c.customer_ref) as hash_key_customer,
   hash_func(p.login) as hash_key_person,
   o.orderid, 
   c.customerid,
   p.login
FROM
   order o inner join customer c on o.customerid = c.customerid
   inner join person p on o.salespersonid = p.personid

或者是在datavault中解析外键的解析,因此查询更简单,如:

SELECT
   hash_func(o.order_ref) as hash_key_order,
   o.orderid, 
   c.customerid,
   p.personid
FROM
   order o

我不清楚这一点。我所理解的是,通过散列可以避免昂贵的查找,因此在外包密钥的登台时不生成散列不会对性能产生影响吗?

1 个答案:

答案 0 :(得分:1)

我不确定为什么有一个复杂的SELECT语句来填充顺序。另外我认为可能存在一些关于Data Vault范例的混淆。您要对Data Vault执行的操作是读取源系统中的所有数据。

这意味着首先您要将表Order加载到核心DWH中,该DWH似乎是使用Data Vault建模的。然后,您会对CustomerPerson执行相同操作,依此类推。直到您的法规稍后需要的所有数据 都在核心DWH中。

每个实体都拥有自己的哈希密钥,具体取决于实体。例如。对于Order表,这可能是id

现在,当所有内容都加载到Data Vault中时,您可以在数据之上重新创建业务规则。这意味着,如果使用代理键,则可能需要重新创建它们。如果预先在数据库中创建代理键并且它们具有商业价值,那么请使用它们。

但这取决于使用ID。正如我之前评论的那样,您首先需要了解业务如何处理您提供的案例。然后,将其上的每个数据加载到Data Vault中。然后然后继续重新创建您添加的语句作为示例。

所以:

  • 复制数据
  • 重新创建业务规则(如果没有客户的订单会发生什么情况)
  • 创建视图/持久表
  • 使用数据