【发布时间】:2018-02-13 19:39:21
【问题描述】:
我正在研究使用 datavault 2.0 方法。我了解散列并尝试应用它的原因。我想在数据库的“暂存”阶段应用它,而不是将其加载到 DV 中。
如果一个表中有业务键,那么很容易将其应用到该表(可能成为一个集线器)。但也有像“orderdetail”这样的表(可能成为链接),它们通过代理键多次引用其他元素。
临时表是否应该同时包含每个外键的代理序列以及引用实体 BK 的散列?
示例:如果我有一个带有 customerId 代理序列的订单表,但客户表有一个用作 BK 的 CUST-000xxx 引用,我是否应该在订单和客户之间执行“连接”以解决“CUST -000xxx" 这样我就可以对其进行哈希处理并将其包含在订单暂存表中?
我认为从暂存区加载 DV 中的数据时可能会解决此问题,但在该特定时刻暂存区中可能不存在客户参考,因为订单可能只是新的为未更改的现有客户的订单。
DV 2.0 指定使用哈希的所有这些业务都是为了提高性能并简单地并行加载数据,而无需在 DV 本身中进行昂贵的查找。因此,这个问题通常是如何解决的。
此处添加的示例:
订购 - 订单号 - 客户ID - order_ref - 销售人员
客户 - 客户ID - customer_ref
人 - 人物 - 全名 - 登录
为了填充订单,我是否应该像这样在源数据库中加入:
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
这对我来说不是很清楚。我的理解是,通过散列可以避免昂贵的查找,因此不为外键在暂存时生成散列不会影响性能?
【问题讨论】:
-
在我看来,这更像是一个业务规则问题而不是加载。如果是这样的话,现在在实际业务中如何解决空引用的问题?他们如何处理新订单或未更改客户的空键。在我看来,只有部分 Data Vault 被应用。也许用实际的行数据扩展问题以使其更清楚。
-
我添加了一个例子来说明清楚。
标签: data-warehouse parallel-data-warehouse data-vault