如何处理 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。country
在 Dim_Store
中每 State_Province
发生变化的不太现实的场景),并且在DWH 更新是一种罕见的情况,我们允许自己效率低下。
此外 - 完整性不是由 DB(或规范化)强制执行的,而是由 ETL 过程的设计和实现强制执行的。
关于冗余:一些数据仓库引擎如 Amazon Redshift 允许数据压缩,这对于非规范化非常方便。假设您有 table 个具有 1 亿条记录的销售事件,并且每个销售都有一个城市。在 OLTP 数据模型中,您将有 sales
和 cities
以及 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);
其中是列的列表,其组合应该是唯一的(您的人工主键)。
据我所知,规范化是为了避免数据库中的不一致。
通过规范化我们:
- 减少数据冗余,并且
- 保护数据完整性。
这就是大多数 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。country
在 Dim_Store
中每 State_Province
发生变化的不太现实的场景),并且在DWH 更新是一种罕见的情况,我们允许自己效率低下。
此外 - 完整性不是由 DB(或规范化)强制执行的,而是由 ETL 过程的设计和实现强制执行的。
关于冗余:一些数据仓库引擎如 Amazon Redshift 允许数据压缩,这对于非规范化非常方便。假设您有 table 个具有 1 亿条记录的销售事件,并且每个销售都有一个城市。在 OLTP 数据模型中,您将有 sales
和 cities
以及 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);
其中是列的列表,其组合应该是唯一的(您的人工主键)。