Sql 数据仓库建模问题

Sql 数据仓库建模问题,sql,database,oracle,data-modeling,data-warehouse,Sql,Database,Oracle,Data Modeling,Data Warehouse,我在数据仓库中有一个典型的事实表-该表有一些代理键和度量值。在数据中,仓库也是一个查找表——其中不维护历史记录的小维度。只需代理键、业务键和一个或两个属性。在事实数据表加载期间,代理项键取自查找表(联接基于业务键)。因此,基本上在事实加载的某个阶段,我们在事实中有业务键,用于从查找表中获取代理键,在该操作之后,业务键消失,稍后,例如在数据集市(出于报告目的)中,我们可以仅对某些属性使用代理键将查找与事实连接起来。到目前为止,这个过程相当简单,因为我们只使用一个业务键来设置属性值 但现在有些情况下

我在数据仓库中有一个典型的事实表-该表有一些代理键和度量值。在数据中,仓库也是一个查找表——其中不维护历史记录的小维度。只需代理键、业务键和一个或两个属性。在事实数据表加载期间,代理项键取自查找表(联接基于业务键)。因此,基本上在事实加载的某个阶段,我们在事实中有业务键,用于从查找表中获取代理键,在该操作之后,业务键消失,稍后,例如在数据集市(出于报告目的)中,我们可以仅对某些属性使用代理键将查找与事实连接起来。到目前为止,这个过程相当简单,因为我们只使用一个业务键来设置属性值

但现在有些情况下,我们应该使用3个或更多

例如,这些条件是:

COLUMN_1 = 'ABC' 
AND COLUMN_2 <> 'Z'
AND COLUMN_3 IN ('1', '2')

COLUMN_1 = 'ABC' 
AND COLUMN_2 <> 'Z'
AND  COLUMN_3 IN ('3', '4', '5')

COLUMN_1 <> 'ABC' OR COLUMN_2 = 'Z'
COLUMN_1='ABC'
和列_2'Z'
以及('1','2'中的第3列)
列_1='ABC'
和列_2'Z'
和列_3 IN('3'、'4'、'5')
列_1'ABC'或列_2='Z'
列_1、列_2、列_3是事实表中显示的业务键。 当然,上面的逻辑将应用于查找负载中,所以假设我们将有3个代理键:1、2和3

但主要问题是——哪种方法更适合事实表:

  • 将逻辑从查找负载复制到事实负载?性能更好,但这对维护来说更糟(如果将来需要更改,则需要在两个位置应用更改),并且代理密钥也需要硬编码
  • 将上述条件置于联接条件中?显然,对于维护来说会更好,但是对于性能来说会更差(事实表每天插入大约10000行)
  • 或者也许有另一种解决办法?在源系统中组合上述条件也不是一个选项

欢迎提出所有建议。

我过去曾多次对代理键和事实负载进行建模,根据我的经验(15年),以下设计是最佳平衡:

代理键表设计(dim_sgk) 暗号 BR1_ID1 BR1_ID2 BR1_ID3 BRn_IDx。。。 记录\u开始\u dttm

假设您有一个stage表(stg_tbl),在其中加载带有业务键src1.col1、src1.col2和src1.col3的源数据/文件

现在,当您从stage表加载代理键表时

Select *
from 
stg_tbl left outer join dim_sgk 
on stg_tbl.src1.col1 = dim_sgk.br1_id1
and stg_tbl.src1.col2 = dim_sgk.br1_id2
and stg_tbl.src1.col3 = dim_sgk.br1_id3
where dim sgk.dim_id is null
并为3个业务键的所有唯一组合生成(或根据rdbms技术及其优缺点自动生成)代理键

一旦代理键表被刷新;您可以通过将源事务表与代理键表连接并沿途拾取代理键(左外连接)来开始加载事实

我已经将业务键作为非pk属性保留在事实表中,仅用于报告目的。不需要将代理键与事实连接起来,以便以后只拾取业务键。您可以使用代理键优化连接和磁盘上数据的分发。但是,尽管将业务密钥保留为非识别属性,但事实上,这两个方面都是最好的

您应该记住代理键的多个原则(错误处理、孤立处理等)。根据您的rdbms技术,基于某个索引对表进行分区可能是有意义的,该索引可以帮助您检索错误/-1,并在不影响性能的情况下将它们重新处理到事实表中。如果你需要了解更多关于这项技术的信息,请随时联系我。很乐意帮忙

关于SGKs的另一个问题,我提供了一个非常详细的指南,您可以使用它作为参考

亲切问候,,
巴巴尔

感谢巴巴尔的澄清。你们的方法看起来很好,但是我们没有义务改变仓库的逻辑,因为仓库已经生产了几年。更重要的是,我想你们说的是在给定的表中定义唯一记录的主代理键,我使用了术语“代理”,但这可能会让人困惑,因为这不是事实表中的行的id,而是提到的查找表中的行的id。无论如何,我们需要坚持所描述的逻辑,这是无法改变的。