暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数仓建模:如何进行维度建模?

会飞的一十六 2024-09-24
129




01


什么是维度建模


维度建模是数据仓库设计中最关键的步骤之一。它将复杂的业务需求转化为结构化的、易于理解和查询的数据模型。维度模型通常采用星型模式或雪花模式,由事实表和维度表组成。

维度建模的核心概念:

    • 事实表: 包含业务过程的度量值(如销售额、数量等)。
      维度表: 包含描述业务实体的属性(如产品、客户、时间等)。
      粒度: 事实表中单条记录所代表的业务含义的细节程度。
      维度层次: 维度内部的逻辑结构,如时间维度中的年、月、日。

    维度建模步骤:

    确定业务过程: 根据需求分析,识别需要建模的核心业务过程(如销售、库存、客户服务等)。

    1. 声明粒度: 为每个业务过程确定适当的粒度级别。

    2. 识别维度: 确定描述每个业务过程的维度。

    3. 识别事实: 确定需要度量的业务指标。

    4. 设计维度表: 详细设计每个维度表,包括属性、层次结构等。

    5. 设计事实表: 设计事实表,包括外键和度量值



    02


    维度建模考虑的关键因素


    缓慢变化维度(SCD)处理:

    维度属性可能随时间变化,如客户地址、产品价格等。我们需要决定如何处理这些变化:

    • 类型1: 直接覆盖旧值

    • 类型2: 保留历史记录,创建新行

    • 类型3: 增加新列保存当前值

    示例: 对于客户维度中的会员等级,我们可能选择使用类型2 SCD,以便跟踪客户等级的变化历史。


    退化维度:

    有时,一些低基数的属性可以直接包含在事实表中,而不需要创建单独的维度表。


    示例: 订单状态(已付款、已发货、已完成等)可以作为退化维度直接存储在销售事实表中。


    桥接表:

    用于处理多对多关系或复杂层次结构。


    示例: 如果一个订单可以应用多个促销,我们可能需要一个桥接表来连接销售事实表和促销维度表。


    一致性维度:

    确保跨多个事实表的共同维度保持一致。


    示例: 产品维度应在销售、库存、采购等多个事实表中保持一致。


    日期维度的特殊处理:

    日期维度通常需要预先生成,包含丰富的属性以支持各种时间相关的分析。


    03


    维度建模应用案例


    示例:电商销售数据的维度模型

    让我们以电商公司的销售数据为例,设计一个星型模式的维度模型:

      1. 业务过程: 销售订单


      2. 粒度: 单个订单项(一个订单中的一个产品)


      3. 维度:
      - 时间维度
      - 产品维度
      - 客户维度
      - 地理维度
      - 促销维度


      4. 事实:
      - 销售金额
      - 销售数量
      - 折扣金额
      - 利润


      5. 维度表设计:


      时间维度(DIM_TIME):
      - 时间键(主键)
      - 日期
      - 年
      - 季度
      - 月
      - 周
      - 是否节假日

      产品维度(DIM_PRODUCT):
      - 产品键(主键)
      - 产品ID
      - 产品名称
      - 品类
      - 子类
      - 品牌
      - 单位成本
      - 建议零售价

      客户维度(DIM_CUSTOMER):
      - 客户键(主键)
      - 客户ID客户维度(DIM_CUSTOMER):
      - 客户键(主键)
      - 客户ID
      - 客户名称
      - 客户类型(个人/企业)
      - 注册日期
      - 年龄段
      - 性别
      - 会员等级

      地理维度(DIM_GEOGRAPHY):
      - 地理键(主键)
      - 国家
      - 省/州
      - 城市
      - 邮政编码

      促销维度(DIM_PROMOTION):
      - 促销键(主键)
      - 促销ID
      - 促销名称
      - 促销类型
      - 开始日期
      - 结束日期
      - 折扣率


      6. 事实表设计:


      销售事实表(FACT_SALES):
      - 订单项ID(主键)
      - 时间键(外键)
      - 产品键(外键)
      - 客户键(外键)
      - 地理键(外键)
      - 促销键(外键)
      - 订单ID
      - 销售金额
      - 销售数量
      - 折扣金额
      - 利润



      维度模型的SQL实现示例:

      以下是基于上述星型模式的部分SQL创建语句:

        -- 创建时间维度表
        CREATE TABLE DIM_TIME (
        time_key INT PRIMARY KEY,
        date DATE,
        year INT,
        quarter INT,
        month INT,
        week INT,
        is_holiday BOOLEAN
        );


        -- 创建产品维度表
        CREATE TABLE DIM_PRODUCT (
        product_key INT PRIMARY KEY,
        product_id VARCHAR(50),
        product_name VARCHAR(100),
        category VARCHAR(50),
        subcategory VARCHAR(50),
        brand VARCHAR(50),
        unit_cost DECIMAL(10,2),
        retail_price DECIMAL(10,2)
        );


        -- 创建客户维度表
        CREATE TABLE DIM_CUSTOMER (
        customer_key INT PRIMARY KEY,
        customer_id VARCHAR(50),
        customer_name VARCHAR(100),
        customer_type VARCHAR(20),
        registration_date DATE,
        age_group VARCHAR(20),
        gender VARCHAR(10),
        membership_level VARCHAR(20)
        );


        -- 创建销售事实表
        CREATE TABLE FACT_SALES (
        order_item_id BIGINT PRIMARY KEY,
        time_key INT,
        product_key INT,
        customer_key INT,
        geography_key INT,
        promotion_key INT,
        order_id VARCHAR(50),
        sales_amount DECIMAL(12,2),
        quantity INT,
        discount_amount DECIMAL(10,2),
        profit DECIMAL(10,2),
        FOREIGN KEY (time_key) REFERENCES DIM_TIME(time_key),
        FOREIGN KEY (product_key) REFERENCES DIM_PRODUCT(product_key),
        FOREIGN KEY (customer_key) REFERENCES DIM_CUSTOMER(customer_key),
        FOREIGN KEY (geography_key) REFERENCES DIM_GEOGRAPHY(geography_key),
        FOREIGN KEY (promotion_key) REFERENCES DIM_PROMOTION(promotion_key)
        );



        04


        小结

        维度建模的优势:

          • 直观性: 星型或雪花模型结构简单,易于业务用户理解。
            查询性能: 通过降低表的数量和预先计算聚合,提高查询速度。
            灵活性: 易于添加新的维度或修改现有维度,以适应业务变化。
            一致性: 提供了一个统一的数据视图,确保跨部门的报告一致性。

          维度建模的挑战:

            数据冗余: 维度表中可能存在数据重复,需要权衡存储成本和查询性能。
            维护复杂性: 随着维度和事实表的增加,模型可能变得复杂,需要仔细管理。
            历史数据处理: 处理缓慢变化维度可能会增加模型的复杂性和存储需求。
            粒度选择: 选择过粗的粒度可能无法满足详细分析需求,选择过细则可能影响性能。

            维度建模最佳实践:

              从高层需求出发: 始终以业务需求为导向,避免过度设计。
              保持简单: 尽可能使用星型模式,只在必要时采用雪花模式。
              标准化命名: 采用一致的命名约定,提高模型的可读性。
              考虑未来扩展: 在设计时预留扩展空间,以适应未来的需求变化。
              性能优化: 合理使用索引、分区等技术,提升查询性能。
              数据质量: 在ETL过程中加入数据质量检查,确保维度模型中的数据准确性。

              维度建模是一个迭代的过程,需要与业务用户密切合作,不断调整和优化。一个优秀的维度模型不仅能满足当前的分析需求,还能为未来的业务发展提供灵活性和可扩展性。



              往期精彩

              SQL进阶技巧:SQL中的正则表达式应用

              一种基于滑动平均的时间序列滤波方法 | Hive UDF 实现

              数仓建模:如何有效构建DWB/DWM层?| 基于案例实战分析

              数仓建模:数仓设计中的10个陷阱

              数仓规范:如何进行设计上的规范?

              数字化建设:为什么我们的数据容易被业务方质疑,而不被信任?



              文章转载自会飞的一十六,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论