代码之家  ›  专栏  ›  技术社区  ›  Enrique Benito Casado

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

  •  1
  • Enrique Benito Casado  · 技术社区  · 7 年前

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

    通过标准化,我们:

    • 减少数据冗余,以及
    • 保护数据完整性。

    OLTP中的不同数据库汇集在一个数据仓库中。(DWH,OLAP)。DWH是非规范化的(1FN),显然必须是这样,因为DWH的主表有数百列。

    从这个数据仓库中,我们可以构建几个数据集市,稍后我们将使用BI报告工具进行分析(Cognos、QlikView、BO.)

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

    2 回复  |  直到 7 年前
        1
  •  3
  •   Dimgold    7 年前

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

    因此,为了更快地检索信息,即使更新可能更长,也需要考虑一些设计因素。

    这种模型的一个例子是 Star-Schema 在此基础上,我们对数据进行非规范化处理,使所有数据都存储在 距离

    事务等关键元素位于大表(Facts)中,外键指向维度。

    address 维度可以存储街道、街道和城市数据,而无需将其规范化为 3NF .

    Star Schema example

    Day_of_Week 但这并不重要(因为在这种情况下,存储不是瓶颈)。

    country 更改依据 State_Province 在里面 Dim_Store

    此外,完整性不是通过数据库(或规范化)来实现的,而是通过ETL过程的设计和实现来实现的。

    Read more on Data Warehouses modeling

        2
  •  2
  •   AlexYes    7 年前

    关于冗余:一些数据仓库引擎(如Amazon Redshift)允许数据压缩,这对于非规范化非常方便。假设你有一个销售活动表,有1亿个记录,每次销售都有一个城市。在OLTP数据模型中 sales cities 具有 city_id 连接它们。在允许压缩的OLAP数据模型中 city 属性已压缩。您可以在不连接表的情况下按城市计算销售额,并且您的城市值不会占用太多磁盘空间,因为它们将被编码。

    有关压缩的更多信息,请参阅亚马逊文档: Choosing a Column Compression Type

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

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