如何处理 B.I 数据模型中的非规范化

How to handle denormalization in B.I data model

据我所知,规范化是为了避免数据库中的不一致。

通过规范化我们:

这就是大多数 OLTP 数据库采用 3NF 的原因。

来自 OLTP 的不同数据库聚集在一个数据仓库中。 (DWH,联机分析处理程序)。 DWH 是非规范化的 (1FN),很明显它必须是这样,因为 DWH 的主要 table 有数百列。

我们可以从该 DWH 构建多个数据集市,稍后我们将使用这些数据集市通过 BI 报告工具(Cognos、QlikView、BO ..)进行分析

问题是 BI 报表的数据模型没有规范化。

这不会是报告冗余和数据完整性的问题吗?

在 OLAP 系统(例如数据仓库)中,关键的效率需求在于查询和数据检索。

因此,一些设计考虑是为了更快地检索信息,即使更新时间可能更长。

这种模型的一个例子是 Star-Schema,我们以这样一种方式对数据进行非规范化,即所有数据都将存储在 1-join-hop距离。

交易等关键元素位于大table(事实),外键指向维度。

维度本身较小,可能包含非规范化数据。例如,address 维度可以存储街道、社区和城市数据,而无需将其规范化为 3NF

肯定存在冗余问题(您实际上不必为每个日期行存储 Day_of_Week)但它无关紧要(因为在这种情况下存储不是瓶颈)。

根据完整性 - 你只在更新时面对它(F.E。countryDim_Store 中每 State_Province 发生变化的不太现实的场景),并且在DWH 更新是一种罕见的情况,我们允许自己效率低下。

此外 - 完整性不是由 DB(或规范化)强制执行的,而是由 ETL 过程的设计和实现强制执行的。

Read more on Data Warehouses modeling

关于冗余:一些数据仓库引擎如 Amazon Redshift 允许数据压缩,这对于非规范化非常方便。假设您有 table 个具有 1 亿条记录的销售事件,并且每个销售都有一个城市。在 OLTP 数据模型中,您将有 salescities 以及 city_id 连接它们。在允许压缩的 OLAP 数据模型中,压缩带有文本 city 属性的 sales table 更容易。您将能够在不加入 table 的情况下按城市计算销售额,并且您的城市值不会占用太多磁盘 space,因为它们将被编码。

有关压缩的更多信息在 Amazon 文档中:Choosing a Column Compression Type

关于数据完整性:您必须设计 ETL 例程以尽量减少重复数据的可能性,并且 运行 根据如下标准定期检查重复数据:

select count(*) from table;
select count(*) from (select distinct <expression> from table);

其中是列的列表,其组合应该是唯一的(您的人工主键)。