关于冗余:像Amazon Redshift这样的一些数据仓库引擎允许数据压缩,这对于非规范化非常方便。假设你有一张100M记录的销售活动表,每个销售都有一个城市。在OLTP数据模型中,您将拥有 sales 和 cities 同 city_id 连接他们。在允许压缩的OLAP数据模型中,它更容易拥有 sales 表与文本 city 属性压缩。您可以在不加入表的情况下按城市计算销售额,并且您的城市值不会占用太多磁盘空间,因为它们将被编码。
sales
cities
city_id
city
有关压缩的更多信息,请参阅亚马逊文档: 选择列压缩类型
关于数据完整性:您必须设计ETL例程以最小化重复数据的可能性,并根据以下条件对重复项运行计划检查:
select count(*) from table; select count(*) from (select distinct <expression> from table);
哪个是列的列表,哪个组合应该是唯一的(您的人工主键)。
在OLAP系统(例如数据仓库)中,关键的效率需求是查询和数据检索。
因此,一些设计考虑因素是为了更快地检索信息,即使更新可能更长。
这种模型的一个例子是 星型模式 我们以一种所有数据存储在一个数据中的方式对数据进行反规范化 1,参加跳 距离。
事务等关键元素位于大表(Facts)中,外键指向维度。
维度本身较小,可能包含非规范化数据。例如一个 address 维度可以存储街道,邻域和城市数据而不将其标准化 3NF 。
address
3NF
肯定有冗余问题(你真的不需要存储 Day_of_Week 每个日期行)但它是无关紧要的(因为在这种情况下存储不是瓶颈)。
Day_of_Week
按照完整性 - 你只面对更新(F.E.一个不太现实的场景) country 改变 State_Province 在 Dim_Store ),在DWH更新是一种罕见的情况,我们允许自己效率低下。
country
State_Province
Dim_Store
此外 - 完整性不是由DB(或规范化)强制执行,而是由ETL过程的设计和实现强制执行。
阅读有关数据仓库建模的更多信息